Design Principle

好萊塢守則

低階 component 可以掛到高階 component 上,但是由高階 component 決定何時 call 低階 component,低階 component 不該 call 高階 component。

這是為了防止 component 之間的 dependency 爛掉,例如高階 component 使用低階 component 也就 depend on 低階 component,低階 component 如果又使用高階 component 就變成互相依賴,再多來幾個 component 就大家通通糊在一起。

Least Knowledge

系統中的 object 應該只跟它很有關係的 object 互動,不要讓太多 class 綁在一起,免得動一個就動到一大堆。動 A 會動到 B 往往是 bug 的來源……

設計時要注意物件所互動的 class 有哪些以及是如何互動的。

針對 interface 寫 code,不針對 implement 寫 code

想使用某一堆類似的 class 時,應該是讓這些 class 有個 interface 並透過 interface 使用 class,而不是針對特定某個 class 寫 code。如果針對 interface 寫 code,當 class 又增加時可以運用多型在一開始生新的 class 的 object,之後使用該 object 的 code 都可以不用改。

多用合成,少用繼承

「合成」像是把東西組起來,是「有」,has-a。「繼承」則是「是」,is-a。

這我還沒有很懂為什麼……只想到一個爛例子,如果 class A 需要某個功能,例如 parse json,假設已經有一個 json parser 的 class,那麼應該是讓 class A 以合成的方式使用 json parser,而不是去繼承 json parser。這個例子很明顯,用繼承會讓 class A 的語意變得很奇怪,不過不是每種狀況都那麼明顯……