构造函数应该有多少变数呢?(How many variables should a construc

2019-08-06 23:26发布

我意识到这是一个非常开放的问题,并能得到多种答案,但在这里不用。

使用C#(或Java,或任何OO语言),有没有规定多少个变量应该传递到构造函数的一般规则? 变量我传递到扩展类的构造函数的数量似乎是失控的。

在努力封装类的数据,我宣布了成员私人,初始化它们在我的构造函数,并使用公共存取。

下面是一个例子:

public class A
{
  private int var1;
  private int var2;
  private int var3;

  //3 variables passed in
  public A(int v1, int v2, int v3)
  {
    var1 = v1;
    var2 = v2;
    var3 = v3;
  }

  //Properties (accessors) here
}

public class B : A
{
  private int var4;
  private int var5;

  //5 variables passed in
  public B(int v1, int v2, int v3, int v4, int v5)
  : base(v1,v2,v3)
  {
    var4 = v4;
    var5 = v5;
  }

  //Properties (accessors) here
}

public class C : B
{
  private int var6;
  private int var7;

  //7 variables passed in !!!
  public C(int v1, int v2, int v3, int v4, int v5, int v6, int v7)
  : base(v1,v2,v3,v4,v5)
  {
    var6 = v6;
    var7 = v7;
  }

  //Properties (accessors) here
}

我的构造函数通常传递不同的对象,不只是个整数。 我开始质疑我的设计,当我开始在7个变量传递到子类的构造函数,但我也有麻烦找出一种不同的方式来做到这一点。

这被认为是不好的编程习惯? 是否有一般限制,你应该传递到构造函数的变量的数目?

Answer 1:

一般来说,我发现,如果有3个以上,这是一个标志,以做到对设计的快速完整性检查。 如果有超过5个,这是一个重大的警告的东西可能是错误的设计。

但是,请注意这个词“可能” -最终,唯一真正的规则是根据需要的功能,不能多也不能少使用尽可能多的 。 总有一些例外情况并在多个参数是最有意义的案例。

如果参数以某种方式相关,你应该封装它们放入一个容器类。

如果这些参数都没有关系 - 例如,它是没有意义的他们分组到一个容器类 - 类是可能做的东西太多了。 一般没有理由一个类应该知道的7个完全不同的的信息。 掰开你的班级分成单独的类。 它可能是有意义的委托参数3和4的子类和5,6和7到另一个类,例如 - 和你的父类简单地与它们之间的操作。



Answer 2:

对我来说,正确的答案是:

如需要设置的,是不是无效状态的对象,您应该传递尽可能多的变量。

还有什么是“选择”,我宁愿让作为属性,尤其是现在,C#提供了对象初始化。



Answer 3:

它很难把一个硬,快数到什么是“太多了”。 真正的问题是:什么是你的班级做什么? 是类做得太多? 如果是这样,现在是时候打破类成更小,更简洁的类。

构造参数应包括多达必要定义为类的依赖关系/输入。 如果类减少到在生活中有一个工作,那么你的构造函数的参数很可能是正确的。



Answer 4:

正如其他人所说,有没有这方面的硬性规定,这实际上取决于。 然而,作为一个人的大脑能有多少把握的事情一次具体的证据:这就是7 +或 - 2规则。

这种类型的问题是代码由史蒂夫·麦康奈尔完成得非常好回答。 我建议,如果你还没有,你读过这本书。



Answer 5:

有一件事我喜欢3.5框架...

new Foo {
    Street = "909 Rose Ave",
    City = "San Diego",
    State = "CA",
    FName = "Joe",
    LName = "Wazowski",
    ID = "987665454"
};

无需担心太多的构造函数,或者参数太多太多的构造函数。



Answer 6:

我个人的经验法则是5

如果您需要更多,他们包裹在一个结构或对象。

这改变了,当你没有初始化的对象。 如果我使用IOC容器初始化对象的本体同构参数的数量基本上是无限的。



Answer 7:

特别是由于新的功能,让您以实例化一个块设置变量,我倾向于在创作的东西已经在创建类来设置仅使用的参数,在这种情况下,我做了基本的构造private或protected 。

举例来说,如果你有一个类Rectangle,它可能是有意义,使构造矩形(双宽,双高),使矩形()构造函数私有。



Answer 8:

此外,您可以把一个参数的私有构造,如果你认为你的类应该只将它通过构造函数的属性值。



Answer 9:

系统一旦有太多的参数,因为它变得很难记住如何使用它们。 如果他们都是整数,3是太多了。 如果他们是不同类型的,你可以有更多的。

这是Martin Fowler的气味重构的书。 该网页包含指向标准的重构,帮助。

在你的情况,你可能要考虑一个生成器对象(在这里你可以逐步添加参数和Builder可以断定类)或参数对象。



Answer 10:

恕我直言,使用TDD是一个有用的角度来评价这个问题。 一旦你的构造函数是很难申请到单元测试构造函数或设置(),初始化/工厂的参数太多和相对过紧密耦合。



Answer 11:

你需要在构建类所需的一切通过。 什么,当我发现自己传递了很多变数,我经常做的是做一个“配置”类持有构建其所需的信息,即传递给构造函数的对象。 它极大地simplies实例化对象并为更清洁的设计。



Answer 12:

我会尽量回答从不同的角度这个问题。 我看到使用的构造函数的两种主要方式,所以想着如何多参数太多的双向。

1)明确称为构造

这是典型的方法,你的“新”的对象,你必须指定所有必需的参数值。 这是由这里其他的答案完全覆盖。 我个人的经验法则是:所有的参数应该放在一行,所以我将有最多3-4参数。

另外,如果你知道你的类可能是能够处理需要在未来更多的参数多的情况下,我会用一个struct /类直接进入。 例如:

比方说,一个班要处理一些对象的过滤基于某些条件。 在开始的时候,只会有2-3标准。 知道它很可能在未来更多的标准,我将直接从一开始就发送FilterValue对象。

2)隐式称为构造

一个典型的例子是使用依赖注入 。 在几乎所有情况下,所有构造函数的参数注入,所以它是DI框架的业务打造的对象为您服务。

在这里,“常识”并不适用,因为需要一个可以注入尽可能多的服务。 例如:

如果使用的是聚集来自任何数量的存储库的变化,比工作类的工作单元图案的单位进行的数据持久性将与所有使用的存储库被注入。 更多的细节可以从这个回答中找到代码审查 。

顺便说一句,的参数的方法理论上的最大数量应足够高,没有永远到达它: C#和Java的 。



文章来源: How many variables should a constructor have?