• 重构-改善既有代码的设计完整笔记系列之9


    • 9.1 Decompose Conditional(分解条件表达式)
    • 9.2 Consolidate Conditional Expression(合并条件表达式)
    • 9.3 Consolidate Duplicate Conditional Fragments(合并重复的条件片段)
    • 9.4 Remove Control Flag(移除控制标记)
    • 9.5 Replace Nested Conditional with Guard Clauses(以卫语句取代嵌套条件表达式)
    • 9.6 Replace Conditional with Polymorphism(以多态取代条件表达式)
    • 9.7 Introduce Null Object(引入Null对象)
    • 9.8 Introduce Assertion(引入断言)

    9.1 Decompose Conditional(分解条件表达式)

    分解为多个独立函数,根据每个小块代码的用途,为分解的新函数命名,从而更清楚的表达意图

    if (date.before (SUMMER_START) || date.after(SUMMER_END))
        charge = quantity * _winterRate + _winterServiceCharge;
    else charge = quantity * _summerRate;
    
    //转变:
    if (notSummer(date))
        charge = winterCharge(quantity);
    else 
        charge = summerCharge (quantity);
    
    private boolean notSummer(Date date) {
        return date.before (SUMMER_START) || date.after(SUMMER_END);
    }
    
    private double summerCharge(int quantity) {
        return quantity * _summerRate;
    }
    
    private double winterCharge(int quantity) {
        return quantity * _winterRate + _winterServiceCharge;
    }

    9.2 Consolidate Conditional Expression(合并条件表达式)

    一系列条件都得到相同结果。则将这些测试合并为一个条件表达式。

    double disabilityAmount() {
        if (_seniority < 2) return 0;
        if (_monthsDisabled > 12) return 0;
        if (_isPartTime) return 0;
    
    // compute the disability amount
    double disabilityAmount() {
        if (isNotEligableForDisability()) return 0;

    9.3 Consolidate Duplicate Conditional Fragments(合并重复的条件片段)

    在条件表达式的每个分支上有着相同的一段代码。将这段重复代码移到条件表达式之外.

    if (isSpecialDeal()) {
        total = price * 0.95;
        send();
    }
    else {
        total = price * 0.98;
        send();
    }
    //变为:
    if (isSpecialDeal())
        total = price * 0.95;
    else
        total = price * 0.98;
    send();


    9.4 Remove Control Flag(移除控制标记)

    //以break或return语句取代控制标记。
    
        void checkSecurity(String[] people) {
            boolean found = false;
            for (int i = 0; i < people.length; i++) {
                if (!found) {
                    if (people[i].equals("Don")) {
                        sendAlert();
                        found = true;
                    }
                    if (people[i].equals("John")) {
                        sendAlert();
                        found = true;
                    }
                }
            }
        }
    //替换:
        void checkSecurity(String[] people) {
            for (int i = 0; i < people.length; i++) {
                if (people[i].equals("Don")) {
                    sendAlert();
                    break;
                }
                if (people[i].equals("John")) {
                    sendAlert();
                    break;
                }
            }
        }
    
    //另外,return也需要合理使用
        void checkSecurity(String[] people) {
            String found = "";
    
            for (int i = 0; i < people.length; i++) {
                if (found.equals("")) {
                    if (people[i].equals("Don")) {
                        sendAlert();
                        found = "Don";
                    }
                    if (people[i].equals("John")) {
                        sendAlert();
                        found = "John";
                    }
                }
            }
            someLaterCode(found);
        }
    //改成:
        String foundMiscreant(String[] people) {
            for (int i = 0; i < people.length; i++) {
                if (people[i].equals("Don")) {
                    sendAlert();
                    return "Don";
                }
                if (people[i].equals("John")) {
                    sendAlert();
                    return "John";
                }
            }
            return "";
        }

    9.5 Replace Nested Conditional with Guard Clauses(以卫语句取代嵌套条件表达式)

        double getPayAmount() {
            double result;
            if (_isDead)
                result = deadAmount();
            else {
                if (_isSeparated)
                    result = separatedAmount();
                else {
                    if (_isRetired)
                        result = retiredAmount();
                    else
                        result = normalPayAmount();
    
                }
                
            }
            return result;
        }
    //改成
        double getPayAmount() {
            double result;
            if (_isDead)
                return deadAmount();
            if (_isSeparated)
                return separatedAmount();
            if (_isRetired)
                result = retiredAmount();
            else
                result = normalPayAmount();
            return result;
        }

    9.6 Replace Conditional with Polymorphism(以多态取代条件表达式)

    一个条件表达式,它根据对象类型的丌同而选择丌同的行为。
    将这个条件表达式的每个分支放进一个子类的覆写函数中,然后将原始函数声明为抽象函数。
    比如将以下条件都转换成子类

        double getSpeed() {
            switch (_type) {
            case EUROPEAN:
                return getBaseSpeed();
            case AFRICAN:
                return getBaseSpeed() - getLoadFactor() * _numberOfCoconuts;
            case NORWEGIAN_BLUE:
                return (_isNailed) ? 0 : getBaseSpeed(_voltage);
            }
            throw new RuntimeException("Should be unreachable");
        }

    9.7 Introduce Null Object(引入Null对象)

    9.8 Introduce Assertion(引入断言)

    某一段代码需要对程序状态做出某种假设。以断言明确表现这种假设。

    使用断言明确标明对输入条件的严格要求和限制;
    断言可以辅助交流和调试。

  • 相关阅读:
    Mysql创建nextval函数
    宝塔配置tomcat的配置
    小程序获取授权信息
    pycharm 2017新建文件添加编码方式等
    Linux下利用expect,不用交互模式,直接登陆远程主机
    linux文件权限解析(摘)
    linux环境下根据文件的某一列进行去重
    oracle查询用户权限及角色(摘)
    插入排序-python实现
    css清除浮动方法
  • 原文地址:https://www.cnblogs.com/starcrm/p/12527642.html
Copyright © 2020-2023  润新知