我目前正在研究代表一件事的类。那件事可以有多种表现形式。任何给定的事物的表示在构造时都是固定的。取决于正在使用哪种表示取决于正在存储的数据。有多少构造函数太多?
对于(抽象)例如:
- 一种
enum
其中每个值是表示,e.g的类型;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
。这意味着我将不得不编写更多的代码,但不要太繁琐。但是,当我需要使用集合中的表示形式时,我可以看到进一步的问题,但我不知道我实际正在查看哪种表示形式。
这是一个明智的行为吗?我只是为另一个交易一个问题?有我应该看的设计模式吗?有多少构造函数太多?
编辑基于评论:
- 如果我子类的,我可能会也使用继承。
- 我有一个用于创建每个单独表示的工厂模式,它是我感兴趣的每个表示的存储。
- 不太重要,如果我做子类,我可能也会将类型保留为其重要的我正在使用的数据。
从这个很难说,但你有没有考虑继承而不是使用枚举来区分你的对象? –
一目了然,我想知道这是否可以成为工厂模式的良好用例? – Tim
我和Nathan在一起。这听起来像你需要一个基类和子类而不是一个类和一个确定哪些字段是合适的“type”属性。 –