程式編寫範式

(由編程範式跳轉過嚟)

程式編寫範式英文programming paradigm),簡稱編程範式,係電腦程式編寫上嘅一個概念。一套編程範式指一套做程式編寫嘅「大方向」。

基礎概念

編輯

最簡單噉講,一套程式編寫範式可以想像成一種做程式編寫嘅「處理方法」[1]

抽象化

編輯
 
一個用 C 寫嘅 Hello World 程式;就算用家識嗮 C 嗰啲陳述式,佢都可以完全唔知部電腦內部嗰啲 01 運算係點做嘅-C 將啲 01 運算抽象化咗。

原則上,無論一個電腦程式用咩程式語言寫,部電腦內部實際上都係行緊機械碼。程式語言做嘅,係將電腦做緊嘅運算抽象化(abstraction)[2]

例子可以想像部電腦,部機識用 add() 將兩個埋,即係

 add(1,2) 會得出 3
 add(3,4) 會得出 7

... 如此類推。噉「攞   個數,當中  ,將啲數冚唪唥加埋嗮一齊」呢樣運算作業查實可以想像成-

  1. add() 將第 1 個數同第 2 個數加埋,得出個數叫 s
  2. add()s 同第 3 個數加埋,得出嘅數擺落 s

... 一路做到加埋嗮啲數為止;想像家陣隻程式語言將 add() 同埋啲必需嘅數據操作功能(例如係「將啲數據記落啱嘅記憶體地址度」)「包埋一嚿」整做 sum() 呢句陳述式(抽象化),句嘢會叫部電腦將 () 入面嗰拃數加埋嗮一齊;噉用家寫程式就可以寫

 x = sum(1,2,3,4) # 將 x 設做 1 2 3 4 加埋得出嘅值。

而唔使寫

 x = add(1,2)
 x = add(x,3)
 x = add(x,4)

咁撈絞。抽象化係電腦科學上非常重要嘅一部份,令啲人寫程式嗰陣方便好多[2]

程式語言

編輯
内文:程式語言

喺廿一世紀初,資訊科技工作上有好多隻唔同嘅程式語言,比較出名嘅有 PythonJava(包括 Processing)、JavaScriptC 同埋 C# 呀噉。唔同嘅程式語言偏重嘅功能都唔同,所以喺「抽象化咗啲乜」呢點上都唔同,例如

  • Processing 呢隻語言係專門設計嚟整圖像嘅,所以會有(例如)陳述式畀用家用 circle(224, 184, 220) 噉嘅一行就畫個圓形出嚟-即係將「畫圓形」當中涉及嗰一大拃運算抽象化,整做一句陳述式 circle() [3];第啲程式語言,多數因為唔係設計嚟整圖像嘅,所以冇啲噉嘅功能;
  • 又例如如果話「Python 支援物件導向編程(OOP)」嘅話,即係話 Python 提供咗拃陳述式,方便用家用 OOP 呢種編程範式成日用到嗰啲功能(例如 OOP 成日會用到「建立物件」噉),而唔支援 OOP 嘅程式語言就好可能係冇呢啲陳述式,所以唔方便用家用 OOP 寫程式[4]

噉即係話一套程式編寫範式可以想像成一拃成日畀人一齊用嘅功能,呢啲功能協作達致畀用家透過某套「處理方法」嚟解決編程上嘅問題[5]。從事寫程式相關工作嘅人(例如軟件工程師噉),往往需要知道自己做緊嘅工作要用邊種編程範式,並且揀返隻啱用嘅程式語言[6]

指令式

編輯

指令式編程(imperative programming)寫嘅程式,重點在於要向部電腦畀一連串嘅指示,教部電腦點樣一步一步噉改變自己嘅狀態,由初頭(咩問題都未解決)嘅狀態去到最終(如果個程式寫得無誤,會係問題成功解咗)嘅狀態[7]

指令式編程成日畀人當係宣告式編程嘅相對。

物件導向

編輯

物件導向編程(object-oriented programming,OOP)係一種常用嘅指令式編程範式,指建構程式嗰陣用「物件」(object)嚟去做基本單元:個程式會有一個個嘅類別(class),每個類別會若干個實例(instance),每個物件都係一個實例,會有若干份資料,而且每件同一類別嘅物件有嘅變數都一樣[8][9]。例如以下呢段 C++ 碼噉:

class Car { // 「Car」係一個類別。
  public: // Car 嘅每一個實例(每件屬於 Car 嘅物件)都會有以下呢啲變數...
    string brand; // 牌子
    string model; // 型號
    int year; // 年份
};

呢種做法喺好多應用上都好幫到手令個程式更加容易打理,例:一位電子遊戲製作師喺度編寫佢隻新遊戲遊戲程式,佢想創造一個遊戲世界俾玩家喺裏面移動;佢想個虛擬世界設計成好似一個現實嘅城市噉,度緊個城市其中一條街要點設計,佢想條街有幾架車泊咗喺度做背景,佢可以設定一個「車」嘅類別,個類別每個實例都有「色水」同「位置」等嘅變數,然後叫個程式將「建構一個車嘅實例」呢樣嘢做三次-就唔使吓吓都重新打過「建構一個車嘅實例」嘅碼[10]。因為 OOP 咁好使好用,有好多常見嘅程式語言都支援 OOP,包括咗 C++、JavaScript 同埋好多遊戲引擎(game engine)都支援嘅 C#... 等等[11]

 
OOP 嘅例子;如果家陣用家想部電腦顯示四個外形上有少少唔同嘅星形物體,個程式可以將嗰四件物體當成喺「顏色」呢個變數上唔同、但屬同一個類別嘅物件。

宣告式

編輯

函數式

編輯

第啲範式

編輯

結構化

編輯
睇埋:流程控制

結構化編程(structured programming)係一種源自 1950 年代嘅編程範式,旨在透過語法將流程控制嘅結構形式化,令到可以睇到出個程式嘅流程[12]:66, 74,從而令電腦程式更加清晰同高品質。

下面呢段虛擬碼,會令個程式行子程式 a 三次,等個程式員唔使將子程式 a 段碼寫三次,可以慳返啲位[13]

  子程式 a
    講好個子程式包含乜陳述式

  行子程式 a
  行子程式 a
  行子程式 a

如果冇咗子程式嘅使用,呢段碼就會變成[14]

  子程式 a 嗰柞陳述式
  子程式 a 嗰柞陳述式
  子程式 a 嗰柞陳述式

冇子程式嘅做法有多種唔好處:個編程員喺編程嗰陣要重複將同一段碼寫幾次;如果佢想改子程式 a 入面嘅陳述式,佢就要改成三次(而用咗子程式做法嘅情況淨係需要改一次);喺現實嘅程式製作當中,一個程序閒閒地可以需要重用十次以上,所以子程式嘅使用慳咗好多時間精神。再普遍啲講,對控制流程嘅運用-結構化編程嘅諗頭-幫編程員慳咗好多時間精神[14]

事件驅動

編輯

事件驅動編程(event-driven programming,EDP)用事件主導程式嘅流動。

EDP 上講嘅「事件」,係指由隻軟件留意到嘅一個行動或者一件事件,例如係「踎士左掣畀人撳咗」或者「鍵盤上邊個邊個掣畀人撳咗」... 呀噉。唔跟 EDP 嘅程式通常會係噉嘅[15][16]:p.5

而跟 EDP 嘅程式望落會比較似以下噉嘅流程[16][17]:p.1

  • 開始、
  • 進入事件迴圈(event loop)
  • If 冇事件發生,繼續處於事件迴圈;
  • If 有事件發生(trigger),睇吓件事件係乜事,按事先講定嘅法則,決定要做乜(事件處理器;event handler);例如想像一個遊戲程式
    • 假想個程式設定咗「如果玩家撳咗 A 掣,玩家角色就起跳,然後程式返去事件迴圈」;
    • 假想個程式設定咗「如果玩家撳咗 esc,就結束程式」;

例如廿一世紀初嘅遊戲編程就成日都會用到 EDP。

睇埋

編輯
  1. Programming Paradigms (PDF).
  2. 2.0 2.1 Iverson, K. E. (1962, May). A programming language (PDF). In Proceedings of the May 1-3, 1962, spring joint computer conference (pp. 345-351).
  3. circle(). Processing.
  4. Is Python object-oriented?. Towards Data Science.
  5. Introduction of Programming Paradigms. GeeksForGeeks.
  6. Programming Languages: how to choose the best one. code motion.
  7. "Imperative programming: Overview of the oldest programming paradigm". IONOS Digitalguide. Retrieved 2022-05-03.
  8. Kindler, E.; Krivy, I. (2011). "Object-Oriented Simulation of systems with sophisticated control". International Journal of General Systems: 313–343.
  9. Lewis, John; Loftus, William (2008). Java Software Solutions Foundations of Programming Design (6th ed). Pearson Education Inc. ISBN 978-0-321-53205-3., section 1.6 "Object-Oriented Programming".
  10. Quick Tip: Intro to Object-Oriented Programming for Game Development.
  11. Jacobson, Ivar (1992). Object-Oriented Software Engineering: A Use Case-Driven Approach. Addison-Wesley.
  12. Sethi, Ravi (1990) [1989]. Programming Languages: Concepts and Constructs. Reading, MA: Addison-Wesley. ISBN 0-201-10365-6.
  13. Wheeler, D. J. (1952). "The use of sub-routines in programmes". Proceedings of the 1952 ACM national meeting (Pittsburgh) on - ACM '52.
  14. 14.0 14.1 Dijkstra, E. W. (1970). Notes on structured programming.
  15. Woodworth, P., & Dann, W. (1999). Integrating console and Event-Driven models in CS1. ACM SIGCSE Bulletin, 31(1), 132-135.
  16. 16.0 16.1 COMP6700/2140 GUI and Event Driven Programming (PDF).
  17. Dabek, F., Zeldovich, N., Kaashoek, F., Mazieres, D., & Morris, R. (2002, July). Event-driven programming for robust software (PDF). In Proceedings of the 10th workshop on ACM SIGOPS European workshop (pp. 186-189).