2011-07-07 60 views
7

面向对象编程的一个重要部分是封装,但公共属性/域往往打破封装。公共财产或领域在什么情况下实际上有意义?是否有充分的理由使用公共财产/领域?

注:我只使用术语“属性”或“字段”,因为术语在不同语言之间有所不同。一般来说,我的意思是一个变量,属于一个对象,可以从对象外部访问和设置。

+0

看看这个:[Properties vs. Public Variables](http://www.codinghorror.com/blog/2006/08/properties-vs-public-variables.html)。我认为在.NET之类的其他语言中可以实现相同的行为,比如ruby。 – Lynch

回答

5

是的,有时候有很好的理由。信息隐藏通常是可取的。但偶尔有一些例外。

例如,公共字段是合理且可用于:

  • A C++ PIMPL - 一个结构/类保持另一个类的私有实现。它的字段可以用合法的方式公开声明,但通常只能在一个源文件中由持有pimpl的类访问。
  • 恒定字段。例如,Joshua Bloch在中写道:有效的Java:“类允许通过公共静态final字段暴露常量。“
  • 用于在C和C++之间进行通信的结构
  • 仅表示表示形式不太可能改变的数据的类型例如,代表{x,y,z}坐标的javax.vecmath.Point3d。
1

是否有充分的理由使用公开的 属性/字段?

公共成员总是危险的。你现在可能不需要任何控制,但是一旦你暴露他们,你将失去任何控制权的可能性。如果你立刻有gettes/setters,你可以稍后添加控制。

Ps: 根据您使用的语言,属性和字段可能意味着不同的事情。 C# properties实际上是一种既实现封装又同时不是非常冗长的方式。

0

有一个不好的原因:通过直接访问数据,避免将方法调用推送到堆栈上,这是值得的。

在很多语言中,这也可以通过内联访问方法来实现。

2

简答:从不。实际上,如果你使用一个对象来存储数据,但是对象本身没有逻辑,并且你永远不会从这个对象派生出来,那么就可以拥有公有字段。有时候我做这样的事情在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,同时仍然在语法上像变量一样工作。

0

如果对象的目的是将数据保存在它的字段中,那么是的,这也是有意义的,对象上的方法是(a)纯粹功能性的(因为它们不会改变状态物体或其他物体);或者(b)操纵物体的状态,并且重点在于它们以特定的方式操纵状态

你应该避免的事情是(c)根据对象的状态对其他对象执行操作的方法(当然如果假设什么是“有效”状态)。

相关问题