Java重构示例二(转载)
本文通过Java示例代码片段展示了常用重构原则和技巧,供初级开发人员参考。精致的代码能够清楚传达作者的意图,精致的代码是最好的注释,精致的代码非常容易维护和扩展。程序员阅读精致的代码如同大众欣赏优美的散文一样享受。
?
public?boolean?contain(int?year,?Month?month,?int?day)?{
??boolean?found?=?false;
??for?(IPolyDate?date?:?dateList)?{
????if?(date.same(year,?month.getMonth(),?day))?{
??????found?=?true;
??????break;
????}
??}
?
??return?found;
}
?
6.2?重构后?
public?boolean?contain(int?year,?Month?month,?int?day)?{
??for?(IPolyDate?date?:?dateList)?{
????if?(date.same(year,?month.getMonth(),?day))?{
??????return?true;
????}
??}
?
??return?false;
}
?
7?使用表结构分离公共逻辑,避免重复(坚持DRY原则) 7.1?重构前?
public?void?testGetIntPart()?throws?Exception?{
??assertEquals("0",?digitTransform.getIntPart("0.01");
??assertEquals("1",?digitTransform.getIntPart("1.2");
??assertEquals("1234",?digitTransform.getIntPart("1234");
??assertEquals("1",?digitTransform.getIntPart("1.01");
??assertEquals("0",?digitTransform.getIntPart("0.01");
??assertEquals("11111",?digitTransform.getIntPart("11111");
??assertEquals("1000",?digitTransform.getIntPart("1000.11");
}
?
7.2?重构后?
public?void?testGetIntPart()?throws?Exception?{
String[][]?cases?=?new?String[][]?{?{?"0.01",?"0"?},?{?"1.2",?"1"?},
{?"1234",?"1234"?},?{?"1.01",?"1"?},?{?"0",?"0"?},
{?"11111",?"11111"?},?{?"1000.11",?"1000"?}?};
?
for?(int?i?=?0,?len?=?cases.length;?i?<?len;?i++)?{
assertEquals(cases[i][1],?digitTransform.getIntPart(cases[i][0]));
}
}
?
8?分离变化参数,使用格式化方法 8.1?重构前?
public?class?ExceedMaxWeekIndexOfMonthException?extends
IndexOutOfBoundsException?{
?
??private?static?final?long?serialVersionUID?=?1L;
?
??public?ExceedMaxWeekIndexOfMonthException(String?message)?{
????super(message);
??}
?
}
?
8.2?重构后?
public?class?ExceedMaxWeekIndexOfMonthException?extends
IndexOutOfBoundsException?{
?
??private?static?final?long?serialVersionUID?=?1L;
?
??public?ExceedMaxWeekIndexOfMonthException(int?index,?int?maxCountOfWeekDay,
Month?month)?{
????super(formatMessage(index,?maxCountOfWeekDay,?month));
??}
?
??private?static?String?formatMessage(int?index,?int?maxCountOfWeekDay,
Month?month)?{
????return?"Arguement?index["?+?index?+?"]?exceeds?max?week?index["
+?maxCountOfWeekDay?+?"]?of?month["?+?month.toString()?+?"].";
??}
?
}
?
9?使用方法抽取公共逻辑 9.1?重构前??
public?int?getYear()?{
??Calendar?date?=?this.getCalendarDate();
?
??return?date.get(Calendar.YEAR);
}
?
public?int?getMonth()?{
??Calendar?date?=?this.getCalendarDate();
?
??return?date.get(Calendar.MONTH);
}
?
public?int?getDay()?{
??Calendar?date?=?this.getCalendarDate();
?
??return?date.get(Calendar.DAY_OF_MONTH);
}
?
public?int?getHour()?{
??Calendar?date?=?this.getCalendarDate();
?
??return?date.get(Calendar.HOUR_OF_DAY);
}
?
public?int?getMinute()?{
??Calendar?date?=?this.getCalendarDate();
?
??return?date.get(Calendar.MINUTE);
}
?
public?int?getSecond()?{
??Calendar?date?=?this.getCalendarDate();
?
??return?date.get(Calendar.SECOND);
}
?
public?int?getMillisSecond()?{
??Calendar?date?=?this.getCalendarDate();
?
??return?date.get(Calendar.MILLISECOND);
??}
?
9.2?重构后?
??private?int?get(int?field)?{
????Calendar?date?=?this.getCalendarDate();
?
????return?date.get(field);
??}
?
??public?int?getYear()?{
????return?this.get(Calendar.YEAR);
??}
?
??public?int?getMonth()?{
????return?this.get(Calendar.MONTH);
??}
?
??public?int?getDay()?{
????return?this.get(Calendar.DAY_OF_MONTH);
??}
?
??public?int?getHour()?{
????return?this.get(Calendar.HOUR_OF_DAY);
??}
?
??public?int?getMinute()?{
????return?this.get(Calendar.MINUTE);
??}
?
??public?int?getSecond()?{
????return?this.get(Calendar.SECOND);
??}
?
??public?int?getMillisSecond()?{
????return?this.get(Calendar.MILLISECOND);
??}
?
10?尽量使用已有的Java?API 10.1?重构前?
protected?String[]?getConfigLocations()?{
????String[]?baseCfgs?=?this.getBaseCfgs();
????String[]?extra?=?this.getExtraCfgs();
????if?(extra?!=?null?&&?extra.length?>?0)?{
??????int?baseCfgLen?=?baseCfgs.length;
??????int?extraLen?=?extra.length;
??????String[]?cfgLocations?=?new?String[baseCfgLen?+?extraLen];
??????for(int?i?=?0;?i?<?baseCfgLen;?i++){
????????cfgLocations[i]?=?baseCfgs[i];
??????}
?
??????for(int?i?=?0;?i?<?extraLen;?i++){
????????cfgLocations[baseCfgLen?+?i]?=?extra[i];
??????}
?????
??????return?cfgLocations;
????}?else?{
??????return?baseCfgs;
????}
?}
?
10.2?重构后?
??protected?String[]?getConfigLocations()?{
????String[]?baseCfgs?=?this.getBaseCfgs();
????String[]?extra?=?this.getExtraCfgs();
if?(extra?!=?null?&&?extra.length?>?0)?{
??????int?baseCfgLen?=?baseCfgs.length;
??????int?extraLen?=?extra.length;
??????String[]?cfgLocations?=?new?String[baseCfgLen?+?extraLen;
??????System.arraycopy(baseCfgs,?0,?cfgLocations,?0,?baseCfgLen);
??????System.arraycopy(extra,?0,?cfgLocations,?baseCfgLen,
extraLen;
?????
??????return?cfgLocations;
????}?else?{
??????return?baseCfgs;
????}
?}
?
?
<!--EndFragment-->
?
源地址:http://passport.baidu.com/?business&aid=6&un=%B2%DC%CB%C9%C7%E0#7
