在真正說到設計模式前,還是要稍微帶過物件導向的SOLID原則,不然只看前面的分法應該是無法理解接下來設計模式的寫法是為什麼要這樣做的。
以先前舉例的Unit例子來說,它裡面的內容就包含了戰鬥數值、尋路演算法、攻擊計算、動畫演出這些的實際做法,可以說是完全違反單一職責原則這件事,真正好的方式是把這些實際做法隔離在其它Class裡。
以程式的方式來說,操作方法向上提升,抽象化為interface或abstract類別,將功能的實作往下移到subclass中。用現實的案例舉例的話,我會以現實的法律為例,如果公民教內容還沒忘光光的話,那應該會知道憲法是所有法律最高層的規定,只要違反這些規則的下層法規通通無效,我隨便舉一個例子,那我隨便舉一個例子,第 13 條,人民有信仰宗教之自由。那要是今天人民信了一個邪教那該怎麼辦?又或者這些宗教跟人民收錢,結果最後被發現是詐騙時又該怎麼辦?這些都不是憲法會去制定的範圍,而是民法或刑法這些法規會去規定的範圍。
如果更難懂的話,就...自己去翻閱參考連結的書籍看看他們說的能不能讓人比較懂一點吧,如果有想到更好的之後再改。
這邊我直接畫圖比較快
如上圖所示,Unit並沒有依賴於任何PushAbility或MoveAbility的subclass,而這兩個繼承IAbility的實體類別都可以替換IAbility型態,這就是LSP。
以我的理解來說,interface應該要盡量不要塞太多的function在裡面,不然就會出現明明沒用到該功能卻還是要實作出來,在程式碼的呈現會十分多餘,不過實際上的到底要切多少還是要考量一下實際上這些功能存在的意義。
簡單就是這些東西應該是放在像是Interface或abstract這種地方來獲取資料,而不是直接從實作類別獲取。再以LSP的圖片說的話,就是Unit不會直接從PushAbility跟MoveAbility獲取甚至改變資料、而是透過IAbility這個抽象化類別獲取。
今天的物件導向介紹就大概這樣,下篇將要進入這次編排中最多篇的章節—設計模式啦!