2013-07-29 29 views
4

我正在使用一个类库,首先,构造函数有巨大的,传递了十五或二十个参数。这些类别中有二十多个,他们有类似的但不完全相同的论点。在一些,论点十二被省略,在其他人,它的指定,但不是必需的...对于许多具有类似但没有一致构造函数的类,最有效的设计是什么?

我想组成这些参数到对象,因为他们很多都是相互关联的,例如,名字,姓氏和电子邮件地址到一个Person对象。但是,这似乎导致了一些怪物类,因此对象的使用永远不会使用所有的参数,并且大多数使用只会使用少数几个。

现在所有的验证逻辑都在所有的构造函数中......如果我可以破解继承链中构造函数的问题,那么我可以创建一个抽象的Validate()方法,每个类都可以重写并简化设计。我检查了重构模式,但是我没有看到任何似乎直接影响这个问题的东西。

注意:这不是this的骗局 - 我说的是类似的构造函数,而不是类似的对象。我有一些抽象的基础课。

回答

3

我想撰写这些参数为对象的,因为很多都是彼此相关

这听起来像一个很好的一步给我。

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

我不明白为什么他们需要的是“怪物”类的话 - 你可以保持它们作为简单的DTO类,虽然你可能会想提供一些验证,如果指定了一个电子邮件地址,它真的一个有效的电子邮件地址等

,由此NO使用的对象永远使用所有的参数

那么,没有使用该对象曾经使用所有的属性。没关系 - 例如,DateTime的少数用途使用每一个属性。

你不必当你构建一个Person指定所有的值 - 制定出哪些是真正需要所有用途,并把它们在构造函数中...然后可以使用可选参数为参数,或者只是使Person类型变化的属性。所以,你可以有:

Person person = new Person("Jon", "Skeet", // Required parameters 
          email: "[email protected]"); // Optional 

或者:

Person person = new Person("Jon", "Skeet") { Email = "[email protected]" }; 

个人而言,我喜欢第一种方法,因为它意味着你的对象可以是不可变的,但是这取决于你如何看待可选参数。

无论哪种方式,您的其他类现在只需要采取这些更大的斑点(例如,两个Person引用和Location引用,而不是12个不同的引用)。他们可以假设所有所需的值都在更大的块中已经填充(因为它们将在构造函数中进行验证),然后他们可以检查它们碰巧需要的任何可选元素也被填充。

相关问题