4

我正在使用一个类库,这些类首先具有巨大的构造函数,并传递了十五或二十个参数。这些类大约有二十个,它们有相似但不完全相同的论点。在某些情况下,参数十二被省略,在其他情况下,它被指定但不是必需的......

我正在考虑将这些参数组合到对象中,因为它们中的许多是相互关联的,例如,FirstName、LastName 和电子邮件地址到 Person 对象中。但这似乎导致了几个怪物类,其中没有使用对象会使用所有参数,并且大多数使用只会使用少数几个。

现在所有的验证逻辑都在所有的构造函数中......如果我可以解决将构造函数很好地链接到继承链的问题,那么我可以创建一个每个类都可以覆盖的抽象 Validate() 方法,并简化该设计。我检查了 Refactoring to Patterns,但我没有看到任何似乎与这个问题直接相关的内容。

注意:这不是一个骗局——我说的是类似的构造函数,而不是类似的对象。我已经从 wazoo 中获得了抽象基类。

4

1 回答 1

3

我正在考虑将这些参数组合成对象,因为它们中的许多是相互关联的

这听起来对我来说是一个很好的步骤。

但这似乎导致了几个怪物类

我根本不明白为什么它们需要成为“怪物”类-您可以将它们保留为简单的 DTO 类,尽管您可能希望提供一些验证,即如果指定了电子邮件地址,它确实有效的电子邮件地址等

从而不使用该对象曾经使用所有参数

好吧,对象的使用永远不会使用所有的属性。没关系 -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 中的所有必需值都已填充(因为它们将在构造函数中进行验证),然后他们可以检查它们碰巧需要的任何可选值是否也已填充。

于 2013-07-29T18:32:22.363 回答