OO设计,在私有方法或访问成员变量之间传递参数?

时间:2016-03-02 14:30:09

标签: c# oop

说我有以下课程:

class MyClass
{
    private int memberVar;

    public MyClass(int passedInVar)
    {
        memberVar = passedInVar;       
    }
}

在构造函数中传入一个int并将其分配给私有成员变量。

我的问题是,最好是在类的私有方法之间传递int变量,还是不将int变量作为参数传递,而是让每个私有方法直接访问private membervar?

即。这是(例A):

class MyClass
{
    private int memberVar;

    public MyClass(int passedInVar)
    {
        memberVar = passedInVar;       
    }

    public MyPublicMethod()
    {
        MyPrivateMethod(memberVar);
    }

    public MyPrivateMethod(int variable)
    {
        // Do something with passed in variable...
    }
}

比这更好(例B):

class MyClass
{
    private int memberVar;

    public MyClass(int passedInVar)
    {
        memberVar = passedInVar;       
    }

    public MyPublicMethod()
    {
        MyPrivateMethod();
    }

    public MyPrivateMethod()
    {
        // Do something with memberVar...
    }
}

我问的原因是我发现自己在两种风格之间切换。

我发现这个示例示例A的样式显示了代码的更多意图。您可以看到私有方法之间传递的内容,以便更明显地受到该方法的影响。

而示例B更清晰,因为memberVar不在私有方法之间传递。然而,代码感觉更多"副作用"因为方法所依据的私有成员变量并不总是很明显。

我很感激您对最合适的方法的看法。

5 个答案:

答案 0 :(得分:5)

而不是告诉你哪个更好,我更愿意给你一些提示:

  • 永远不应直接访问类字段。应使用属性封装它们。
  • 实例方法,因为它们是某个特定类实例的一部分,所以不应该接受参数,除非在执行某些方法期间所需的值需要的信息多于对象本身中包含的值或者数据不应该是该类持有,因为它们不代表整个类的实际属性(即数据与类无关)。
  • 您不应该仅为了操作类字段而创建私有方法,因为您应该已经使用属性封装它们。
  • 仅在施工期间设置的类字段应为readonly,以避免在整个对象的生命周期中设置它的人为错误。至少,您应该设置一个属性,其 setter 是私有的(即public string Name { get; private set; })。

扩展何时使用输入参数

例如,计算矩形的面积如下:

public class Rectangle
{
     public int Area { get; private set; }

     public void CalcArea(int a, int b) 
     {
          Area = a * b;
     }
}
  • Area是一个类属性。您不会将该区域作为CalcArea的参数传递,是吗? ;)
  • 您需要提供矩形边的长度。

答案 1 :(得分:4)

投票给第二个解决方案。您正在使用当前上下文,它是一个正常使用的上下文部分。它适合生活,适合代码。 例如,您使用策略的映像1.如果您的一个私有方法(一次调用2次或更多次)需要更改签名,那么您需要在2个或更多位置更改代码。否则,当您使用上下文时,不需要它。

答案 2 :(得分:2)

真正的问题不是"哪种方式更好",这是你的成员变量是否真的应该是你班级的成员。如果它只是一个成员变量来清理某些操作的参数列表......这不是将成员添加到类的好理由。它不仅会对您的模型进行轮询并使您的代码更难理解,而且会分散依赖性,这绝不是一件好事。如果你可以通过传递它的依赖关系使你的方法静态,那么这样做可能是好的。

如果该成员是您班级的合法成员,您可能根本不需要单独的方法。然后将成员从一个方法传递给下一个方法是没有意义的,因为任何方法都可以访问该成员,

答案 3 :(得分:1)

我会在这个具体场景中选择第一种方法,因为函数声明清楚地表明了它的执行所依赖的内容。

在第二种情况下,您有“隐藏”变量,该变量在类型实例的整个生命周期中保存状态。

pros cons ,这很大程度上取决于所有程序架构,设计目标和个人测试。

考虑到我上面所说的所有,仍然,对同时的功能有清晰简洁的定义,清楚地显示其执行依赖性(就像在你的第一选择中)是一个巨大的好处,我很难找到辩论。

答案 4 :(得分:0)

被接受的答案在某些方面漏了。这是我的两分钱。

  

绝对不能直接访问类字段。

除非需要属性设置程序的行为,否则应该直接始终访问

类字段!在本质上,属性就是方法。访问属性就像调用方法一样。对于优化器来说,摆脱额外的方法调用可能会更加困难。更不用说属性设置器将触发代价高昂的事件(例如INotifyPropertyChanged)的常见情况。您还会遇到该属性为virtual的情况,这意味着其他副作用。

  

实例方法/.../不应该接受参数

大部分正确。但是,如果您有一个私有的 instance 方法,则离使其成为static仅有几步之遥-为实际的方法调用节省了一些CPU周期(无需vtable查找)。

  

您不应仅为了使用类而创建私有方法   字段

应该创建私有方法,当几种方法需要完全相同的工作作为其职责的一部分时。例如:

private void OnSizeChanged()
{
    this.area = CalcArea();   // Here...
    this.perimeter = CalcPerimeter();
}

public float GetPhysicalArea(float unit)
{
    return CalcArea() * unit; // ... and here!
}