我们有一个非常负载的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 ...
}
答案 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...
您最终可以考虑两种不同的设计方法: