类属性声明:私有vs公共

时间:2009-04-03 00:42:44

标签: oop class attributes

定义私有属性而不是公共属性有什么好处?如果我可以公开它们,为什么我应该有额外的工作来创建访问和修改私有属性的方法?

9 个答案:

答案 0 :(得分:11)

短期内没有,除了让OOP纯粹主义者不高兴。

(我假设你的意思是暴露那些本来会使用getter / setter的属性 - 显然,如果你把你的所有属性都公开,会有很大的不同。)

从长远来看,有一些非常充分的理由。

首先,它允许您在源头验证输入,而不是以后必须使用硬件断点和黑魔法的组合来回溯原点。

E.g。

void Foo::setWeight(float weight)
{
  ASSERTMSG(weight >= 0.0f && weight <= 1.0f, "Weights must fall in [0..1]");
  mWeight = weight;
}

它还允许您稍后更改对象的行为,而无需重构客户端代码。

E.g。

void Foo::setSomething(float thing)
{
  mThing = thing;
  // 2009/4/2: turns out we need to recalc a few things when this changes..
  ...
}

答案 1 :(得分:9)

如果使用getter / setter,则可以在更改或访问时执行逻辑。您可以验证输入,而不是假设它总是正确的。您可以跟踪获取值的次数。

最重要的是,这是一个很好的设计。它为您,班级的开发人员提供了对其使用方式的更多控制,以及更好的防止滥用,滥用或只是某人做错事的能力。

答案 2 :(得分:2)

因为你应该总是努力保护界面的实现。如果您将属性设为公共,那么您将让客户知道您对该属性的实现方式。

这不仅会影响您的界面,还会影响您的实施。

此外,如果您使用方法,还可以执行其他智能操作,如验证,访问控制,会计等。如果将属性设为公共属性,则对客户端可以对该属性执行的操作的控制程度要低得多

答案 3 :(得分:1)

主要是因为封装的OO概念。使用private可以封装对象变量的访问权限,从而控制对象状态。不允许外部对象更改您不知道的对象的状态。

一个简单的例子是Pocket对象。

    class Pocket {
 public int numberOfCoins = 10;
 private boolean haveMoney = true;

 public void giveOneCoin(){
    if(stillHaveMoney()){
     numberOfCoins--;
     if(numberOfCoins=<0){
         haveMoney=false;
     }
   }
 }

 public boolean stillHaveMoney(){
  return haveMoney;
 }

}

现在想象另一个课程如下:

class PickPockets {
   public void getSomeMoney(Pocket pocket){
      pocket.numberOfCoins=0;
   }
}

当然这是一个简单的例子。但是这显示了如何控制对类字段/属性的访问权限。 想象一个更复杂的对象,具有更复杂的状态控制。封装使对象的抽象和一致性更好。

答案 4 :(得分:0)

如果您创建访问方法,则将实现与接口分开。

答案 5 :(得分:0)

私有属性为您提供针对该属性的类别用户的一定程度的保护。如果使用公共属性,则需要添加更多逻辑来预先测试无效值,这可能会更多,并且计算成本更高。

公共属性也“混乱”了界面。您呈现的公共属性越少,“更清洁”,您的对象将更容易使用。将某些属性设为私有可以提供灵活性,同时提供易用性,否则将无法使用。

答案 6 :(得分:0)

在C#中它是惯用的。这意味着公共领域会令人惊讶,并让其他人花一点时间来理解您的代码。

它惯用的原因与人们给出的其他解释有关,但事实上它是惯用的意味着你应该更喜欢公共领域的财产,除非有令人信服的理由使用某个领域。

答案 7 :(得分:0)

通常,只有在您认为必要的情况下,才会对要在程序逻辑中隔离的字段使用私有声明。

公共声明可让您更好地控制自己的程序流程;您可以随时更改公共字段。你是这个家里的男人。

那么,为什么大多数人会自发地对私人声明做出大的回应呢?

由于:

  • 他们被教导在大学里“就像那样”。 (最谨慎的理由)
  • 他们最终,愚蠢地立即假设您要么构建代码库,要么为其他人构建软件组件以使用OR或正在进行某些加密实现。只有在这些情况下你才能确定你的领域会发生什么。

底线令人惊讶地“商业化”!!如果你“卖”它,那就去私人,否则做你喜欢的。

答案 8 :(得分:0)

如果所有属性都是私有的,那么从长远来看,你会更好。这包括不使用getter。如果您正在访问对象的属性,那么您正在破坏封装,并且根本不是在进行OOP。那时,构建课程的大多数原因都被浪费了。为什么要建造一座城堡来防御入侵者,然后让所有的门都打开?或者(有吸气剂)总是应要求欢迎入侵者。

“Demeter法则”和“Tell do not ask”的方法已被证明可以降低生产代码中的错误率。使用公共属性不会使面向对象的纯粹主义者感到不快,它只会使用你的代码来阻止它们。

告诉你的对象如何处理它们的属性,不要问它们的值,操纵它们并将它们写回来。这就像带狗散步,然后一个接一个地抬起它来让它移动。

顺便说一下,相反,行为应该都是公开的。任何看起来应该是私有的方法实际上是另一个类的未提取方法。提取该类和方法,并在您眼前简化您的设计。