本文通过Java示例代码片段展示了常用重构原则和技巧,供初级开发人员参考。精致的代码能够清楚传达作者的意图,精致的代码是最好的注释,精致的代码非常容易维护和扩展。程序员阅读精致的代码如同大众欣赏优美的散文一样享受。
6 满足条件立即跳出循环
6.1 重构前
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