Ruby 中的設計模式-裝飾模式 Decorator
Introduction 裝飾模式允許我們在沒有影響同類的物件下對物件改變其行為 裝飾模式是替代創建子類別的好方法 情境探討 假設我們有一台車的商品,售價為一百。 class Car def price 100 end end car = Car.new puts car.price 我們現在需要為車子新增零件。 class CarWithLight < Car def price 120 end end 現在有一台跑車掛滿零件,很貴。
Introduction 裝飾模式允許我們在沒有影響同類的物件下對物件改變其行為 裝飾模式是替代創建子類別的好方法 情境探討 假設我們有一台車的商品,售價為一百。 class Car def price 100 end end car = Car.new puts car.price 我們現在需要為車子新增零件。 class CarWithLight < Car def price 120 end end 現在有一台跑車掛滿零件,很貴。
還記得一開始自學程式語言時,大家一定或多或少都聽過一個名詞 物件導向。然後身為程式新手和非程式相關科系畢業的你也許會開始 Google 它到底是什麼意思,然後你會在 維基百科 上查到諸如此類的解釋: 物件導向程式設計(英語:Object-oriented programming,縮寫:OOP)是種具有物件概念的程式編程典範,同時也是一種程式開發的抽象方針。它可能包含資料、屬性、程式碼與方法。物件則指的是類別的實體。它將物件作為程式的基本單元,將程式和資料封裝其中,以提高軟體的重用性、靈活性和擴充性,物件裡的程式可以存取及經常修改物件相關連的資料。在物件導向程式編程裡,電腦程式會被設計成彼此相關的物件。 當下看完名詞解釋,如果你和筆者一樣只是個普通人的話應該根據名詞解釋還是無法了解一個抽象的概念,然後可能因為你強盛的好奇心,會繼續在網路上搜尋更多的文章來理解這樣抽象的概念,但有可能你會發現閱讀更多文章後仍然似懂非懂,不要擔心這是屬於正常的現象。 找到方向 上述所描寫的正是筆者個人學習上的經歷,看了些許文章後,仍然覺得少了點什麼才能對整體抽象的理論有更進一步的理解。直到閱讀了 Practical Object-Oriented Design: An Agile Primer Using Ruby 才發現作者 Sandi Metz 很懂得如何引導新手走入物件導向的大門。例如談論到物件導向時一定會提到的幾個重要原則:SOLID(單一功能、開閉原則、李氏替換、介面隔離、依賴反轉)當你看過這些原則後對於實際開發上該怎麼應用上,根據筆者個人的學習經驗似乎只會產生更多的疑問。但作者似乎知道與其講那些理論,不如透過探討實際的程式碼由淺入深的方式一步一步告訴你如果同樣的程式碼,採用物件導向的方式撰寫程式碼會有什麼優缺點?如果不使用物件導向的方式去寫可能會造成後續維護程式碼上困難?筆者看完那本書後終於對物件導向有了更深一層的概念,它也提供了思考程式碼「為什麼要這樣寫會更好?」的方向,而不僅僅是停在「把程式碼寫出來會動就好⋯⋯」的層面上。 接下來將分享書中部分的概念,去探討如何運用技巧去撰寫出容易維護的程式碼。 管理相依性 Manage Dependencies 在物件導向的程式世界中,物件會有所謂 相依性 的問題,什麼是相依性呢?我們舉現實生活中的車子來理解這個抽象概念。車子是一種交通工具對吧?在 Ruby 中車子將可能會是車子這個類別中的一個實體物件,它的行為是進行移動。那車子為什麼可以移動的呢?車子是需要靠輪子來移動的,我們也可以說車子依賴輪子來進行移動,沒有輪子的車子可能哪也去不了,所以車子對輪子產生了很高的相依性。