2011-07-07 62 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)根據對象的狀態對其他對象執行操作的方法(當然如果假設什麼是「有效」狀態)。

相關問題