您的位置:首页 > 编程语言

NO.57 代码优化初步 2.公共规则的抽取、可配置化

2011-02-25 13:42 309 查看
有一天进行代码走查,发现这段代码出现在4个类中,一字不差——
public String changeCurrencyCode(String currencyCode){
String newCurrencyCode = currencyCode;
if("CNY".equals(currencyCode)){//人民币
newCurrencyCode = "01";
}
if("HKD".equals(currencyCode)){//港币
newCurrencyCode = "02";
}
if("USD".equals(currencyCode)){//美元
newCurrencyCode = "03";
}
……
if("NZD".equals(currencyCode)){//新西兰元
newCurrencyCode = "20";
}
return newCurrencyCode;
}

1.很明显:Ctrl+C,Ctrl+V的;类似的规则如果发生变化或者就是笔误哪个地方写错了,难道要去改4处?
2.同变量判断,却全用的if判断,把每种情况都变成最坏情况。

第1次改进:
Public Class CurrencyRules{
public static String changeCurrencyCode(String currencyCode){
String newCurrencyCode = currencyCode;
if("CNY".equals(currencyCode)){//人民币
newCurrencyCode = "01";
}else if("HKD".equals(currencyCode)){//港币
newCurrencyCode = "02";
}else if("USD".equals(currencyCode)){//美元
newCurrencyCode = "03";
}
……
}else if("NZD".equals(currencyCode)){//新西兰元
newCurrencyCode = "20";
}
return newCurrencyCode;
}
}

1.使用了else if 做了一下小小的改进
2.方法改为static了,也把它放在一个规则类里了
但是不是感觉还是很笨拙?

第2次改进:
public final static Properties currencyProp = new Properties();
static {
currencyProp.clear();
currencyProp.setProperty("CNY", "01");
currencyProp.setProperty("HKD", "02");
currencyProp.setProperty("USD", "03");
……
currencyProp.setProperty("NZD", "20");
}
public static String changeCurrencyCode(String currencyCode){
String newCurrencyCode = currencyProp.getProperty(currencyCode);
if(newCurrencyCode == null){//如果没有此映射
newCurrencyCode = currencyCode;
}
return newCurrencyCode;
}

对于这种大量的常量映射,可以使用java.util.Properties
不过修改起来还是不方便...

第3次改进: 把这些配置信息放进一个CurrencyProp.properties文件中,文件和CurrencyRules.java放在同一个目录:
CNY=01
HKD=02
USD=03
……
NZD=20

然后那个CurrencyRules中的static块就变成这个样子——
public final static Properties currencyProp = new Properties();
static {
currencyProp.load(CurrecnyRules.class.getResourceAsStream("CurrencyProp.properties"));
}
…

至此,一段公共规则被抽取出来了,并且易于配置。
不过如果希望规则修改后实时生效,可以放弃static方式而使用实例化方式,大家可以自己试着实现一下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: