是否有充分的理由使用公共财产/领域?

时间:2011-07-07 13:49:31

标签: oop language-agnostic

面向对象编程的一个重要部分是封装,但公共属性/字段往往会破坏这种封装。在什么情况下公共财产或领域真的有意义?

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

5 个答案:

答案 0 :(得分:6)

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

例如,公共字段对于:

是合理且有用的
  • C ++ pimpl - 一个包含另一个类的私有实现的结构/类。它的字段可以在语法上公开声明,但通常只能在一个源文件中由持有pimpl的类访问。
  • 常数字段。例如,Joshua Bloch在 Effective Java 中写道:“允许类通过公共静态最终字段公开常量。”
  • 用于C和C ++之间通信的结构。
  • 仅表示数据的类型,其表示不太可能发生变化。例如,javax.vecmath.Point3d,表示{x,y,z}坐标。

答案 1 :(得分: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,同时仍然在语法上像变量一样工作。

答案 2 :(得分:1)

  

是否有充分理由使用公众   财产/领域?

公共成员总是很危险。你现在可能不需要任何控制,但是一旦你暴露它们,你就失去了以后控制的可能性。如果你有gettes / setters,你可以在以后添加控件。

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

如果对象的目的是在其字段中保存数据,那么是。在对象上有方法(a)纯函数(因为它们不会改变对象的状态或其他任何东西)也是有意义的;或(b)操纵物体的状态,重点是他们以特定的方式操纵状态。

你应该避免的事情是(c)基于对象状态对其他对象做事的方法(当然,如果有关于什么是“有效”状态的假设)。