亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

重構 014: 去掉 IF

你最先学会的指令最好是最少用到的

TL;DR:移除所有意外的 IF 条件

要解决的问题
  • 代码重复问题
  • 可能的拼写错误及其他缺陷

相关代码异味:

代码异味 07:布尔变量的使用 使用布尔变量作为标志会暴露意外的实现细节,并在代码中引入了大量的if语句。
代码异味 36 — 别再用 switch/case 了

编程初学者课程:控制结构。资深开发者建议:避免使用这些结构。

代码异味 133 — 固定的 IF 条件硬编码是可以的,但只是一段时间内的事情levelup.gitconnected.com
隐含的 else 分支 — 代码异味 156我们第一天学编程时就接触了 if/else,但后来常常忽略了 else 分支。不过,今天我们要来谈谈编程中容易忽视的隐含 else 分支。levelup.gitconnected.com
代码异味 119 — Stairs Code:嵌套的布尔条件表示了一个业务规则。Medium 的文章
代码异味 145 — 短路技巧的滥用:不要用布尔求值作为可读性的捷径levelup.gitconnected.com(一个技术博客网址)
代码异味入门 — 与布尔值进行比较在与布尔值进行比较时,我们会执行隐式的类型转换并得到意外的结果这篇文章
代码异味 #45 — 非多态的方法如果它们做同样的事情,就应该可以互换
步骤:

接下来的步骤

  1. 寻找或创建多态层次
  2. 将每个if语句的主体移动到相应的抽象中
  3. 为抽象命名
  4. 为方法命名
  5. 用多态消息发送替换if语句
代码示例
之前
    public String handleMicrophoneState(String state) {  
        if (state.equals("off")) {  
            return "麦克风已关闭";  
        } else {  
            return "麦克风已开启";  
        }  
    }  

    /* 表示 'off' 状态的常量在整个代码中重复出现,增加了拼写错误的可能性。
    'else' 条件并没有显式检查 'on' 状态,而是隐式地处理任何其他状态;
    这种处理方式会导致在任何需要处理状态的地方重复使用 IF 条件,
    暴露了内部表示并违反了封装原则。
    该算法不便于扩展且封闭修改,这意味着添加新的状态将需要在代码的多个地方进行修改。 */
瑞典语中的“After”可以翻译为“之后”。
    // 步骤 1:找到或创建多态层次结构  

    abstract class MicrophoneState { }  
    final class On extends MicrophoneState { }  
    final class Off extends MicrophoneState { }  

    // 步骤 2:将每个 if 语句的主体移到相应的抽象类中  

    abstract class MicrophoneState {  
        public abstract String 来自if的多态方法();  
    }  

    final class On extends MicrophoneState {  
        @Override  
        public String 来自if的多态方法() {  
            return "麦克风开启";  
        }  
    }  

    final class Off extends MicrophoneState {  
        @Override  
        public String 来自if的多态方法() {  
            return "麦克风关闭";  
        }  
    }  

    // 步骤 3:命名抽象类  

    abstract class MicrophoneState {}  
    final class 开启的麦克风状态 extends MicrophoneState {}  
    final class 关闭的麦克风状态 extends MicrophoneState {}  

    // 步骤 4:命名方法  

    abstract class MicrophoneState {  
       public abstract String handle();  
    }  

    final class 开启的麦克风状态 extends MicrophoneState {  
        @Override  
        public String handle() {  
            return "麦克风开启";  
        }  
    }  

    final class 关闭的麦克风状态 extends MicrophoneState {  
        @Override  
        public String handle() {  
            return "麦克风关闭";  
        }  
    }  

    // 步骤 5:用多态消息替换 if 语句  

     public String handleMicrophoneState(String state) {  
            Map<String, MicrophoneState> states = new HashMap<>();  
            states.put("静音", new Muted());  
            states.put("录音", new Recording());  
            states.put("空闲", new Idle());  

            MicrophoneState microphoneState =   
                states.getOrDefault(state, new 空的麦克风状态());  
            return microphoneState.handle();  
        }

类型:

[X] 半自动

安全

大多数步骤都是机械化的,这是一个相当安全的代码重构。

为什么代码更好?

重构后的代码遵循开-闭原则,更倾向于利用多态,而不是通过IF语句进行条件判断。

限制条件

你只需把它用在意外的情况中的IFs上。

将业务规则保留为 “领域 if”,不要进行这种重构。

标签项

一些情况 IFs

相关重构操作
重构 013 — 删除重复代码
另见
如何摆脱烦人的 IF语句,为什么我们学的第一个编程指令却很少用
致谢

这张图片由 RenuagraPixabay 上分享。

这篇文章是重构系列文章的一部分。

如何用简单的重构让代码更棒可以让你的代码变得更好mcsee.medium.com
點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消