From Wikipedia, the free encyclopedia
程式編寫範式(英文: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)
喺廿一世紀初,資訊科技工作上有好多隻唔同嘅程式語言,比較出名嘅有 Python、Java(包括 Processing)、JavaScript、C 同埋 C# 呀噉。唔同嘅程式語言偏重嘅功能都唔同,所以喺「抽象化咗啲乜」呢點上都唔同,例如
circle(224, 184, 220)
噉嘅一行碼就畫個圓形出嚟-即係將「畫圓形」當中涉及嗰一大拃運算抽象化,整做一句陳述式 circle()
[3];第啲程式語言,多數因為唔係設計嚟整圖像嘅,所以冇啲噉嘅功能;噉即係話一套程式編寫範式可以想像成一拃成日畀人一齊用嘅功能,呢啲功能協作達致畀用家透過某套「處理方法」嚟解決編程上嘅問題[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:
If
冇事件發生,繼續處於事件迴圈;If
有事件發生(trigger),睇吓件事件係乜事,按事先講定嘅法則,決定要做乜(事件處理器;event handler);例如想像一個遊戲程式-
例如廿一世紀初嘅遊戲編程就成日都會用到 EDP。
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.