public class DataObject{
public int Value1;
public int Value2;
public int Value3;
public int Value4;
public int Value5;
public DataObject(){}
}
public class SomeClass{
public SomeClass(){}
public void MultiplyFirstThreeValues(int Value1, int Value2, int Value3){
return Value1*Value2*Value3;
}
public void MultiplyFirstThreeValues(DataObject d){
return d.Value1*d.Value2*d.Value3;
}
}
将方法或整个数据对象所需的每个变量(在不使用数据对象中的每个变量的情况下)发送,这是一种更好的做法?这可能是一个“艺术而不是科学”的问题,但如果你不能给出一个严格而快速的规则,那么我有兴趣听到一个人做另一个的动机(在这种情况下,不是所有数据对象的值都在方法中使用)。
谢谢,我期待着更多地了解这一点。
答案 0 :(得分:4)
我会选择 C 选项将逻辑保留在对象本身内:
public class DataObject
{
private int Value1;
private int Value2;
private int Value3;
private int Value4;
private int Value5;
public DataObject(){}
public int MultiplyFirstThreeValues()
{
return Value1*Value2*Value3;
}
}
修改强> 在回应评论时 - 我将添加一个引用:
程序代码然后获取信息 做出决定。面向对象的代码 告诉对象做事。
这只是一种更好的设计方法,因为它可以让您隐藏实际获得结果/实施的方式。你当前设置的方式更多地反映了Visitor pattern,这可能是强大的,但也增加了更多的复杂性,因为你的类的接口现在拥有所有这些公共成员。如果你的计算将跨越多个DataObject
和/或其他类型,这实际上可能有意义,但如果我可以使用它,我肯定会使用封装。
答案 1 :(得分:1)
经验法则:如果你有超过7个参数(虽然有些人会说超过3个),考虑使用Introduce parameters object重构。
通常,如果您有少量参数,则传递对象的部分内容,特别是如果您不希望更改参数数量及其类型。
如果不是上述情况(您希望参数的数量/类型发生变化和/或您有很多参数),请使用该对象。
注意:
拥有许多参数是一种代码气味,可以表明你的方法/类做得太多而应该分解。
答案 2 :(得分:1)
具有许多输入参数的方法签名通常被认为是缺少类的指示。有多少人?不可能说,但有三个并没有让我觉得特别多。
进入思考过程的另一件事是值总是是否来自同一个对象,方式相同。如果可能是该方法可用于其他输入组合,则保持多参数输入可能更好。当然,如果有很多参数,你可以为参数集提供一个特别设计的类型,然后使用它。
答案 3 :(得分:0)
Personaly我赞成只传递对象,尽管没有使用所有的proerties,因为这会导致更小的方法签名,我认为在代码读取时比许多参数更容易进行精神解析