今天我們從最不抽象的兩種範式開始介紹,這兩種範式其實是最早、最普遍的程式碼寫法了,相信大家閉著眼睛都會寫,不過從程式碼寫作範式的角度來看待他們,其實別有趣味 !
無論式程序式還是結構化,都包含三大主要元素
循序 (step-by-step)
分支 (if else, switch)
重複 (for, while)
兩種範式最大的差別在於 goto
Procedural Programming 程序式 (循序、分支、重複, 允許
goto
)
Structured Programming 結構化 (循序、分支、重複, 不使用
goto
)
為了避免 goto 太過時大家給忘了,這邊簡單用 C 語言來舉例
#include <stdio.h>
int main(){
printf("counter start\n");
int count = 0;
start:
if(count<10){
printf("count = %d\n",count);
count++;
goto start;
}
printf("counter stop\n");
return 0;
}
執行結果
counter start
count = 0
count = 1
count = 2
count = 3
count = 4
count = 5
count = 6
count = 7
count = 8
count = 9
counter stop
goto 用起來很方便,但是為甚麼 結構化程式設計 刻意的不使用它呢 ? 這是因為在只有循序、分支、重複的世界裡面,我們可以很輕鬆的把原本繁複的流程進行壓縮與重構。
例如上圖,虛線框起來的、同顏色的步驟都可以被當成是一個大步驟。我們可以利用分支與迴圈開始的點來分割程式碼,只要同顏色的色塊經過驗證沒有錯,理論上就算整塊搬去其他地方,再透過分支與迴圈來排列組合,也不會有錯。反之如果我們使用 goto ....
光是看圖都覺得累,更不要說看程式碼了
也因為 goto 實在是太容易被濫用,因此現代化的語言似乎很少看到 goto 了。
相對其他程式碼寫作範式來說,今天介紹的兩種顯得過於直白、簡單、近乎沒有特色,然而無論我們要做物件導向、還是要做響應式設計,這些高度抽象化的設計都需要依賴函示庫、框架、高階語言才能夠達成。追根溯源,我們之所以能有這些方便的工具可以使用,正是前人把這些基礎的、重複的工作做掉了,我們才能站在巨人的肩膀上,享受高度抽象化的快感。
抽象化程度低就意味著程式碼和電腦的實際運作流程是最貼近的,沒有多餘的虛擬機器,沒有多餘的工具與函式庫,我們只要看到程式碼就能大致想像到電腦實際上會怎麼運行這段程式。越是環境受限、越是接近硬體,對這樣的需求越高。舉例來說,我有位同學現在的工作是把密碼學演算法實作到SSD的控制晶片上,乘法器每多一個位元,可能就會增加很多的生產成本,所以如何利用有限的硬體資源把密碼學算法弄上去就變成了他要解決的問題,在這種工作場景下想必是沒有餘力去想甚麼程式碼抽象化的。
最後跟昨天的內容做個對照,結構化相對程序式更容易壓縮,其實也就更容易抽象化,所以我把程序式放在最右上角,結構化放在稍微中間一些
預計明天會往下走,介紹空間上更抽象化的 OOP 與 AOP