Java 重构:删除标志
我有一个Java类,例如:Java 重构:删除标志,java,refactoring,Java,Refactoring,我有一个Java类,例如: public class className{ public static void methodName(Object atr1, Object atr2, Object atr3, boolean flag){ //Code here ... if(flag){ executeASingleInstruction(); } //Code here ... }
public class className{
public static void methodName(Object atr1, Object atr2, Object atr3, boolean flag){
//Code here ...
if(flag){
executeASingleInstruction();
}
//Code here ...
}
}
我知道使用flag参数是一种不好的味道,我想知道我是否可以重构此方法以删除flag参数,或者是否最好保持此方法现在的状态。不要使用静态方法,如果需要设置flag,可以使用对象属性,还可以在构造函数中提供标志
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 ...
}
}
尝试将其设置为静态
在此处输入代码
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
}
}
请注意,在代码中有更多的事情需要考虑重构,但这里我只关注布尔参数嗅觉。
您可以通过拆分方法并决定在调用位置使用哪一个新方法来重构它 这将使您在调用这两个方法时的意图更加明确,尤其是当它们具有良好的描述性名称时 如果我没记错的话,罗伯特·C·马丁的书中有一节是关于它的:在这种情况下,将有相当多的代码重复。哪个最差?重复代码或使用标志?您可以在
executeASingleInstruction()之前和之后封装代码代码>在他们自己的方法中。我将修改代码示例以进行说明。事实上,即使你没有分成两种无滞后的方法,你也应该更喜欢这种方法。谢谢你的回答。问题是atr1、atr2和atr3在调用executeASingleInstruction()前后都被修改。虽然代码可以工作,但我认为在方法中改变作为参数传递的对象是不好的。?这个选项比使用flag好吗?正如我提到的,还有其他东西需要重构。去除布尔标志只是其中的一部分,而不是最终结果,因此成本效益比较实际上应该只针对最终结果进行。在重构完成之前,受Bob叔叔的启发,我还建议您更改您的方法,以便它不会更改其参数中的状态(即避免副作用),其次,您可以将其分解为最好使用一个但最多使用两个参数的方法。
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);
}
}