我目前正在修改一个具有 9 个不同构造函数的类。现在总的来说,我认为这个类的设计非常糟糕......所以我想知道一个拥有这么多构造函数的类是否是糟糕的设计。
出现了一个问题,因为我最近向这个类添加了两个构造函数,试图重构和重新设计一个类(下面代码中的 SomeManager),以便它是可单元测试的,并且不依赖于它的每个方法都是静态的。但是,由于其他构造函数被方便地隐藏在类开头下方大约一百行的位置,所以当我添加构造函数时,我没有发现它们。
现在发生的事情是调用这些其他构造函数的代码依赖于已经实例化的 SomeManager 类,因为它曾经是静态的......结果是一个空引用异常。
所以我的问题是如何解决这个问题?通过尝试减少构造函数的数量?通过使所有现有的构造函数采用 ISomeManager 参数?
当然,一个类不需要 9 个构造函数!...哦,最重要的是,这个文件中有 6000 行代码!
这是我在上面谈论的构造函数的审查表示:
public MyManager()
: this(new SomeManager()){} //this one I added
public MyManager(ISomeManager someManager) //this one I added
{
this.someManager = someManager;
}
public MyManager(int id)
: this(GetSomeClass(id)) {}
public MyManager(SomeClass someClass)
: this(someClass, DateTime.Now){}
public MyManager(SomeClass someClass, DateTime someDate)
{
if (someClass != null)
myHelper = new MyHelper(someOtherClass, someDate, "some param");
}
public MyManager(SomeOtherClass someOtherClass)
: this(someOtherClass, DateTime.Now){}
public MyManager(SomeOtherClass someOtherClass, DateTime someDate)
{
myHelper = new MyHelper(someOtherClass, someDate, "some param");
}
public MyManager(YetAnotherClass yetAnotherClass)
: this(yetAnotherClass, DateTime.Now){}
public MyManager(YetAnotherClass yetAnotherClass, DateTime someDate)
{
myHelper = new MyHelper(yetAnotherClass, someDate, "some param");
}
更新:
感谢大家的回复……他们非常棒!
只是想我会更新一下我最终做了什么。
为了解决空引用异常问题,我修改了其他构造函数以采用 ISomeManager。
目前,在允许重构这个特定类时,我束手无策,所以当我有空闲时间时,我会将它标记为我的待办事项列表中要重新设计的类。目前,我很高兴能够重构 SomeManager 类……它和 MyManager 类一样庞大而可怕。
当我开始重新设计 MyManager 时,我将寻找一种方法将功能提取到两个或三个不同的类中......或者确保遵循 SRP 需要多少。
最终,我还没有得出任何给定类都有最大数量的构造函数的结论,但我相信在这个特定的实例中,我可以创建两个或三个类,每个类都有两个或三个构造函数。