物件導向程式設計 | Clean Architecture 無瑕的程式碼:整潔的軟體設計與架構篇 閱讀筆記
22 Jun 2020本文為「Clean Architecture 無瑕的程式碼:整潔的軟體設計與架構篇」第 5 章「物件導向程式設計」的閱讀筆記。
良好應用「物件導向」的概念,即可得到好的程式架構。
什麼是「物件導向」?
- (X)答案一:資料與函式(功能)的結合。
- (X)答案二:一種模擬真實世界的方式。
- (O)答案三:封裝 + 繼承 + 多型。
物件導向的程式語言必須至少包含以下三件事
- 封裝(encapsulation)
- 繼承(inheritance)
- 多型(polymorphism)
封裝
只對外部透露該透露的資訊,並且隱藏內部資訊,例如:實作細節。
但到底外部能知道多少細節,還有所有區別的。
- 在 C 語言中,標頭檔(.h)和實作檔(.c)只放置必須的資訊。
- 在 C++ 語言中,弱化了無標頭/實作 的完美分割,但提供三種關鍵字 public、protected 和 private 來做區分。
- Java/C# 除了使用關鍵字做區分外,並且無標頭/實作檔的分離。
繼承
偽裝資料結構,宣告一個型別後,再宣告一個變數當成這個型別的衍生型別。
多型
多型是「指向函式的指標」的一種應用,也就是使用「函式指標」來實現多型。
透過指標的方法若沒有依照規定來實作,就會很難 debug -> 改用 OO 來解決這個問題。
依賴反向
呼叫樹(calling tree)經由流程控制而呼叫一個又一個的函式,而呼叫函式時必須呼叫它的名字(module name),這樣函式與函式間的相依程度是很高的。
解法是使用一個介面(interface)來達成「依賴反向」。這樣做的優點是能將「業務邏輯」與「程式邏輯」切分,也就是說,UI 與 DB 可以當成業務邏輯的 plugin,當 UI 與 DB 有變更時可以獨立部署而不影響業務邏輯。