我目前正在修改一个有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所需的许多方法.
最后,我还没有得出结论,任何给定类都有最大数量的构造函数,但我相信在这个特定的实例中,我可以创建两个或三个类,每个类有两个或三个构造函数.
一堂课应该只做一件事,一件事.如果它有这么多的构造函数,它似乎是一个告诉故事的标志,它做了太多的事情.
使用多个构造函数来强制在各种情况下正确创建对象的实例,但9似乎很多.我怀疑那里有一个接口,可以拖出一些接口的实现.每个人都可能有一个到几个与他们的专业相关的建设者.
尽可能少,尽可能
多.
9个构造函数和6000行在类中是代码气味的标志.你应该重新考虑那个班级.如果班级有很多责任,那么你应该把它们分开.如果责任相似但偏差很小,那么你应该寻求实现继承购买创建一个接口和不同的实现.