具有太多参数的构造函数

时间:2013-01-15 20:02:10

标签: c# oop constructor

我们有一个非常负载的Transaction类;如此加载,我最初最终将近20个参数传递给ctor。在提取了几个值对象之后,还剩下12个参数,我仍然认为这个参数太多了。

我该如何避免这种情况?我认为将参数传递给构造函数是合理的,因为它们都是必需的,我想明确说明。我也喜欢如果我添加一个属性,我可以将它添加到ctor并让我的编译器找到它破坏的地方,而不是依赖于本身的测试。我认为对象初始化器或构建器没有任何好处。在接下来的几天里,可能会更明显哪些论点属于一起,并且可以组成。

public class MyEntity() 
{
    public MyEntity(ValueType prop2, ValueType prop3, ...) 
    {
        Id = Guid.NewGuid();
        Prop2 = prop2;
        Prop3 = prop3;
        ...
    }

    public Guid Id { get; private set; }

    public ValueType Prop2 { get; private set; }

    public ValueType Prop3 { get; private set; }

    public ...
}

4 个答案:

答案 0 :(得分:2)

您确定所有参数都是必需的吗?单词“required”具有欺骗性,例如,编译器可能会强制我提供字符串参数,但它不能强制我提供非null或空的值。

真正强制提供有效数据的唯一方法是在使用点验证它。有时这必须在构造函数中,例如一个包含初始化时只有意义的东西的类,就像一个I / O对象。但是,通常允许调用代码以任何旧方式设置属性,然后在需要它们的方法调用中验证它们的值通常就足够了。

我有点乱。我的观点是,不要把构造函数参数作为向类提供初始化数据的唯一方法。除简单属性外,它们几乎不提供额外的编译器保护。

答案 1 :(得分:1)

如何将参数封装在结构中,并将结构传递给?

public struct ParamsStruct
{
    Type1 param1;
    Type2 param2;
    ...
}

public void Method(ParamsStruct p)
{
    ...
}

public void Main(String[] args)
{
    ParamsStruct p;
    p.param1 = ...
    p.param2 = ...
    Method(p);
}

答案 2 :(得分:1)

在用户或系统界面中输出完整的交易详细信息时,您将需要所有部件。这不太可能帮助您找到分裂。

但是,看看你的内部处理 - 是否存在你只使用交易中的一部分字段的情况?您是否有传递交易的地方,但只使用4个字段?如果你总是使用所有字段,那么将它们保存在一个对象中。

在银行交易的情况下,我会考虑按以下方式划分: -

  • 钱来自哪里
  • 钱去了哪里
  • 资金如何转移 - 使用了哪种支付工具或设施
  • 钱被移动的原因 - 参考数字等
  • 金额和货币
  • 日期
  • 交易状态

(显然这取决于你的确切领域)。

答案 3 :(得分:0)

public class MyEntity() 
{
    public ValueType Prop1 { get; set; }

    public ValueType Prop2 { get; set; }

    // And so on...

    public MyEntity() 
    {
        Id = Guid.NewGuid();
    }
}

然后:

MyEntity entity = new MyEntity();
entity.Prop1 = prop1;
entity.Prop2 = prop2;
// And so on...

您最终可以考虑两种不同的设计方法: