我目前正致力于一个代表一件事的课程。这一件事可以有多种表现形式。构造时,该事物的任何给定实例的表示都是固定的。取决于正在使用的表示,取决于存储的数据。
对于(一个抽象的)例子:
enum
,其中每个值都是一个表示的类型,例如; Alpha
,Beta
,Charlie
。Id
和Name
字段。Beta
也有一个Attributes
字段。 Charlie
也有一个ChildId
字段。IsValidFor(...)
,TriggeredBy(...)
。这使我有一个有三个专门构造函数的类,例如:
public enum RepresentationType { Alpha, Beta, Charlie }
public class Representation
{
...
public Representation(Guid id, String name) { Type = RepresentationType.Alpha, ... }
public Representation(Guid id, String name, String attributes) { Type = RepresentationType.Beta, ... }
public Representation(Guid id, String name, Guid childId) { Type = RepresentationType.Charlie, ... }
}
我明白为什么我最终会来到这里,并且在某些方面这种方法是有道理的;该类代表一种类型的东西,它有很多共享功能。
然而,由于其他一些原因,它也存在问题:
我正在考虑将这一切重构为一组子类,例如: RepresentationAlpha
,RepresentationBeta
,RepresentationCharlie
。这意味着我将不得不写更多的代码,但没有什么太繁重。我可以在线下看到问题,但是当我需要使用集合中的表示时,我不知道我实际上在看哪个表示。
这是一个明智的行动吗?我只是为另一个问题换一个问题吗?我应该看一下设计模式吗?有多少构造函数太多了?
根据评论进行修改:
答案 0 :(得分:1)
几个构造函数没有什么问题。如果班级实际上代表"一件事"单班有意义。
要避免使用非初始化字段,请考虑从所有其他构造函数调用的共享(可能是private
)构造函数来初始化公共字段。
继承通常会导致更多的问题(例如,如果涉及JSON序列化),所以我要等到你必须拥有它,并且只在那时考虑添加继承。< / p>
另一方面,如果&#34;一件事&#34;只是松散定义,类型在行为上有很大的不同 - 尝试继承,但也看看非相关类的通用接口是否有效。
答案 1 :(得分:1)
拥有不超过一个构造函数是一个很大的优势。
一旦你失去了两个人的优势,每个人的下降都会减少。对于某些类别来说,有六个或更多的并不罕见,每个过载都可以明确证明其合理性。
我试图通过链接构造函数来改善这一点,但后来我终结了长链函数。
这不是一件坏事,因为链条的每一步都应该足够明显地单独考虑。如果它不是,那么这就是一个更大问题的迹象,这可能表明它不是两个很多构造函数的问题,因为太少的类,它们应该被分离出来完全进入不同的类(尽管可能共享一个共同基础或实现一个公共接口)。