Java重构示例二

来源:互联网 发布:农村淘宝佣金扣除查看 编辑:程序博客网 时间:2024/05/14 17:41

Java重构示例二
本文通过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;
    }
 }


原创粉丝点击