我目前正在修改一个有九种不同构造函数的类。现在总体来说,我认为这个类的设计非常糟糕......所以我想知道,一个类有这么多构造函数是不是一个不好的设计。
因为我最近尝试重构和重新设计一个类(下面代码中的 "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被遵循。
最终,我还没有得出任何给定类的构造函数数量上限的结论,但我相信在这种特定情况下,我可以创建两个或三个类,每个类都有两个或三个构造函数。