有多少构造函数太多了?

时间:2015-10-19 23:00:56

标签: c# class

我目前正致力于一个代表一件事的课程。这一件事可以有多种表现形式。构造时,该事物的任何给定实例的表示都是固定的。取决于正在使用的表示,取决于存储的数据。

对于(一个抽象的)例子:

  • 一个enum,其中每个值都是一个表示的类型,例如; AlphaBetaCharlie
  • 所有三种表示形式都有IdName字段。
  • 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, ... }
}

我明白为什么我最终会来到这里,并且在某些方面这种方法是有道理的;该类代表一种类型的东西,它有很多共享功能。

然而,由于其他一些原因,它也存在问题:

  • 每个表示最终都有自己的专用构造函数,通常涉及重复代码。我试图通过链接构造函数来改进这一点,但后来我结束了长链函数。
  • 对于给定的对象,不保证将设置所有属性,这会在我再次处理数据时导致问题。

我正在考虑将这一切重构为一组子类,例如: RepresentationAlphaRepresentationBetaRepresentationCharlie。这意味着我将不得不写更多的代码,但没有什么太繁重。我可以在线下看到问题,但是当我需要使用集合中的表示时,我不知道我实际上在看哪个表示。

这是一个明智的行动吗?我只是为另一个问题换一个问题吗?我应该看一下设计模式吗?有多少构造函数太多了?

根据评论进行修改:

  • 如果我是子类,我可能也会使用继承。
  • 我有一个工厂模式用于创建每个单独的表示,它是我感兴趣的每个表示的存储。
  • 不太重要,如果我做子类,我可能也会将类型作为我正在使用的数据的重要部分。

2 个答案:

答案 0 :(得分:1)

几个构造函数没有什么问题。如果班级实际上代表"一件事"单班有意义。

要避免使用非初始化字段,请考虑从所有其他构造函数调用的共享(可能是private)构造函数来初始化公共字段。

继承通常会导致更多的问题(例如,如果涉及JSON序列化),所以我要等到你必须拥有它,并且只在那时考虑添加继承。< / p>

另一方面,如果&#34;一件事&#34;只是松散定义,类型在行为上有很大的不同 - 尝试继承,但也看看非相关类的通用接口是否有效。

答案 1 :(得分:1)

拥有不超过一个构造函数是一个很大的优势。

一旦你失去了两个人的优势,每个人的下降都会减少。对于某些类别来说,有六个或更多的并不罕见,每个过载都可以明确证明其合理性。

  

我试图通过链接构造函数来改善这一点,但后来我终结了长链函数。

这不是一件坏事,因为链条的每一步都应该足够明显地单独考虑。如果它不是,那么这就是一个更大问题的迹象,这可能表明它不是两个很多构造函数的问题,因为太少的类,它们应该被分离出来完全进入不同的类(尽管可能共享一个共同基础或实现一个公共接口)。