您好,登錄后才能下訂單哦!
這篇文章主要講解了“如何理解聲明式與命令式代碼”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何理解聲明式與命令式代碼”吧!
命令式編程
命令式編程是我們從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代碼告訴瀏覽器不顯示瀏覽器圖像就顯示烏龜圖像。聲明式代碼通常避免狀態和變量的突變。
特定于域的代碼
特定領域的語言不是圖靈完整的,這意味著它們無法完成其他圖靈完整的語言可以做的所有事情。例如,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 => ( <h2>Hello, {props.userName}</h2> };
特定領域語言的示例是SQL(1974),HTML(1993),CSS(1996)和XML(1996)。
邏輯編程
邏輯編程是基于形式邏輯的聲明性范式。程序是一組邏輯形式的句子,表達有關某些問題領域的事實和規則。
圖靈完備的最典型的邏輯編程語言是Prolog(1972)。這意味著理論上可以用C語言編寫的所有內容,也可以在Prolog中編寫。
Prolog基于定義謂詞的謂詞,這些謂詞定義了它們的參數之間的關系。
food(salad). % <- salad is food fact food(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)。
感謝各位的閱讀,以上就是“如何理解聲明式與命令式代碼”的內容了,經過本文的學習后,相信大家對如何理解聲明式與命令式代碼這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。