我正在使用一个类库,这些类首先包含巨大的构造函数,并传递了15或20个参数。这些类中有二十个左右,它们有相似但不完全相同的参数。在某些情况下,参数12被省略,在其他情况下,它被指定但不是必需的......
我正在考虑将这些参数组合到对象中,因为它们中的许多都是相互关联的,例如FirstName,LastName和Email Address到Person对象。但这似乎导致了几个怪物类,其中对象的使用没有使用所有参数,并且大多数使用将只使用少数。
现在所有的验证逻辑都在所有的构造函数中......如果我能解决在继承链中很好地链接构造函数的问题,那么我可以创建一个抽象的Validate()方法,每个类都可以覆盖,并简化设计。我检查了Refactoring to Patterns,但我没有看到任何似乎直接影响这个问题的内容。
注意:这不是this的欺骗 - 我在谈论类似的构造函数,而不是类似的对象。我有wazoo的抽象基类。
答案 0 :(得分:3)
我正在考虑将这些参数组合成对象,因为它们中的许多都是相互关联的
这听起来对我来说是一个很好的一步。
但这似乎导致了几个怪物类
我不明白为什么他们需要成为“怪物”类 - 你可以把它们保持为简单的DTO类,尽管你可能想要提供一些验证,如果指定了一个电子邮件地址,它真的< em>是有效的电子邮件地址等。
因此,对象的使用不会使用所有参数
好吧,没有使用过该对象的所有属性。这没关系 - 例如,DateTime
几乎没有使用每一个属性。
在构造Person
时,您不必指定所有值 - 找出所有使用的确实需要的值,并将它们放在构造函数中......然后使用可选参数作为参数,或者只使用属性使Person
类型变为可变。所以你可以:
Person person = new Person("Jon", "Skeet", // Required parameters
email: "skeet@pobox.com"); // Optional
或者:
Person person = new Person("Jon", "Skeet") { Email = "skeet@pobox.com" };
我个人喜欢第一种方法,因为它意味着你的对象可以是不可变的,但这取决于你对可选参数的看法。
无论哪种方式,你的其他类现在只需要采用这些更大的blob(例如两个Person
引用和一个Location
引用,而不是12个不同的引用。他们可以假设更大blob中的所有必需值已经填充(因为它们将在构造函数中验证)然后他们可以检查他们碰巧需要的任何可选的值也是填写。