程式設計正規化中的術語和差異
> Image source: Author
信不信由你,你可能已經以開發人員的身份使用了多種程式設計範例。因為沒有什麼比用程式設計理論招待朋友更有趣的了,所以這篇文章可以幫助您認識程式碼中的流行範例。
指令式程式設計指令式程式設計是我們從Assembly(1949)開始並以諸如C,C ++,C#,PHP和Java之類的語言繼續的方式。過程和麵向物件的程式設計屬於命令式正規化。
程式碼基於透過告訴計算機如何執行操作來更改程式狀態的語句。換句話說,程式碼基於定義變數並更改這些變數的值。
對於那些告訴機器如何思考的人,他們擁有不亞於天真的戀物癖的人,這是理想的程式設計範例。
過程程式設計程式程式碼使用過程來管理其結構。過程只是一組按特定順序執行的操作,可以重複呼叫這些操作,而不必使用goto命令進行跳轉。
#include <stdio.h>int main(){ int num1, num2, num3; int *p1, *p2, *p3; //taking input from user printf("Enter First Number: "); scanf("%d",&num1); printf("Enter Second Number: "); scanf("%d",&num2); printf("Enter Third Number: "); scanf("%d",&num3); //assigning the address of input numbers to pointers p1 = &num1; p2 = &num2; p3 = &num3; if(*p1 > *p2) { if(*p1 > *p3){ printf("%d is the largest number", *p1); }else{ printf("%d is the largest number", *p3); } }else{ if(*p2 > *p3){ printf("%d is the largest number", *p2); }else{ printf("%d is the largest number", *p3); } } return 0;}
上面的C語言示例讀取三個數字,使用指標,並透過條件邏輯驅動程式流,以確定三個數字中的最大數字。像C這樣的過程語言可以提供一個非常簡單且非常高效的解決方案,以應對應用程式挑戰。
通常,需要從上至下閱讀每個過程以瞭解其作用。有時可能會批評過程程式設計師編寫義大利麵條程式碼的趨勢。但是,任何不依賴義大利麵條和番茄醬做晚餐的大學生,生活都很輕鬆。
過程程式語言的示例是Pascal(1970)和C(1972)。過程程式設計具有強大的支援。Linux之父Linus Torvalds對C ++和麵向物件程式設計的批評一直很開放。
面向物件程式設計面向物件程式設計是對具有內部狀態的物件進行建模。然後,程式設計程式碼基於這些物件之間的關係。在基於分類的語言中,物件是類的例項。
物件方法中的程式碼仍然是命令性的,並且基於修改狀態的語句。
public interface Retile { void walk();}public class Turtle implements Reptile { @Override public void walk() { System.out.println("Turtle is walking!"); }}public class Tortoise implements Reptile { @Override public void walk() { System.out.println("Tortoise is walking!"); }}public class ReptileFactory { public Reptile getReptile(String reptileType){ if(reptileType == null){ return null; } if(reptileType.equalsIgnoreCase("TURTLE")){ return new Turtle(); } else if(shapeType.equalsIgnoreCase("TORTOISE")){ return new Tortoise(); } return null; }}public class ReptileDemo { public static void main(String[] args) { ReptileFactory reptileFactory = new ReptileFactory(); Reptile reptile = Reptile.getReptile("TURTLE"); reptile.walk(); }}
上面是用Java實現的工廠設計模式的示例。注意所有程式碼如何集中於定義類並透過介面使用它們之間的關係。通常,所有這些類都將被分離到各自的檔案中。
面嚮物件語言的示例包括Smalltalk(1972),C ++(1985),Python(1991),Java(1995),JavaScript(1995),Ruby(1995),C#(2000),Scala(2004)和Swift(2014)。
JavaScript最初是基於原型的,沒有類的面嚮物件語言。在2015年的ECMAScript 6中添加了類。
在學習程式設計時,在所有範例中,最有可能會遇到面向物件的程式碼。儘管它是最流行的範例,但由於其複雜性,理解設計模式的難度以及整個應用程式中棘手的狀態管理,它仍然遭到嚴重的批評。同時,面向物件的程式語言非常成熟並且受到專業人士的讚賞。
在JavaScript中,前端框架Angular是C#的一個很好的例子,它對希望將更強的面向物件原理引入Web開發的開發人員有很大的影響。
請繼續在所有專案中使用面向物件的程式設計。因為如果不這樣做,所有隻知道這一範例的人都會突然失業,然後住在紙板箱中。而且你不想為此承擔責任,對嗎?
宣告式程式設計宣告性程式碼非常普遍,並且由領域特定的,邏輯和功能性程式語言表示。這些示例包括HTML,SQL,F#,Prolog和Lisp。
宣告性程式碼專注於在不新增方式的情況下說出什麼的表示式。例如,HTML程式碼<img src =" ./ turtle.jpg" />告訴瀏覽器不顯示瀏覽器影象就顯示烏龜影象。宣告式程式碼通常避免狀態和變數的突變。
特定於域的程式碼特定領域的語言不是圖靈完整的,這意味著它們無法完成其他圖靈完整的語言可以做的所有事情。例如,C#(命令式)和F#(宣告式)都是圖靈完備的語言,可以用一種語言開發的所有內容,也可以用另一種語言開發。HTML並非圖靈完整的,並且僅允許做特定的事情。
在資料庫中查詢員工及其經理的SQL程式碼示例:
SELECT e.name, m.name FROM Employee e, Employee m WHERE e.Employee_id=m.Manager_id;
特定領域的語言通常很容易編寫和閱讀。因此,它們是最流行的使用者介面宣告方式。例如,JavaScript程式設計庫React使用JSX定義元件:
const myComponent = props => ( <h1>Hello, {props.userName}</h1>};
特定領域語言的示例是SQL(1974),HTML(1993),CSS(1996)和XML(1996)。
邏輯程式設計邏輯程式設計是基於形式邏輯的宣告性正規化。程式是一組邏輯形式的句子,表達有關某些問題領域的事實和規則。
圖靈完備的最典型的邏輯程式語言是Prolog(1972)。這意味著理論上可以用C語言編寫的所有內容,也可以在Prolog中編寫。
Prolog基於定義謂詞的謂詞,這些謂詞定義了它們的引數之間的關係。
food(salad). % <- salad is food factfood(pizza). % <- pizza is food fact?- food(salad). % <- is salad food? True?- food(turtle). % <- is turtle food? False
在上面的示例中,您定義了導致真實的事實,然後又問了一些導致真實或錯誤的布林值的問題。
請記住,海龜不是食物,有人應該告訴赤裸裸和害怕的飢餓者。
當你使用Prolog工作時,Prolog有點神奇,如果你不同意,那麼你還是個邪惡的傢伙。
函數語言程式設計函數語言程式設計是基於純函式組成的宣告性範例。函數語言程式設計語言是圖靈完備的,並且基於lambda微積分,它是1930年代的一種數學邏輯系統。
純函式是僅依賴於其輸入並且始終提供輸出而不會改變或讀取任何外部狀態的函式。這與過程程式設計大不相同。然後,函式組合是關於按順序一起使用簡單函式來構建程式碼。
在過去的幾年中,函數語言程式設計的流行一直穩步增長,並且已進入指令式程式設計語言。這意味著諸如Python,C ++和JavaScript之類的語言是多正規化的,因為它們支援以多種正規化編寫程式碼。
這是使用@ 7urtle / lambda庫用JavaScript編寫的功能程式碼的示例:
import {upperCaseOf, trim, map, compose, Maybe} from '@7urtle/lambda';const getElement = selector => Maybe.of(document.querySelector(selector));const getText = element => element.textContent;const transformer = compose(trim, upperCaseOf);const getElementText = compose(map(transformer), map(getText), getElement);getElementText('#myTurtle'); // => Maybe('SHELLY')
函式式程式設計帶來了許多面向物件程式設計中沒有的新概念,例如純函式,高階函式,不變性,函子,部分應用程式,無點函式等等。因此,入門的門檻似乎很高,尤其是因為許多函數語言程式設計文章都喜歡深入其數學基礎。我建議看一下簡單的文章,例如@ 7urtle / lambda JavaScript函數語言程式設計基礎知識。https://www.7urtle.com/javascript-functional-programming-basics
只有邪惡的巫師認為函數語言程式設計是不好的。因此,要聰明一點,不要聽他們邪惡的詛咒,而要在他們所屬的木樁上焚燒他們。請記住,如果有人說原子很複雜,那只是假新聞。
函數語言程式設計語言的其他示例是LISP(1984),Haskell(1990)和F#(2005)。
學習你的程式設計技巧實際上,許多程式設計師只熟悉命令式和麵向物件的軟體開發方法。學習其他範例可幫助你成為更好的開發人員,即使你最終不會越過障礙。