01.「模組化」、「抽象化」、「繼承與多態」、「組合概念

理解「模組化」、「抽象化」、「繼承與多態」、「組合」這些概念對於軟體設計非常重要,
但的確一開始接觸時會讓人感到模糊。我會用簡單的例子和生活化的類比來幫助你更清楚地理解這些概念,
以及如何在專案中應用它們。

1. 模組化(Modularization)

簡單來說:把大事情拆成小事情,每個小事情專注做一件事。

例子:
想像你要做一份大餐。整個過程會包括「煮飯」、「炒菜」、「做甜點」等。如果你把所有步驟放在一起,你會很難管理。但如果你把每個步驟分開成模組,像是「煮飯模組」、「炒菜模組」、「甜點模組」,每個模組只專注做一件事,那麼大餐就變得更容易準備。這樣一來,未來想煮別的菜時,你可以重複使用「炒菜模組」而不需要重頭開始。

在程式中,模組化的做法就是將功能分解成小的、獨立的模組或函數。每個模組解決一個具體的問題,這樣的代碼更容易維護和重複使用。

2. 抽象化(Abstraction)

簡單來說:只告訴我怎麼用,不告訴我細節。

例子:
當你開車時,你只需要知道怎麼操作方向盤、油門和剎車,卻不需要知道引擎內部是如何運作的。這就是抽象化。你使用一個簡單的接口(方向盤、油門、剎車),而不用理解內部的複雜細節。

在程式設計中,抽象化就是把複雜的細節隱藏起來,只暴露出簡單的使用方法。比如,你可以定義一個函數 calculateTotal(),裡面可能包含複雜的運算邏輯,但使用這個函數的人不需要知道具體怎麼算,只需要知道這個函數會回傳總和。

3. 繼承與多態(Inheritance and Polymorphism)

簡單來說:兒子繼承爸爸的財產(屬性和行為),但兒子可以有自己的特點。

例子:
想像你有一個「動物」類別,動物可以「走路」和「發出聲音」。如果你有具體的動物,比如「狗」和「貓」,牠們可以繼承動物的基本行為(比如走路),但它們可以有不同的聲音。狗會「汪汪叫」,貓會「喵喵叫」。

在程式中,繼承允許你將相同的邏輯放在父類別中,子類別可以繼承並覆寫部分行為。多態則允許你用相同的方式對待不同的類別,比如你可以寫一個函數接受「動物」,而不管它是狗還是貓,你都可以讓它發出聲音。

4. 組合(Composition)

簡單來說:用現有的部件,組裝出新的東西。

例子:
如果你想組裝一個新電腦,你不會自己製造每個零件,而是使用現有的部件(比如 CPU、主板、顯示器等),然後組合它們,形成一個完整的電腦。這就是組合的概念。

在程式設計中,組合就是將現有的類別或對象組合起來,形成更複雜的功能,避免過度依賴繼承。比如,你有一個「通知」模組,它可以發送 Email 或 SMS。你可以將「通知」和「用戶資料」組合在一起,實現用戶通知系統,而不用讓「用戶」類別去繼承「通知」類別。


在專案中的應用

假設你在開發一個「異動類別主檔維護」的模組,這個模組需要操作資料庫,進行資料的查詢、更新、刪除等操作。你可以用這些概念來設計你的系統:

  1. 模組化:將不同的功能分割成模組。比如,將「資料庫操作」與「UI顯示」分開。這樣一來,如果將來換了資料庫,只需要修改資料庫模組,而不用改變整個系統。

  2. 抽象化:定義一些接口(interface)或抽象類別(abstract class),讓其他模組使用。例如,你可以抽象出一個 Repository 類別,提供 GetData()UpdateData() 等方法。具體怎麼查資料庫,讓具體的實現類別去處理,這樣系統的其他部分只需關心怎麼調用這些方法。

  3. 繼承與多態:如果你有不同類型的「異動類別」,可以定義一個「異動類別」的父類,讓不同的子類去實現具體的邏輯。比如,有些異動需要審核,有些不需要,你可以讓具體的類別去覆寫這個邏輯。

  4. 組合:如果異動類別需要跟其他模組(例如通知系統)協作,你可以透過組合將這些模組整合在一起,而不是讓異動類別去繼承通知功能。這樣可以保持模組的獨立性和靈活性。


總結

  • 模組化:將大問題拆成小問題,讓每個模組專注解決一個功能。
  • 抽象化:把細節藏起來,暴露簡單的接口讓使用者調用。
  • 繼承與多態:用繼承重用代碼,用多態實現靈活的行為變化。
  • 組合:將不同功能的模組組裝起來,而不是用繼承來擴展功能。

實際上,這些設計模式常常會一起使用,隨著經驗增加,你會慢慢找到適合的方式在不同情況下應用它們。