在方法中传递数据对象或数据对象的部分?

时间:2011-03-03 21:11:08

标签: c# class-design

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;
    }
}

将方法或整个数据对象所需的每个变量(在不使用数据对象中的每个变量的情况下)发送,这是一种更好的做法?这可能是一个“艺术而不是科学”的问题,但如果你不能给出一个严格而快速的规则,那么我有兴趣听到一个人做另一个的动机(在这种情况下,不是所有数据对象的值都在方法中使用)。

谢谢,我期待着更多地了解这一点。

4 个答案:

答案 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,因为这会导致更小的方法签名,我认为在代码读取时比许多参数更容易进行精神解析