转换静态函数

TL;DR:用对象交互代替静态函数。

解决的问题

  • 由于全局访问而导致的高耦合
  • 可测试性差
  • 类中的重载协议
  • 凝聚力下降
  • 相关代码异味

    代码异味 18 — 静态函数 Maxi Contieri ・ 20 年 11 月 6 日 #codenewbie #tutorial #development #coding代码异味 17 - 全局函数 Maxi Contieri ・ 20 年 11 月 5 日 #codenewbie #development #tutorial代码异味 22 - 助手 Maxi Contieri ・ 20 年 11 月 12 日 #oop #helpers #codenewbie #beginners

    步骤

  • 识别代码中使用的静态方法。
  • 用实例方法替换静态方法。
  • 通过构造函数或方法参数明确传递依赖项。
  • 重构客户端以与对象而不是静态函数进行交互。
  • 示例代码

    class CharacterUtils {
        static createOrpheus() {
            return { name: "Orpheus", role: "Musician" };
        }
    
        static createEurydice() {
            return { name: "Eurydice", role: "Wanderer" };
        }
    
        static lookBack(character) {
          if (character.name === "Orpheus") {
            return "Orpheus looks back and loses Eurydice.";
        } else if (character.name === "Eurydice") {
            return "Eurydice follows Orpheus in silence.";
        }
           return "Unknown character.";
      }
    }
    
    const orpheus = CharacterUtils.createOrpheus();
    const eurydice = CharacterUtils.createEurydice();

    // 1. Identify static methods used in your code.
    // 2. Replace static methods with instance methods.
    // 3. Pass dependencies explicitly through
    // constructors or method parameters.
    
    class Character {
        constructor(name, role, lookBackBehavior) {
            this.name = name;
            this.role = role;
            this.lookBackBehavior = lookBackBehavior;
        }
    
        lookBack() {
            return this.lookBackBehavior(this);
        }
    }
    
    // 4. Refactor clients to interact with objects 
    // instead of static functions.
    const orpheusLookBack = (character) =>
        "Orpheus looks back and loses Eurydice.";
    const eurydiceLookBack = (character) =>
        "Eurydice follows Orpheus in silence.";
    
    const orpheus = new Character("Orpheus", "Musician", orpheusLookBack);
    const eurydice = new Character("Eurydice", "Wanderer", eurydiceLookBack);

    类型

    [X] 半自动

    您可以逐步进行替换。

    安全

    这种重构通常是安全的,但您应该彻底测试您的更改。

    确保代码的其他部分不依赖于您替换的静态方法。

    为什么该代码更好?

    您的代码更易于测试,因为您可以在测试期间替换依赖项。

    对象封装行为,提高内聚力并减少协议过载。

    您可以删除隐藏的全局依赖关系,使代码更清晰,更易于理解。

    使用 AI 进行重构

    ChatGPTChatGPT克劳德克劳德困惑困惑副驾驶副驾驶双子座双子座

    标签

  • 凝聚
  • 相关重构

  • [https://dev.to/mcsee/refactoring-018-replace-singleton-18gn]
  • [https://dev.to/mcsee/refactoring-007-extract-class-18ei]
  • 用依赖注入替换全局变量
  • 参见

    耦合:唯一的软件设计问题 Maxi Contieri ・ 2 月 6 日 '21 #webdev #programming #oop #tutorial

    致谢

    该图片由Menno van der Krift在Pixabay上发布

    本文是重构系列的一部分。

    如何通过简单的重构改进代码 Maxi Contieri ・ 22 年 10 月 24 日 #webdev #beginners #programming #tutorial