我在其他人的Java代码中找到了一些常见的代码模式,可以从一些简单的重构中受益。
你的宠物代码模式讨厌和修复了什么(以及不明显的原因)?
我已经开始自由地回答几个我自己的宠物讨厌了。
答案 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;
指导原则/模式:
答案 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();
}