当前位置:  开发笔记 > 编程语言 > 正文

一个班级应该有多少个构造函数?

如何解决《一个班级应该有多少个构造函数?》经验,为你挑选了3个好方法。

我目前正在修改一个有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所需的许多方法.

最后,我还没有得出结论,任何给定类都有最大数量的构造函数,但我相信在这个特定的实例中,我可以创建两个或三个类,每个类有两个或三个构造函数.



1> sh1mmer..:

一堂课应该只做一件事,一件事.如果它有这么多的构造函数,它似乎是一个告诉故事的标志,它做了太多的事情.

使用多个构造函数来强制在各种情况下正确创建对象的实例,但9似乎很多.我怀疑那里有一个接口,可以拖出一些接口的实现.每个人都可能有一个到几个与他们的专业相关的建设者.



2> Przemek..:

尽可能少,尽可能
多.



3> Bhushan Bhan..:

9个构造函数和6000行在类中是代码气味的标志.你应该重新考虑那个班级.如果班级有很多责任,那么你应该把它们分开.如果责任相似但偏差很小,那么你应该寻求实现继承购买创建一个接口和不同的实现.


代码'闻到了什么?!' 那是一个破旧的代码扩音器!
推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有