构造函数的参数数量

时间:2011-01-04 09:56:56

标签: c++ design-patterns parameters refactoring constructor

我有一个类,需要将12个参数传递给它的构造函数。所以我认为这个课程的设计有问题。

我想询问是否有任何关于类设计的设计模式或一般规则集合,特别是它的构造函数。

5 个答案:

答案 0 :(得分:37)

12个参数对我来说肯定听起来太多了。减少数量的选项是:

  1. Introduce Parameter Object通过将逻辑相关参数分组到对象中并传递该对象而不是单个参数。

  2. 介绍Builder(可选择method chaining)。这不会减少实际参数列表,但它会使代码更具可读性,并且如果您有多个具有不同参数的不同创建方案,则特别有用。而不是

    MyClass someObject = new MyClass(aFoo, aBar, aBlah, aBaz, aBorp, aFlirp, 
            andAGoo);
    MyClass anotherObject = new MyClass(aFoo, null, null, aBaz, null, null, 
            andAGoo);
    

    你可以

    MyClass someObject = new MyClassBuilder().withFoo(aFoo).withBar(aBar)
            .withBlah(aBlah).withBaz(aBaz).withBorp(aBorp).withFlirp(aFlirp)
            .withGoo(aGoo).build();
    MyClass anotherObject = new MyClassBuilder().withFoo(aFoo).withBaz(aBaz)
            .withGoo(aGoo).build();
    
  3. (也许我应该从这开始;-)分析参数 - 构造函数中是否真的需要它们(即强制性的)?如果参数是可选的,您可以通过常规setter而不是构造函数来设置它。

答案 1 :(得分:9)

如果你的函数需要11个参数,你可能已经忘记了一个

我喜欢这句话,因为它总结了一切:糟糕的设计需要糟糕的设计。

我从Herb Sutter,Andrei Alexandrescu撰写的 C ++编码标准:101规则,指南和最佳实践一书中读到了这本书。

编辑:直接引用是如果你有一个包含十个参数的程序,你可能错过了一些。它本身就是a quote from Alan Perlis

具有如此多参数的函数是一个糟糕设计的symtom。 其中一种可能性是尝试将这些参数的一部分封装在具有已定义目标的实体/类中。 (不是列出没有有意义结构的所有参数的垃圾类。)

<小时/>

永远不要忘记Single Responsibility Principle 因此,类的大小仍然有限,因此,成员参数的数量有限,因此其构造函数所需的参数大小受到限制。就像下面的评论之一所说,具有如此多构造函数参数的类可能会处理太多无用的细节,而与其主要目标无关。

<小时/>

建议看一下这个:How many parameters are too many?

答案 2 :(得分:6)

12参数,这个设计很可能是错误的。

参数做了什么?

  • 该类是否只是将它们发送到其他构造函数中?那么也许它应该只接受准备构造对象的接口。
  • 这个类是否很大并且使用所有这些参数做了很多事情?然后该类需要承担很多责任,并且应该接受负责细节的类。
  • 参数中是否有“群集”?也许是创建中一个类的一些参数。封装它们并给予它们适当的责任。

另一种选择是,这是低级别,性能关键结构的参数,在这种情况下,设计只需要回位,但情况很少。

答案 3 :(得分:4)

如果可能,您可以按类对参数进行分组,并将其实例传递给构造函数。

答案 4 :(得分:2)

我认为在使用State模式时这是可以接受的。但是,我可以建议传递这些参数的对象(如果适用)吗?然后在构造函数中加载数据?