【问题标题】:How do you fight growing parameter list in class hierarchy?你如何对抗类层次结构中不断增长的参数列表?
【发布时间】:2009-08-18 10:56:13
【问题描述】:

我有一种强烈的感觉,我不知道在这种情况下使用什么模式或特定的语言技术。
那么,问题本身就是如何在支持 OOP 的语言中管理类层次结构中不断增长的参数列表?我的意思是,如果对于层次结构中的根类,比如说 3 或 4 个参数,那么在它的派生类中,你需要调用基本构造函数并为对象的派生部分传递额外的参数,依此类推......参数列表变为即使您的继承深度超过两个,也是巨大的。
我很确定许多 SOwers 都面临过这个问题。我对如何解决它感兴趣。非常感谢。

【问题讨论】:

标签: oop constructor long-parameter-list


【解决方案1】:

具有长参数列表的构造函数表明您的类正在尝试做太多事情。解决该问题的一种方法是将其分解,并使用“协调器”类来管理各个部分。具有与其超类显着不同的构造函数参数列表的子类是类做得太多的另一个例子。如果一个子类真正是一个超类,那么它不应该需要更多的数据来完成它的工作。

也就是说,偶尔会有一个类需要处理大量相关对象的情况。在这种情况下,我会创建一个新对象来保存相关参数。

【讨论】:

    【解决方案2】:

    替代方案:

    • 使用 setter 注入代替构造函数注入
    • 将参数封装在单独的容器类中,然后在构造函数之间传递。

    【讨论】:

    • 我同意你的第一点,但不是第二点。封装参数只是将问题转移到其他地方?这样做有什么价值?
    • 因为您不必更新层次结构中每个类的构造函数签名。
    • 而且在创建参数类时你可以看到,你真的用参数对象隐藏在它后面的东西来初始化你的对象吗(我的意思是s abstraction). If you initializeftp class with login, password, port and some more things that you decided to wrap with Credentials class its ok,它会让你的读者看到这需要登录名、密码、端口等凭据。
    【解决方案3】:

    不要使用构造函数一次性初始化整个对象。只有它初始化那些(1)对象的存在绝对需要和(2)必须在创建时立即完成的事情。这将大大减少您必须传递的参数数量(可能为零)。

    对于像 SalariedEmployee >> Employee >> Person 这样的典型层次结构,您将拥有 getter 和 setter 来检索和更改对象的各种属性。

    【讨论】:

      【解决方案4】:

      查看代码将帮助我提出解决方案..

      但是long parameter lists 是一种代码气味,所以我会仔细看看需要这个的设计。建议的重构来解决这个问题是

      但是如果你发现你绝对需要这个和一个长的继承链,考虑使用一个像对象一样的哈希/属性包作为唯一的参数

      public MyClass(PropertyBag configSettings) 
      {
        // each class extracts properties it needs and applies them
        m_Setting1 = configSettings["Setting1"]; 
      }
      

      【讨论】:

        【解决方案5】:

        可能性:

        • 如果您的班级需要预先提供如此多的状态,也许他们做得太多了?旨在遵守Single Responsibility Principle
        • 也许其中一些参数在逻辑上应该存在于它们自己的value object 中,而value object 本身是作为参数传入的?
        • 对于构造确实很复杂的类,考虑使用builderfactory 模式以可读的方式实例化这些对象 - 与方法名称不同,构造函数参数缺乏自我记录的能力。

        【讨论】:

          【解决方案6】:

          另一个提示:保持你的类层次结构浅,更喜欢组合而不是继承。这样你的构造函数参数列表就会很短。

          【讨论】:

            猜你喜欢
            • 2020-06-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多