定义私有属性而不是公共属性有什么好处?如果我可以公开它们,为什么我应该有额外的工作来创建访问和修改私有属性的方法?
答案 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)
通常,只有在您认为必要的情况下,才会对要在程序逻辑中隔离的字段使用私有声明。
公共声明可让您更好地控制自己的程序流程;您可以随时更改公共字段。你是这个家里的男人。
那么,为什么大多数人会自发地对私人声明做出大的回应呢?
由于:
底线令人惊讶地“商业化”!!如果你“卖”它,那就去私人,否则做你喜欢的。
答案 8 :(得分:0)
如果所有属性都是私有的,那么从长远来看,你会更好。这包括不使用getter。如果您正在访问对象的属性,那么您正在破坏封装,并且根本不是在进行OOP。那时,构建课程的大多数原因都被浪费了。为什么要建造一座城堡来防御入侵者,然后让所有的门都打开?或者(有吸气剂)总是应要求欢迎入侵者。
“Demeter法则”和“Tell do not ask”的方法已被证明可以降低生产代码中的错误率。使用公共属性不会使面向对象的纯粹主义者感到不快,它只会使用你的代码来阻止它们。
告诉你的对象如何处理它们的属性,不要问它们的值,操纵它们并将它们写回来。这就像带狗散步,然后一个接一个地抬起它来让它移动。
顺便说一下,相反,行为应该都是公开的。任何看起来应该是私有的方法实际上是另一个类的未提取方法。提取该类和方法,并在您眼前简化您的设计。