Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop OO:您应该通过类中的属性访问私有变量吗?_Oop_Properties - Fatal编程技术网

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++;//卢武铉
}
}