重构:删除标志

时间:2015-01-14 13:22:34

标签: 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 ...
    }
}

我知道使用标志参数是一个难闻的气味,我想知道如果我可以重构此方法以删除flag参数,或者如果最好保持此方法的方式。< / p>

3 个答案:

答案 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

        }
    }
相关问题