# 類與物件
## 內容
- 類/物件/資料結構/容器
- OOP(SOLID, Law of Demeter)
- Polymorphism
## 物件(Object) vs 資料結構(Data Structure/Data Container)
- 物件:私有的內部屬性,使用公開的接口(類方法)去接觸
- 抽象大於具體(不用知道內部細節)
- 用途:
- OOP style
- 封裝
- 分類業務邏輯
- 資料結構:公開的內部屬性(大部分公開),沒有接口(大部分)
- 只有具體
- 用途:
- 儲存和傳遞資料
:::info
物件和資料結構兩者都可以使用類(Class)來實現
但內部運作原理和概念非常不同
:::
## 多態(Polymorphism)
讓物件擁有多種型態的能力
- 一個物件/方法
- 具有相同的結構/名稱
- 但會依據以下變化,呈現出不同功能
- 如何創建
- 如何使用
- 功能:
- 減少代碼重複
## 乾淨的類
- 乾淨的類應該是輕巧的
- 很多小的類比一個大類更好
- 類應該有單一職責(Single-Responsibility Principle -> SRP)
### 如何判斷類是否過大
使用**內聚**(Conhesion)概念
### 內聚
類方法使用類屬性的程度
舉例(實際情況不會如此極端)
- 最大內聚
- 所有的類方法都使用所有的類屬性
- 使用:高度內聚的物件
- 無內聚
- 所有類方法都沒有使用類屬性
- 使用:
- 資料結構
- 帶有實用方法的容器
目標:實現高內聚
### 得墨忒耳法則--Law of Demeter (LoD)
又稱最少知識原則(principle of least knowledge)
延伸閱讀: [Law of Demeter](https://en.wikipedia.org/wiki/Law_of_Demeter)
內容:
- 不要越級訪問
- 不依賴其他對象的內部結構
實踐原則:
類方法中的代碼只會直接接觸其以下的內部事務(類屬性/其他類方法):
- 方法所屬之物件
- 存儲在該物件屬性中的物件
- 當作參數傳入的物件
- 在方法中創建的物件
實踐方法:Tell, Don't Ask
- 不要向其他物件請求資訊,而是告訴他該做什麼
- 告訴代碼要做什麼,而不是跟代碼請求資訊後自己做
### SOLID Priciples(都跟可擴展/維護性有關,但只有第一/二個跟乾淨的代碼有關)
編寫 OOP 代碼時應該遵守的原則
- S:Single Responsibility Principle
- 一個類處理一項職責
- 透過限制類只能處理單一職責生成更輕巧的類
- 輕巧的類更容易讀
- O:Open-Close Principle
- 對於擴展(or 插件)開放
- 對於修改封閉
- 可以在不增長的情況下持續增加小類(維持可擴展性)
- L:Liskov Substitution Principle
- 物件應該要可以被他的子類的實例替換,而不會改變其行為
- 子類實例可以使用其父類的功能
- 它確保您不會對資料用錯誤的方式建模
- I:Interface Segregation Principle
- 介面分離原則
- 眾多特定的介面比一個通用的介面好
- D:Dependency Inversion Principle
- 依賴反轉原則
- 應該要依賴抽象,而非實體
- 顛倒依賴關係,把原本要在類中處理的事務,改為從外界傳入
- 降低類的複雜程度
- 易於維護
- 可以使用依賴注入框架和方法在代碼中的幾個位置
- 並在更多地方可以依賴於抽象的類
###### tags: Clean Code` `Note`