你如何在类层次结构中对抗增长的参数列表?

时间:2009-08-18 10:56:13

标签: oop constructor long-parameter-list

我有一种强烈的感觉,我不知道在这种情况下使用什么样的模式或特定的语言技术 那么,问题本身就是如何在具有OOP支持的语言中管理类层次结构中不断增长的参数列表?我的意思是,对于你所拥有的层次结构中的根类,让我们说3或4个参数,然后在它的派生类中,你需要调用基础构造函数并为对象的派生部分传递附加参数,等等......参数列表成为即使你的遗传深度超过两个,也是巨大的。
我很确定很多SOwers都遇到了这个问题。我对如何解决它感兴趣。非常感谢提前。

6 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

备选方案:

  • 使用setter注入而不是构造函数注入
  • 将参数封装在单独的容器类中,并在构造函数之间传递它。

答案 2 :(得分:1)

的可能性:

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

查看代码可以帮助我建议解决方案..

然而long parameter lists是代码味道,所以我要仔细看看需要这个的设计。建议的重构是

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

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

答案 5 :(得分:0)

另一个提示:保持您的类层次结构浅,更喜欢组合继承。这样你的构造函数参数列表将保持简短。