在程式歷史的進程中,就像是動物歷史一樣,是在漫漫的演變當中前進。動物會根據環境最適者生存,程式也會慢慢演進,根據環境、硬體資源等原因逐漸找出一個pattern是最適合某個條件的。Programming paradigm 就是指總結出來經典的程式典範,主要分成兩大類指令式(Imperative programming paradigm
)、宣告式(Declarative programming paradigm
),裡面又會再細分不同的種類。
指令式,顧名思義就是一步步告訴程式如何運作,運用條件(if、switch)、迴圈(for)來做流程控制,會有變數(variable)來記錄狀態,這通常也是剛接觸程式所先學習到的,其優點也是可以具象化需求、容易想像也比較容易撰寫,適合入門使用。做為Java開發者最耳熟能詳的物件導向程式設計(Object oriented programming
)也是屬於指令式。
宣告式/聲明式,較為抽象,相對於指令式的繁瑣,宣告式重點在於目標而不是流程。在學習這部分的時候我一直用Java角度來思考就會很難理解,這邊建議用SQL查詢來思考就單純的多,只需要SELECT * FROM
就可以查詢資料庫,不需要知道資料庫背後運作的流程與細節,還有後面會介紹到的Funtional Programming
、Reactive Programming
,也都是宣告式,自己認為語言本身要有一定程度支援才能寫出宣告式的程式。
通常只看到定義還是會很難了解差異,這邊列出我整理出來的比較表
用簡單的範例來比較,有一個1~10的list,印出其中是偶數的部分,指令式透過for
迴圈搭配if
,聲明式透過stream
、filter
、forEach
的方式。
public static void main(String[] args) {
List<Integer> data = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> result = new ArrayList<>();
for (int i = 0; i < data.size(); i++) {
if ((data.get(i)) % 2 == 0) {
result.add(data.get(i));
}
}
for (int i = 0; i < result.size(); i++) {
System.out.println(result.get(i));
}
}
public static void main(String[] args) {
List<Integer> data = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
data
.stream()
.filter(i -> i % 2 ==0)
.forEach(System.out::println);
}
本篇主要是簡單介紹一下Programming paradigm,可以在後面幫助了解Reactive Programming,指令式與宣告式這兩種沒有絕對的誰優誰劣,取決於需求與環境,下一篇會來介紹Funtional Programming
。