重构:删除标志

Refactor: Removing flags

我有一个 Java class 例如:

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{

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

尽量让它静态化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

        }
    }

请注意,在您的代码中还有更多需要考虑重构的东西,但这里我将只关注布尔参数 smell。

您可以通过拆分方法并决定在调用位置使用哪个新方法来重构它。

这将使您在调用任一方法时的意图更加清晰,尤其是当它们具有漂亮的描述性名称时。

如果我没记错的话,Robert C. Martin 的书中有一节是关于它的: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);
    }
}