说我有以下课程:
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不在私有方法之间传递。然而,代码感觉更多"副作用"因为方法所依据的私有成员变量并不总是很明显。
我很感激您对最合适的方法的看法。
答案 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!
}