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 ... }

我有一个Java类,例如:

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);
    }
}