論述軟體三大基礎觀念-封裝、一般/特殊化 (繼承)、介面/多型

這是看到 PTT Soft_Job 版區一位網友的貼文:[請益] 我這樣解釋OOP對嗎?。原來我已在「FB-軟體設計鮮思維社群」針對此貼文已寫一篇文論述,在此邊我也把回文作個備存,然後再加上一些些心得分享。

剛入門所謂 OO → 連帶等同所謂「物件導向」觀念實作與設計觀念時,幾乎各類 OOP 入門書籍均會談論到此三大術語:封裝 (encapsulation)、繼承 (inheritence)、介面 (interface)/多型 (polymorphism)。看似簡單的術語,卻可能連多數鑽研多年實作的程式開發人員,還不容易真正體會這些觀念的意涵與作用。

即使入這軟體開發行業多年,仍會發現到,軟體大師們的著作,從最早期的 GoF 四人幫「設計模式 (Design Pattern)」,至近幾年「重構 (refactoring)」、「Clean Code」等著作,幾乎都是含繞在上述三大觀念的解釋與實踐。所以也就是說,這三大觀念可以說是要窮究一輩子的研究、思考與實踐力行的,它沒有絕對的標準答案,但也不見得好像很虛妄抓不到。每一段時期的經歷與學習,就可能會對其有著不同的想法與心得體會。

以現在個人入行軟體開發這行業約莫10來年,主要專職於軟體顧問輔導與教學,就以現階段綜合學習、觀察、反思與經驗等,來對這三大術語發表純文字的論述。可能又等 5~10 年後,當又有不同的體認時,再來對比現在的論述,作心得的補充或修正了。 :)


花了三個多小時撰寫這篇 PO 在 PTT soft_job 版,關於 OOP 的三個主要觀念:封裝, 繼承, 介面/多型。

這裡特別提醒下,程序語言用書很喜歡用「繼承」這字眼來解釋 OOP,其實那很容易誤導,常會用 父母生子 這種觀念看待。適切的用語用 "擴展 (extend)" 較適合。UML 稱之為 一般化/特殊化更是合理。

閱讀全文 »

Design for Interface 的生活案例-沖煮咖啡的介面設計

** 本文同步發表於 FB 社團-軟體設計鮮思維 **

GoF Design Pattern 一書開宗明義即提及:Design for Interface!

軟體的介面設計很重要的一個精神就是:不要重新造輪子!!
如果引用某些 3rd party library/framework 的功能,要懂得利用介面與主系統隔閡掉,如此才能造成 PnP (Plug & Play)的效果。

舉個生活的範例。88度C 的主要服務是銷售糕點與咖啡,其中咖啡服務 (需求分析)需要系統有個結構元素-咖啡機 (結構設計)來實現。

咖啡機的目的是沖煮咖啡 (Interface 規格),而購置某品牌的考量可能有:1.成本低 2.穩定/快速 3.好喝

如果購買的 A牌咖啡可能故障或沒達成上述需求,那麼就直接抽換掉,可能送修或改購置另一品牌的咖啡機即可 (但前提是不應影響到主系統的服務)。

咖啡機故障/效能不佳等因素,88度C 這個系統的設計/開發人員不可能也沒必要把咖啡機打開去維修或更改電路/零件吧?

現實生活上應用這類介面規範的案例非常多,主機板透過 PCI Express (介面)可插入各品牌顯示卡即是一例。(主機板設計人員不用考量顯卡的實作)

但回歸軟體資訊系統,不懂得介面設計,直接侵入 (hack)到 3rd party library/framework,想要把輪子改得更好甚或重新造輪子。這樣不僅耗工做沒啥意義的事情,且造成主系統與這些 3rd party 的嚴重耦合 (coupling),導致不容易/無法抽換,因而造成主系統的主要服務更為僵化難以應變的後果!

圖、範例-從Twitter畫面操作找出 Use Cases

圖、範例-沖煮咖啡的介面設計

軟體思維顧問

專職軟體輔導與教育訓練的獨立顧問。輔導企業資訊單位如何有效組織系統開發與維護;輔導開發人員達成有效的專業分工。傳授如何把軟體作軟 (Keeping Software Soft)的技能,得以提昇系統的彈性/延展,並進而創造系統的再利用價值。

Personal