我覺得模組的概念其實很像繼承,但在意義上有所不同。
想想看,如果有種行為是特定幾個類別所需要的,那該怎麼解決?
若是用繼承的方法,可能造成不需要的類別,擁有這樣的行為
或許會說,不如就在子類別覆寫父類別行為,就可以避免了
這樣的做法在技術上是可行的,但會造成繼承失去意義
因為子類別本來就應該擁有父類別所提供的行為,當行為被子類別覆蓋後,子類別就不再屬於父類別了
最好的方法是使用模組(Module)
如同裝備一樣,掛在身上去執行動作就好!
而模組與繼承相同的概念就是分離抽象
既然是繼承與模組都是提供介面使用,那方法是從何而來的呢?
這張圖可以簡單解釋部分流程!
首先天藍色部分都是類別,而循著線往上,天藍色彼此間都是繼承的關係
而黃色部份則是模組,而會因為方法使用不同,而擺在不同位置
像是圖中的C1
類別使用include
引進M1
模組,所以他會存在C1
之上,若是C1
內找不到方法,就會向上跑到M1
找尋,再找不到就在循線向上
而perpend
方法,則會放在引進類別的下方,所以會先到M2
找尋,再依序向上
為了不讓這整篇太複雜,簡單介紹一下extend
方法。
其作用是將模組(Module)的行為直接加入到某個物件之中
換句話說
還有一個叫做 單例類別(Singleton class) 這方法會專屬於特定物件
但不建議使用,因為可能會導致程式碼架構混亂
最後!其實書中還有解釋到 里氏替換原則 (Liskov substitution principle)
但這部分會在SOLID原則中一同解釋,所以這邊就不多說啦~
快樂星期五,就該好好休息囉! 假日快樂 :)
感謝大家 如有問題,再煩請大家指教!