宣告式和指令式開發 Declarative and Imperative Paradigm

Chao-Wei Peng
Jan 29, 2021

在花時間處理這個只能在軟體工程師的小圈圈中討論的主題之前,先讓我們抽離工程師的角色,把視野放大、拉遠一些。

軟體工程師之於整個社會的專業在於:我們能利用程式語言,指揮電腦,解決各式各樣的問題,而其他人在這方面的能力比較薄弱或受到極大的限制。

在我們解決問題的過程中,會自然的發展出以下兩個階段:

  1. 撰寫程式,解決問題。
  2. 思考不同撰寫程式的方法,是否有助於更好的解決問題。

而我們今天要討論的主題,落在工程師發展的第二階段。

富有經驗的軟體工程師,經常能使用好幾種方式,解決相同的問題。經過長時間的累積之後,我們歸納出兩種程式的撰寫模式:宣告式 Declarative指令式 Imperative

以下簡單的說明這兩種模式的基本觀念,並使用 JavaScript 提供幾個範例讓大家參考。注意,每個範例提供的兩種程式碼,都解決相同的問題。

宣告開發模式 Declarative Paradigm

程式碼傾向被理解成抽象的、高層次的、容易被人類接受的整合式概念。

指令開發模式 Imperative Paradigm

程式碼傾向被理解成具體的、低層次的、能被清楚拆解的基礎命令集合。

範例一:物件的表達方法

宣告式 Declarative

let man={
"name":"Bob",
"age":18
};

指令式 Imperative

let man=new Object();
man.name="Bob";
man.age=18;

範例二:使用者介面的表達方法

宣告式 Declarative

<a target="_blank" href="https://www.google.com/">Google</a>

指令式 Imperative

let link=document.createElement("a");
link.target="_blank";
link.href="https://www.google.com/";
link.textContent="Google";

範例三:資料處理的程序

宣告式 Declarative

let data=[2, 1, 5, 0];
data=data.map((value)=>(value*2));
console.log(data); // [4, 2, 10, 0]

指令式 Imperative

let data=[2, 1, 5, 0];
for(let i=0;i<data.length;i++){
data[i]=data[i]*2;
}
console.log(data); // [4, 2, 10, 0]

範例四:篩選資料的程序

宣告式 Declarative

let data=[2, 1, 5, 4];
let results=data.filter((value)=>(value>3));
console.log(results); // [5, 4]

指令式 Imperative

let data=[2, 1, 5, 4];
let results=[];
for(let i=0;i<data.length;i++){
if(data[i]>3){
results.push(data[i]);
}
}
console.log(results); // [5, 4]

以上說明供參考,彭彭不想在這裡下任何結論,歡迎大家留言給我,說說你的程式撰寫偏好 :)

--

--