我有一个Java类,如:
public class className{
public static void methodName(Object atr1, Object atr2, Object atr3, boolean flag){
//Code here ...
if(flag){
executeASingleInstruction();
}
//Code here ...
}
}
我知道使用标志参数是一个难闻的气味,我想知道如果我可以重构此方法以删除flag参数,或者如果最好保持此方法的方式。< / p>
答案 0 :(得分:2)
请注意,您的代码中还有更多需要考虑重构的内容,但在这里我只关注布尔参数的气味。
您可以通过拆分方法并决定在调用位置使用哪个新方法来重构它。
这将使您在调用任一方法时更加清晰,特别是如果它们具有漂亮的描述性名称。
如果我没记错的话,罗伯特C.马丁的书中有一节关于它:Clean Code: A Handbook of Agile Software Craftsmanship
public class className{
public static void methodName1(Object atr1, Object atr2, Object atr3){
encapsulation1(atr1, atr2, atr3);
executeASingleInstruction();
encapsulation2(atr1, atr2, atr3);
}
public static void methodName2(Object atr1, Object atr2, Object atr3){
encapsulation1(atr1, atr2, atr3);
// no execution of aforementioned instruction
encapsulation2(atr1, atr2, atr3);
}
}
答案 1 :(得分:0)
不要使用静态方法,如果需要设置标志,可以使用对象属性,也可以在构造函数中提供标志。
public class ClassName{
private boolean flag;
//getter setter
public ClassName(){}
public ClassName(final boolean flag){this.flag = flag;}
public void methodName(Object atr1, Object atr2, Object atr3){
//Code here ...
if(flag){
executeASingleInstruction();
}
//Code here ...
}
}
答案 2 :(得分:0)
尝试将其设为静态enter code here
public class className{
public static void methodName(Object atr1, Object atr2, Object atr3, boolean flag){
//Code here ...
if(flag){
executeASingleInstruction();
}
//Code here ...
}
private static void executeASingleInstruction() {
// TODO Auto-generated method stub
}
}