Java最喜欢的重构技术

时间:2011-08-24 11:16:15

标签: java refactoring

我在其他人的Java代码中找到了一些常见的代码模式,可以从一些简单的重构中受益。

你的宠物代码模式讨厌和修复了什么(以及不明显的原因)?

我已经开始自由地回答几个我自己的宠物讨厌了。

6 个答案:

答案 0 :(得分:17)

我最喜欢的重构之一是使用策略模式而不是长if-else / switch语句。 例如

String chooser = ""//some sting

if(testCond1(chooser)){
doSomething1();
} else if(testCond2(chooser)){
doSomethingElse2();
} else if(testCond2(chooser)){
doSomethingElse3();
} else if(testCond4(chooser)){
doSomethingElse4();
} else if(testCond5(chooser)){
doSomethingElse5();
} else if(testCond6(chooser)){
doSomethingElse6();
}

可以更改为:

    Map<String, Handler> handlers = new HashMap<String, Handler>();

handlers.get(chooser).handle();

然后我们定义一个Handler接口

interface Handler{
    handle();
}

对于每个条件,我们都有一个实现处理程序的新类。

class CondOne implements Handler{
    handle(){
        //some code
    }
}

赞成。面向对象的approch,代码更容易维护。在不改变代码的重要部分的情况下添加新条件也很容易。

答案 1 :(得分:7)

boolean someMethod() {
    if (<some test>) {
        return true;
    } else {
        return false;
    }
}

替换为

boolean someMethod() {
    return <some test>;
}

指导原则/模式:

  • 代码越少越好
  • 冗余代码不好

答案 2 :(得分:7)

void someMethod(SomeClass param) {
    if (param != null) { // or some other test
        // Rest of method code
    }
}

替换为:

void someMethod(SomeClass param) {
    if (param == null) { // or some other test
        return; // or throw exception if test expected to "always" pass
    }
    // Rest of method code
}

指导原则/模式:

  • 减少压痕是好的
  • 如果块好的话会更短
  • 参数检查应尽早完成并退出问题,而不是允许代码在传递时执行

答案 3 :(得分:3)

if (<some test>) {
    return someObject;
} else {
    return someOtherObject;
}

替换为:

if (<some test>) {
    return someObject;
}

return someOtherObject;

或更简洁,如果线条不太长(即您没有在线创建对象):

return <some test> ? someObject : someOtherObject;

指导原则/模式:

  • 代码越少越好
  • 冗余代码很糟糕 - 当if返回时,不需要“else”
  • 减少压痕是好的

答案 4 :(得分:1)

我喜欢枚举,并尝试使用大量字符串检查来重构代码。

if (str.equals("A") {...}
else if (str.equals("B") {...}
else if (str.equals("C") {...}

switch (str){
 case A: ... ; break;
 case B: ... ; break;
 case C: ... ; break;

}

答案 5 :(得分:0)

通常我会看到这样的代码,不应该比较引用,而是内容。

if (someObject == anotherObject) {
   doSomething();
}

所以我用它替换它(如果需要覆盖equals()和hashCode()):

if (someObject.equals(anotherObject))  {
   doSomething();
}