1. 程式人生 > >程式碼整潔之道讀書筆記--物件和資料結構

程式碼整潔之道讀書筆記--物件和資料結構

物件和資料結構

1.過程式程式碼VS面向物件程式碼

過程式程式碼便於在不改動既有資料結構的前提下新增新函式。面向物件程式碼便於在不改動既有函式的前提下新增新類。

反過來說:
過程式程式碼難以新增新資料結構,因為必須修改所有函式。面向物件程式碼難以新增新函式,因為必須修改所有類。

2.得墨忒耳律(LoD)

得墨忒耳律(維基百科)認為:模組不應瞭解它所操作物件內部情形,物件應該隱藏資料,曝露操作,這意味著物件不應通過存取器曝露其內部結構,因為這樣更像是曝露而非隱藏其內部結構。可以簡單地以下面任一種方式總結:
- 每個單元對於其他的單元只能擁有有限的知識:只是與當前單元緊密聯絡的單元;
- 每個單元只能和它的朋友交談:不能和陌生單元交談;
- 只和自己直接的朋友交談。

很多面向物件程式設計語言用”.”表示物件的域的解析算符,因此得墨忒耳定律可以簡單地陳述為“只使用一個.算符”。因此,a.b.Method()違反了此定律,而a.Method()不違反此定律。一個簡單例子是,人可以命令一條狗行走(walk),但是不應該直接指揮狗的腿行走,應該由狗去指揮控制它的腿如何行走。

所以下列程式碼違反了得墨忒耳律,因為它呼叫了getOptions()返回值的getScratchDir()函式,又呼叫了getScratchDir()返回值的getAbsolutePath()方法。
final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();
這類程式碼常被稱為“火車失事”

,因為它看起來就是一列火車,這類連串的呼叫通常被認為是骯髒的風格,上述的程式碼可以做如下的切分:
Options opts = ctxt.getOptions();
File scratchDir = opts.getScratchDir();
final String outputDir = scratchDir.getAbsolutePath();