2

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

4

6 回答 6

4

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

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

于 2009-08-18T11:03:26.303 回答
2

备择方案:

  • 使用 setter 注入代替构造函数注入
  • 将参数封装在单独的容器类中,然后在构造函数之间传递。
于 2009-08-18T10:59:53.783 回答
1

可能性:

  • 如果您的班级需要预先提供如此多的状态,也许他们做得太多了?旨在坚持单一职责原则
  • 也许其中一些参数在逻辑上应该存在于它们自己的值对象中,该值对象本身作为参数传入?
  • 对于构造确实很复杂的类,考虑使用构建器工厂模式以可读的方式实例化这些对象 - 与方法名称不同,构造器参数缺乏自我记录的能力。
于 2009-08-18T11:03:27.660 回答
1

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

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

于 2009-08-18T11:03:29.720 回答
1

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

然而长参数列表是一种代码气味,所以我会仔细看看需要这个的设计。建议的重构来解决这个问题

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

public MyClass(PropertyBag configSettings) 
{
  // each class extracts properties it needs and applies them
  m_Setting1 = configSettings["Setting1"]; 
}
于 2009-08-18T11:07:31.660 回答
0

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

于 2009-08-18T11:14:38.293 回答