Oop OO:您应该通过类中的属性访问私有变量吗?
我想知道,什么是好的做法:Oop OO:您应该通过类中的属性访问私有变量吗?,oop,properties,Oop,Properties,我想知道,什么是好的做法: private int value; public int Value { get { return this.value; } } private int DoSomething() { return this.Value + 1; //OR return this.value + 1; } 所以,问题是如何处理类变量。您应该通过您的酒店访问它们还是直接访问它们?我选择直接访问。可以说,这都是“把它留在家里”的问题
private int value;
public int Value { get { return this.value; } }
private int DoSomething()
{
return this.Value + 1;
//OR
return this.value + 1;
}
所以,问题是如何处理类变量。您应该通过您的酒店访问它们还是直接访问它们?我选择直接访问。可以说,这都是“把它留在家里”的问题。这是标准战一直在争夺的问题。通常情况下,这不会造成很大的区别,我决定直接从类内部访问变量,但getter和setter除外,它们的作用不仅仅是获取或设置值
关键是您必须知道getter和设置在做什么,或者您必须始终将它们限制在没有附加功能的简单操作中 在这种情况下,这并不重要,但在使用延迟加载变量的情况下,这很重要,并且您可以通过属性进行访问。例如:
private Myobject _value;
public Myobject Value
{
get
{
if (_value == null) _value = new MyObject();
return _value;
}
}
private MyObject DoSomething();
{
//If you access _value here, it might be null...
//so you should access it through the property:
return Value;
}
如果您的方法直接调用该字段而失败,您可以正确处理它,或者通过cleaner方法(通过您的属性)访问它
这一切都归结为应用程序的体系结构,为此,您必须问一个问题:从维护的角度来看,什么最有意义
我不得不说,如果字段初始化正确,并且直接访问它不会让您头疼,那么直接访问它。如果它会导致额外的工作(从而导致额外的维护),请参考该属性
和其他事情一样,权衡利弊。用你自己的常识——标准战是一种可笑的干扰。除非他们给你提供了你还没有想到自己的论点,否则不要白费口舌和他们争论。如果你有充分的理由选择你选择的任何一条路,那么这条路就是正确的——这取决于设计师的特权
我对利弊的看法如下:
与财产有关:
- 我可以更改该值返回方式的实现,而无需重构整个类
- 我可以延迟加载该值,这意味着如果我从不访问它,它就不会浪费资源
- 我可以在一个地方隐藏关于如何返回值的所有实现细节,而不必在代码中处理它
- 我没有在每次访问值时必须单步执行属性代码的潜在性能开销
- 我需要确保在每次调用时正确初始化该值,或者处理不正确的情况
- 我可以影响该值,即使我的属性可能只为我的值提供只读接口
诀窍是,做事总是有原因的,不要因为这个原因而盲目做事。我投票赞成返回这个值。value+1
反对这一点(即通过属性)的理由是,您可能希望稍后向属性方法添加额外的代码,因此如果这样做,更改会更少。但我认为,房产应该按照广告宣传的那样做,而不是更多;也就是说,它们应该做的足够多,以返回该值 引入属性以“隐藏”最终比从字段返回单个值更复杂的结构
我建议您在所有代码中使用属性而不是字段,因此如果属性代码稍后更改为更复杂的内容,您不需要重构类的其余部分。在某些情况下,这是一个好主意。例如,在iPhone的情况下,由于内存量较低,您可能会从操作系统收到“内存警告”。根据这些警告,系统会要求您释放内存以避免被关闭。通常,这些内存来自图像、声音或大数据块等资源,而这些资源在内存中并不需要 在这种情况下,我有时会通过Objective-C私有访问器访问一些私有ivar,这些访问器通常会检查ivar是否为“nil”(NULL),并将数据以“延迟加载”的方式临时加载回内存。为此,我发现私有财产非常有用。否则,我使用直接ivar访问
和往常一样,我不认为这个问题有一个明确的答案:“这取决于”。如果您的类不能信任自己的方法来访问自己的私有变量,那么它可以信任谁?我不认为这是一个黑白分明的问题。我突然想到几件事: 首先,如果属性没有行为(即get/set只是通过获取并返回一个字段),则将该字段设置为自动属性,并消除这个难题。代码行更少,没有混乱 其次,如果属性有副作用(延迟加载、更改通知、统计信息收集等),那么您必须考虑是否适合通过私有更新触发该行为。如果合适,只需使用该属性即可。如果不合适,则不要(或更改设计以使其更加明显) 此外,在适当的情况下,如果非常重要的话,您可以始终引入包装器类型来消除混淆 例如,假设您有一个受参数检查保护的Angle属性
public class ManThatCanRotate
{
public int Angle
{
get { return m_angle; }
set { if(value >= 0 && value < 360) m_angle = value; }
}
public void RotateLikeSomeKindOfLunatic()
{
// imagine this has been called 359 times already.
m_angle++; // ruh-roh
}
}
公共类ManThatCanRotate
{
公共内角
{
获取{返回m_角度;}
设置{if(value>=0&&value<360)m_angle=value;}
}
公共无效可循环使用某些种类的LUN()
{
//想象一下,这已经被调用了359次。
m_angle++;//卢武铉
}
}