1、數據抽象
我們平時在寫實體類的時候通常會把類的成員變量定義成private的,然后提供相應的get和set方法供外部調用來實現對該對象的屬性修改,而不是直接的操作成員變量。這種做法體現了java的封裝性,不想暴露內部結構(實際上還是暴露了)。這種想法個人覺的和對外提供接口的想法有點類似,不需要暴露具體實現,只需要提供必要的參數,我就返回相應的結果。
隱藏實現并非只是在變量之間放上一個函數層那么簡單。隱藏實現關乎抽象!類并不簡單地用取值器和賦值器將其變量推向外間,而是暴露抽象接口,以便用戶無需了解數據的實現就能操作數據本體。
理解:模塊不應該了解它所操作對象的內部情形。對象應該暴露行為,而不是數據。
2、數據、對象的反對稱性
對象把數據隱藏于抽象之后,暴露操作數據的函數;數據結構暴露其數據,沒有提供有意義的函數。
過程式代碼便于在不改動既有數據結構的前提下添加新函數。面向對象代碼便于在不改動既有函數的前提下添加新類。
反過來說:
過程式代碼難以添加新數據結構,因為必須修改所有函數。面向對象代碼難以添加新函數,因為必須修改所有類。
所以,對于面向對象較難的事,對于過程式代碼卻比較容易,反之亦然!
3、得墨忒耳律
規則:對象 O 的 M 方法,可以訪問/調用如下的:
1. 對象 O 本身
2. M 方法的傳入參數
3. M 方法中創建或實例化的任意對象
4. 對象 O 直接的組件對象
5. 在M范圍內,可被O訪問的全局變量
好處:
? 我們可以更改一個類,而無需因連鎖反應再去改許多其他的(類)。
? 我們可以改變調用的方法,而無需改變其他任何東西。
? 遵從LOD,讓測試更容易被構建。我們不必為了模擬而寫很多的’when’和各種return。
? 提高了封裝和抽象。
? 基本上,我們隱藏了“xx是如何工作的”。
? 讓代碼更少的耦合。主叫方法只耦合一個對象,而并非所有的內部依賴。
? 它通常會更好地模擬現實世界。想想錢包與付款的那個比喻。
(ImportNew:http://www.importnew.com/10501.html)
law of demeter, LKP最少知道原則:一個對象應當對其他對象又盡可能少的了解,不和陌生人說話。也即是方法不應該調用由任何函數返回對象的方法。
4、數據傳送對象
最為精煉的數據結構,是一個只有公共變量、沒有函數的類。這種數據結構有時被稱為數據傳送對象,或DTO。