2012-02-21 74 views
3

我真的不明白爲什麼通常將成員變量和成員函數設爲私有是一種很好的做法。公立還是私人?

這是爲了防止人們與事物/更多的組織工具搞砸嗎?

回答

16

基本上,是的,這是爲了防止人們擰東西。

封裝(信息隱藏)是您正在尋找的術語。

通過只向外界發佈最少的信息,您可以隨意更改內部數據。

例如,假設您將電話簿實現爲條目數組,並且不會隱藏該事實。然後

有人走來,寫代碼,搜索或操縱你的陣列沒有通過你的「正常」的界面去。這意味着,當你想要開始使用鏈表或其他更高效的數據結構時,它們的代碼將會中斷,因爲它使用了這些信息。

這就是過錯發佈的信息,而不是他們使用它:-)

典型的例子是getter和setter方法。你可能會認爲你可以只露出溫度變量本身在一類,以便用戶可以只執行:

Location here = new Location(); 
int currTemp = here.temp; 

但是,如果你想以後有從氣象局實際網絡刮信息每當你問溫度。如果你想封裝在放在首位的信息,主叫方也只是做:

int currTemp = here.getTemp(); 

,你可以儘可能多的,只要你想改變這種方法的實施。唯一必須保留的是API(函數名稱,參數,返回類型等)。


有趣的是,它不只是在代碼中。某些大公司會用文字說明如下:

此技術信息僅用於說明目的,可能會在將來的版本中更改。

允許他們提供客戶想要的東西(額外的信息),但不鎖定他們支持所有的永恆。

1

這是給任何人(你,別人)提供一個明確的代碼合同,他們正在使用你的對象......從「如何工作」中分離出「如何使用它」。這被稱爲Encapsulation。對於一個側面說明,至少在.NET上(可能在其他平臺上),對於真正想要訪問的人來說,要訪問對象的私有部分(使用反射),並不難。

6

主要的原因是你,庫開發,有保險,沒有人會使用你不希望你的代碼的部分必須保持。

公共部分代碼可以的,難免會得到使用您的客戶。如果您後來發現您的設計實際上非常糟糕,並且版本2.0應該寫得更好,那麼您意識到您的付費客戶實際上希望您保留所有現有功能,並且您被鎖定以維持向後兼容性的價格製作更好的軟件。

通過使盡可能多的代碼儘可能私有的,你是毫無保留地宣佈,該代碼是無人能敵,並且你可以和將能夠在任何時間重寫。

+1

很好的例子。即使你沒有開發一個庫,封裝也很有價值。 – 2012-02-21 22:46:15

+0

希望我可以選擇這個問題的兩個答案,這個也很好 – 2012-02-21 22:48:25

2

這是爲了防止人們從事安全事務 - 但從安全角度來看,不是而是

相反,它意在讓你的類的用戶只關心public部分,讓你(作者)隨意修改實施(private),而不必擔心破壞別人的代碼。例如,大多數編程語言似乎將Strings存儲爲char[](字符數組)。如果由於某種原因,人們發現節點的鏈接列表(每片含單個字符)表現較好,使用陣列內部實施可以被切換,而無需(理論上)斷裂使用String類的任何代碼。

0

以計數器的典型示例。你夜總會的保鏢握住他的手,讓他的拳頭​​更難受,並計算進出俱樂部的人數。

現在事情是這樣定義的:

public class Counter{ 
    private int count = 0; 
    public void increment() 
    { 
     count++; 
    } 
    public void decrement() 
    { 
     count--; 
    } 
} 

正如你所看到的,有沒有制定者/吸氣的數量,因爲我們不希望這個類的用戶(程序員),能夠調用myCounter.setCount(100),或者更糟myCounter.Count - = 10;因爲這不是什麼東西,對每個人來說都是一樣的,每個人都離開。

0

沒有爲這個有很多爭論的範圍。 例如......如果很多.Net Framework是私有的,那麼這會阻止開發人員搞砸事件,但同時它可以防止開發人員使用funcionality。

在我個人看來,我會優先考慮製作方法public。但我會建議使用Facade模式。簡而言之,您有一個封裝了複雜功能的類。例如,在.net框架中,WebClient是一個隱藏複雜http請求/響應邏輯的Facade。

還...保持簡單的類...你應該有一些公共的方法。這比具有大量的私有方法大班了更好的抽象