软件设计重构秘笈16式-15封装条件

81 阅读2分钟

软件设计重构秘笈16式-15封装条件

概念

本文中的“封装条件”是指条件关系比较复杂时,代码的可读性会比较差, 所以这时我们应当根据条件表达式是否需要参数将条件表达式提取成可读性更好的属性或者方法, 如果条件表达式不需要参数则可以提取成属性,如果条件表达式需要参数则可以提取成方法。

意图

封装条件指条件关系比较复杂时,解决代码的可读性会比较差。 如下代码所示,PerformCoolFunction里面的if条件判断比较复杂,看起来有点杂乱,所以就把它提出来。

案例

public class RemoteControl {

    private String[] functions;

    private String name;

    private int createYear;

    public String performCoolFunction(String buttonPressed) {
        // Determine if we are controlling some extra function
        // that requires special conditions
        if (getFunctions().length > 1 && name == "RCA" && getCreateYear() > 2)
            return "doSomething";
        else return "";
    }

    public String[] getFunctions() {
        return functions;
    }

    public void setFunctions(String[] functions) {
        this.functions = functions;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getCreateYear() {
        return createYear;
    }

    public void setCreateYear(int createYear) {
        this.createYear = createYear;
    }
}

重构

如下代码所示,我们把条件表达式封装成hasExtraFunctions属性,这样先前的条件判断就成了if (hasExtraFunctions) , 所以这样就在很大程度上提高了可读性。

public class RemoteControl {

    private String[] functions;

    private String name;

    private int createYear;

    public String performCoolFunction(String buttonPressed) {
        // Determine if we are controlling some extra function
        // that requires special conditions
        if (hasExtraFunctions())
            return "doSomething";
        else return "";
    }

    public boolean hasExtraFunctions() {
        if (getFunctions().length > 1 && name == "RCA" && getCreateYear() > 2) {
            return Boolean.TRUE;
        } else {
            return Boolean.FALSE;
        }
    }

    public String[] getFunctions() {
        return functions;
    }

    public void setFunctions(String[] functions) {
        this.functions = functions;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getCreateYear() {
        return createYear;
    }

    public void setCreateYear(int createYear) {
        this.createYear = createYear;
    }
}

总结

这个重构在很大程度上能改善代码的可读性,尤其是在一个逻辑很复杂的应用中,把这些条件判断封装成一个有意义的名字, 这样很复杂的逻辑也会立刻变得简单起来。