程式編寫範式
程式編寫範式(英文:programming paradigm),簡稱編程範式,係電腦程式編寫上嘅一個概念。一套編程範式指一套做程式編寫嘅「大方向」。
基礎概念
編輯最簡單噉講,一套程式編寫範式可以想像成一種做程式編寫嘅「處理方法」[1]。
抽象化
編輯原則上,無論一個電腦程式用咩程式語言寫,部電腦內部實際上都係行緊機械碼。程式語言做嘅,係將電腦做緊嘅運算抽象化(abstraction)[2]。
例子可以想像部電腦,部機識用 add()
將兩個數加埋,即係
add(1,2) 會得出 3 add(3,4) 會得出 7
... 如此類推。噉「攞 個數,當中 ,將啲數冚唪唥加埋嗮一齊」呢樣運算作業查實可以想像成-
- 用
add()
將第 1 個數同第 2 個數加埋,得出個數叫s
; - 用
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]。
程式語言
編輯喺廿一世紀初,資訊科技工作上有好多隻唔同嘅程式語言,比較出名嘅有 Python、Java(包括 Processing)、JavaScript、C 同埋 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]。
宣告式
編輯函數式
編輯第啲範式
編輯結構化
編輯結構化編程(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);例如想像一個遊戲程式-
例如廿一世紀初嘅遊戲編程就成日都會用到 EDP。
睇埋
編輯攷
編輯- ↑ Programming Paradigms (PDF).
- ↑ 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).
- ↑ circle(). Processing.
- ↑ Is Python object-oriented?. Towards Data Science.
- ↑ Introduction of Programming Paradigms. GeeksForGeeks.
- ↑ Programming Languages: how to choose the best one. code motion.
- ↑ "Imperative programming: Overview of the oldest programming paradigm". IONOS Digitalguide. Retrieved 2022-05-03.
- ↑ Kindler, E.; Krivy, I. (2011). "Object-Oriented Simulation of systems with sophisticated control". International Journal of General Systems: 313–343.
- ↑ 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".
- ↑ Quick Tip: Intro to Object-Oriented Programming for Game Development.
- ↑ Jacobson, Ivar (1992). Object-Oriented Software Engineering: A Use Case-Driven Approach. Addison-Wesley.
- ↑ Sethi, Ravi (1990) [1989]. Programming Languages: Concepts and Constructs. Reading, MA: Addison-Wesley. ISBN 0-201-10365-6.
- ↑ Wheeler, D. J. (1952). "The use of sub-routines in programmes". Proceedings of the 1952 ACM national meeting (Pittsburgh) on - ACM '52.
- ↑ 14.0 14.1 Dijkstra, E. W. (1970). Notes on structured programming.
- ↑ Woodworth, P., & Dann, W. (1999). Integrating console and Event-Driven models in CS1. ACM SIGCSE Bulletin, 31(1), 132-135.
- ↑ 16.0 16.1 COMP6700/2140 GUI and Event Driven Programming (PDF).
- ↑ 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).