歡迎來到程式設計範式(Programming Paradigms)的世界!

你好!今天我們要深入探討程式設計範式。別被這個華麗的名稱嚇到——範式(Paradigm)其實就是編寫電腦程式的一種「風格」或「思維方式」。

想像你在蓋房子。你可以一塊磚一塊磚地蓋(程序式),也可以買現成的房間組件拼裝起來(物件導向)。兩種方式都能蓋出房子,但你思考項目的思路卻截然不同。本章將探討 AQA A Level 課程中最重要的兩種風格:程序式(Procedural)物件導向(Object-Oriented)

1. 什麼是程式設計範式?

簡單來說,程式設計範式是根據程式語言的特性及其結構化代碼的方式,對程式語言進行的分類。

快速複習: - 程序式(Procedural): 著重於邏輯動作(動詞)。 - 物件導向(OOP): 著重於資料物件(名詞)。

2. 程序導向程式設計(Procedural-Oriented Programming)

程序式程式設計就像食譜。你從頂部開始,按順序執行一系列指令(程序或子程序),直到抵達結尾。它採用結構化方法來進行程式設計。

結構化方法

這意味著將一個龐大且複雜的問題拆解成更小、易於管理的部分。這通常稱為由上而下設計(top-down design)

核心特性: - 序列(Sequence): 一個接一個地執行指令。 - 選擇(Selection): 使用 IF 語句來作決策。 - 疊代(Iteration): 使用迴圈(FOR, WHILE)來重複執行任務。 - 子程序(Subroutines): 為一段代碼命名,以便可以重複使用。

階層圖(Hierarchy Charts)

當我們設計程序式程式時,會使用階層圖。它們看起來像家族樹,主程式位於最頂端,並向下分支出更小的子任務。

範例: 一個「遊戲」頂層模組可以分支為「初始化圖形」、「玩家輸入」和「更新分數」。

結構化方法的優點

1. 易於除錯(Debugging): 由於代碼被拆分為小區塊,更容易精確找出錯誤藏在哪裡。 2. 代碼重用: 你可以編寫一次程序,然後多次使用它。 3. 團隊協作: 不同的程式設計師可以同時處理不同的子任務。

重點總結: 程序式程式設計在於「做(doing)」。它利用由上而下、結構化的方法,將大問題拆解為較小的程序。

3. 物件導向程式設計(Object-Oriented Programming, OOP)

OOP 有點不同。與其關注解決問題的步驟,我們更關注參與其中的「事物」(物件)。

如果一開始覺得有點難懂,別擔心! 大多數學生在看過幾個例子之前,都會覺得 OOP 的概念有點「顛倒」。

三大核心:類別(Class)、物件(Object)與實例化(Instantiation)

- 類別(Class): 一種藍圖或模板。它定義了物件將擁有什麼資料,以及它能做什麼。 - 物件(Object): 從藍圖構建出來的具體「事物」。 - 實例化(Instantiation): 將類別實際轉化為物件的過程。

類比: 類別就像餅乾模具。物件就是實際做出來的餅乾。實例化就是把模具壓入麵糰做出餅乾的動作!

OOP 的核心概念

  • 封裝(Encapsulation): 隱藏物件的內部資料,僅允許透過特定的方法進行存取。這能保護資料免受意外修改。可以把它想像成保護藥物的膠囊
  • 繼承(Inheritance): 當一個新類別(子類別)繼承了現有類別(父類別)的屬性和方法。
    範例: 狗(Dog)類別可以繼承自動物(Animal)類別。狗「是一種」動物。
  • 多型(Polymorphism): 意指「多種形態」。它允許不同的類別擁有名稱相同但行為不同的方法。
  • 覆寫(Overriding): 當子類別用自己的版本取代從父類別繼承來的方法。
    範例: 貓(Cat)狗(Dog)都繼承了 makeNoise() 方法,但狗將其覆寫為「汪汪」,而貓則將其覆寫為「喵喵」。

關係:聚合(Aggregation)與組成(Composition)

物件之間經常互相互動。我們使用兩種主要的「具有(has-a)」關係:

1. 聚合(Aggregation): 一種「弱」關係。如果父物件被銷毀,子物件依然可以存在。
範例: 圖書館(Library)書籍(Books)。如果圖書館關閉,書本依然存在。
UML 符號:白色(空心)菱形線條表示。

2. 組成(Composition): 一種「強」關係。如果父物件被銷毀,子物件也會隨之消失。
範例: 建築物(Building)與其房間(Rooms)。如果建築物被拆毀,房間也就不復存在了!
UML 符號:黑色(實心)菱形線條表示。

你知道嗎? 使用組成而非繼承通常更好,因為它能讓你的代碼更具彈性。這是一個常見的考試提示!

4. OOP 設計原則

為了編寫「優質」的 OOP 代碼,你應該遵循課程大綱中提到的這三個原則:

  1. 封裝變動之處(Encapsulate what varies): 如果程式的某部分經常更動,將其放入獨立的類別中,這樣就不會影響其他部分。
  2. 優先使用組成而非繼承(Favor composition over inheritance): 將物件由其他物件組成(組成)通常比建立冗長複雜的家族樹(繼承)更容易。
  3. 針對介面編程,而非實作(Program to interfaces, not implementation): 關注物件應該「做什麼」,而不是精確地「如何做」。

5. 編寫與表示 OOP

在考試中,你可能需要詮釋或繪製類別圖(Class Diagrams)

存取修飾符(Access Specifiers)

這些修飾符告訴我們誰可以看見類別內的資料或方法: - 公開(Public, +): 任何人皆可存取。 - 私有(Private, -): 只有類別本身可以存取。(最適合實現封裝!) - 受保護(Protected, #): 只有該類別及其「子類別」可以存取。

方法類型

  • 靜態(Static): 屬於類別本身而非特定物件的方法。你可以在不建立物件的情況下直接使用它。
  • 虛擬(Virtual): 一種「可以」被子類別覆寫的方法。
  • 抽象(Abstract): 一種「必須」被覆寫的方法,因為它本身沒有代碼——它只是一個佔位符。

重點總結: OOP 著重於「事物」。它利用類別(藍圖)建立物件,並透過繼承、多型與封裝來互相溝通。

總結清單

快速複習: - 你能解釋類別與物件的區別嗎? - 你知道白色菱形(聚合)與黑色菱形(組成)的區別嗎? - 你能列出程序式程式設計中結構化方法的優點嗎? - 你記得 + 代表公開,而 - 代表私有嗎?

別慌張! 這些術語需要多加練習。嘗試為一個簡單的系統繪製類別圖,例如「學校」(包含學生與教師類別),這能幫助你牢記這些概念!