题
例如,您在方法定义中使用访问器和修改器还是直接访问数据?有时,一直,还是在罗马的时候?
解决方案
始终尝试使用访问器,即使在类内部也是如此。您唯一希望直接访问状态而不是通过公共接口的情况是,由于某种原因您需要绕过访问器方法中包含的验证或其他逻辑。
现在,如果您发现自己处于这样的情况 做 需要绕过这个逻辑,你应该退后一步,问问自己,这种需求是否暴露了你设计中的缺陷。
编辑: 读 自动与显式属性 埃里克·利珀特(Eric Lippert)在其中深入研究了这个问题并非常清楚地解释了事情。它专门针对 C#,但 OOP 理论是普遍且可靠的。
以下是摘录:
如果动机的原因 从自动实现的更改 属性来显式实现 属性是改变语义的 那么你应该 评估所需的语义是否 从以下位置访问属性时 在类中等同于 或 与所需语义不同 从以下位置访问属性时 课外。
如果该调查的结果是“从类中开始,那么访问此属性的所需语义与从外部访问该属性的所需语义不同”,那么您的编辑已经引入了一个错误。您应该修复错误。如果它们是相同的,那么您的编辑没有引入错误;保持实现相同。
其他提示
在一般情况下,我更喜欢访问器/增变器。这样一来,我可以改变内部实现的一类,而以同样的方式的类函数到外部用户(即我不或预先存在的代码要打破)。
在访问器被设计成使得可以添加属性的特定逻辑。如
int Degrees
{
set
{
_degrees = value % 360;
}
}
所以,你总是希望通过getter和setter访问该字段,这样你总是可以肯定的是,该值将永远不会大于360
如果,如安德鲁所说,你需要跳过验证,那么它很可能是没有在功能的设计上的缺陷,或者验证的设计。
存取函数的设计,以确保数据的一致性,所以即使是在你的类,你应该总是努力确保有未经验证的数据注入到这些字段没有可能的方式。
修改强>
请参阅了这个问题,以及: OO设计:你使用公共属性或私有内部字段?
我不倾向于与外界分享我的班的“内脏”等我的数据(私有方法的东西)的内部需求往往不能做同样的东西,我的公共接口呢,通常
这是很罕见的,我会写一个访问/突变,一个私有方法调用,但我怀疑我在这里的少数民族。也许我的 的应该做更多的,但我不倾向于。
无论如何,这是我的[铜绿覆盖] 2美分。
我会经常与私人汽车性能开始,然后重构如果必要的话。我将重构为与支持字段的属性,然后与“真正的”商店取代后备字段,例如会话或视图状态为ASP.NET应用程序。
自:
private int[] Property { get; set; }
到
private int[] _property;
private int[] Property
{
get { return _property; }
set { _property = value; }
}
到
private int[] _property;
private int[] Property
{
get
{
if (_property == null)
{
_property = new int[8];
}
return _property;
}
set { _property = value; }
}
到
private int[] Property
{
get
{
if (ViewState["PropertyKey"] == null)
{
ViewState["PropertyKey"] = new int[8];
}
return (int[]) ViewState["PropertyKey"];
}
set { ViewState["PropertyKey"] = value; }
}
当然,我使用ReSharper的,所以这需要更少的时间比张贴关于要做。