继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

重构020——将静态方法改造成对象方法

蛊毒传说
关注TA
已关注
手记 245
粉丝 18
获赞 84
杀死静物,复活物品

简单来说:用对象之间的交互来代替静态方法。

面临的问题
  • 高耦合由于全局访问引起的问题,详见耦合全局访问
  • 难以测试
  • 类中的协议过于复杂
  • 内聚度下降
相关代码臭味:
代码异味 18 — 静态方法:小心全局访问和懒惰陷阱!
代码异味 17 — 避免使用全局函数:面向对象编程中不鼓励使用全局函数,但很多混合语言仍然支持它们。开发者经常滥用这些全局函数。
代码异味 — 辅助函数:你需要帮忙吗?你会找谁帮忙呢?

这里是步骤。

  1. 识别你代码中的静态方法。
  2. 将静态方法替换为实例方法。
  3. 通过构造函数或方法参数明确传递依赖。
  4. 重构客户端代码,让它们与对象交互,而不是直接调用静态方法。
代码示例
之前
    class CharacterUtils {  
        static createOrpheus() {  
            return { name: "Orpheus", role: "乐师" };  
        }  

        static createEurydice() {  
            return { name: "Eurydice", role: "行者" };  
        }  

        static lookBack(character) {  
          if (character.name === "Orpheus") {  
            return "俄耳浦斯回头,失去了欧律狄刻。";  
        } else if (character.name === "Eurydice") {  
            return "欧律狄刻默默地跟随俄耳浦斯。";  
        }  
           return "未知人物。";  
      }  
    }  

    const orpheus = CharacterUtils.createOrpheus();  
    const eurydice = CharacterUtils.createEurydice();
之后
    // 1. 识别代码中使用的静态方法。  
    // 2. 将静态方法替换为实例方法。  
    // 3. 通过构造函数或方法参数传递依赖。  

    class Character {  
        constructor(name, role, lookBackBehavior) {  
            this.name = name;  
            this.role = role;  
            this.lookBackBehavior = lookBackBehavior;  
        }  

        lookBack() {  
            return this.lookBackBehavior(this);  
        }  
    }  

    // 4. 重构客户端代码以与对象交互,而不是静态方法。  
    const orpheusLookBack = (character) =>  
        "Orpheus 回头,失去了 Eurydice。";  
    const eurydiceLookBack = (character) =>  
        "Eurydice 跟随 Orpheus,沉默无声。";  

    const orpheus = new Character("Orpheus", "乐手", orpheusLookBack);  
    const eurydice = new Character("Eurydice", "游荡者", eurydiceLookBack);
类型

[X] 半自动的

你可以一步步来替换。

安全

此代码重构通常很安全,但你应该彻底测试这些改动。

确保你的代码中没有其他部分依赖于被替换的静态方法。

代码为何更好?

你的代码更容易测试,因为你可以用其他东西在测试时替换依赖。

对象封装行为,增强了内聚性,减少了接口负担。

你移除了隐藏的全局依赖项,让代码变得更清晰易懂了。

一个用AI来重写的话题
没有正确的指引
具体指令

这就是话题标签。

— 连贯

相关重构操作
重构018 — 替换单例:摆脱单例的束缚levelup.gitconnected.com
重构 007 — 提取类行为 系统中行为重复出现。但我们缺少一个关键概念medium.com
  • 用依赖注入机制替换程序中的全局变量
另请参见
耦合:软件设计中的唯一问题 对所有软件失败进行根本原因分析,都会发现同一个披着不同外衣的问题源头。codeburst.io
致谢

这张图片由 Menno van der Krift 提供,来自 Pixabay

这篇文章属于重构系列文章。

如何通过简单的重构优化你的代码?简单重构让代码更佳mcsee.medium.com
打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP