終於進入了原則篇,接下來的幾篇我們會介紹幾個物件導向的原則(基本上就是指 SOLID 原則)。因此這篇就讓我 水一下 當成後半段的目錄,方便之後可以把相關的部分整理進來。
為什麼我們需要這些原則?
我們在前面的章節已經說明了一些物件導向的特性,例如繼承和多型等等。然而我們並沒有討論到怎麼運用、或是怎樣設計才能算是更好的、更優雅的、更符合物件導向精神的;我們並沒有提到一個評估的標準,或是指引一個更好的方向。
然而,混亂的使用物件導向對整個專案的毀滅性甚至比乾脆不使用物件導向還高。
這些特性使用起來很簡單,大多數語言只需要一個符號或標示就能完成繼承,把一堆東西全部塞在一起就可以說我在封裝。但怎麼使用得好,又該什麼時候使用呢?這就是難的地方吧。
例如說濫用繼承,或是封裝時完全不隱藏複雜度一路 Puuuuublic 到底,又或者是類別之間過於相互依賴,全部耦合成一團等等。如果隨便地使用物件導向的各項特性,就會讓整個架構變得僵化、脆弱、危險、充滿臭味。
更可怕的是,這個發臭的過程是每一次設計、每一次修改都會有所影響,所謂「持續發生,腐敗成真」,隨著物件導向的亂用、誤用、無腦用,軟體就會逐漸腐化。一組腐化的軟體可能會有以下特徵:大量的依賴使得修改變得困難、修改後看似不相干的各個地方發生問題、或是修改時沒辦法依循原本的設計、到處出現不必要的複雜性和不必要的重複,模組也變得難以理解等等。
阻止程式碼的腐化、追求更好的架構和設計、寫出更好的代碼,當然是我輩所追求的目標。儘管面對的可能是不同的問題和不同的環境,那些優質、穩固、具有反脆弱特質的程式碼也必然會有些共通之處。例如說:需要具有面對改變的能力、具有方便管理的能力、具有隱藏複雜性的能力。
因此,大前輩們整理並提出了一些可以致力的方向,也就是所謂的「原則」。如同心法、教義一般,只要實作的同時將其牢記在心,就能讓我們作為一些行動的準則和依據。
……