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;
}
}
- Java重构示例二
- Java重构示例一
- Java重构示例四
- Java重构示例三
- Java重构示例五
- Wordpress 插件示例之二-对示例一的重构
- LAMP开发精要(4):Wordpress 插件示例之二-对示例一的重构
- java HashSet去重示例
- 重构示例_01
- Java设计模式 -- 基本原则(重构示例)
- 重拾Java(二)
- java 跳转与重定向方法示例
- 重学java(二)
- 【重拾Effective Java】二
- java设计模式示例二
- 《重构》读书笔记(二)
- 重构(二)
- 二、重构原则
- 以编程方式使用 Word 中的内置对话框
- Fedora17设置终端快捷键 和 桌面快捷方式
- Linux下的Eclipse 3.7 紧凑布局样式美化
- JAVA获取当前工程路径(非web工程)
- Java重构示例一
- Java重构示例二
- difference between java, c++
- Java重构示例四
- Java重构示例三
- 客户端 用不用 bind 的区别
- Java重构示例五
- C++之四书五经(上) <转>
- Hadoop中文件读写(Java) <转>
- Hadoop单机环境配置 <转>