面向对象编程的一个重要部分是封装,但公共属性/域往往打破封装。公共财产或领域在什么情况下实际上有意义?是否有充分的理由使用公共财产/领域?
注:我只使用术语“属性”或“字段”,因为术语在不同语言之间有所不同。一般来说,我的意思是一个变量,属于一个对象,可以从对象外部访问和设置。
面向对象编程的一个重要部分是封装,但公共属性/域往往打破封装。公共财产或领域在什么情况下实际上有意义?是否有充分的理由使用公共财产/领域?
注:我只使用术语“属性”或“字段”,因为术语在不同语言之间有所不同。一般来说,我的意思是一个变量,属于一个对象,可以从对象外部访问和设置。
是的,有时候有很好的理由。信息隐藏通常是可取的。但偶尔有一些例外。
例如,公共字段是合理且可用于:
是否有充分的理由使用公开的 属性/字段?
号
公共成员总是危险的。你现在可能不需要任何控制,但是一旦你暴露他们,你将失去任何控制权的可能性。如果你立刻有gettes/setters,你可以稍后添加控制。
Ps: 根据您使用的语言,属性和字段可能意味着不同的事情。 C# properties实际上是一种既实现封装又同时不是非常冗长的方式。
有一个不好的原因:通过直接访问数据,避免将方法调用推送到堆栈上,这是值得的。
在很多语言中,这也可以通过内联访问方法来实现。
简答:从不。实际上,如果你使用一个对象来存储数据,但是对象本身没有逻辑,并且你永远不会从这个对象派生出来,那么就可以拥有公有字段。有时候我做这样的事情在C++:
struct A {
int a;
float b;
string c;
A():a(0),b(0.0) {}
A(int a_, float b_, string c_):a(a_),b(b_),c(c_) {}
};
但不必初始化构造函数等,它只不过是一个C结构更。如果你的班级做了比这更多的事情,那么你永远不应该使用公共(甚至是受保护的)领域。
至于属性,它取决于你使用的是什么语言。例如,在Delphi中,属性的主要目的是为字段提供公共接口,并且可以为它们提供getter/setter,同时仍然在语法上像变量一样工作。
如果对象的目的是将数据保存在它的字段中,那么是的,这也是有意义的,对象上的方法是(a)纯粹功能性的(因为它们不会改变状态物体或其他物体);或者(b)操纵物体的状态,并且重点在于它们以特定的方式操纵状态
你应该避免的事情是(c)根据对象的状态对其他对象执行操作的方法(当然如果假设什么是“有效”状态)。
看看这个:[Properties vs. Public Variables](http://www.codinghorror.com/blog/2006/08/properties-vs-public-variables.html)。我认为在.NET之类的其他语言中可以实现相同的行为,比如ruby。 – Lynch