編程范式中的術(shù)語(yǔ)和差異 > Image source: Author 信不信由你,你可能已經(jīng)以開發(fā)人員的身份使用了多種編程范例。因?yàn)闆]有什么比用編程理論招待朋友更有趣的了,所以這篇文章可以幫助您認(rèn)識(shí)代碼中的流行范例。 命令式編程命令式編程是我們從Assembly(1949)開始并以諸如C,C ++,C#,PHP和Java之類的語(yǔ)言繼續(xù)的方式。過程和面向?qū)ο蟮木幊虒儆诿钍椒妒健?/p> 代碼基于通過告訴計(jì)算機(jī)如何執(zhí)行操作來更改程序狀態(tài)的語(yǔ)句。換句話說,代碼基于定義變量并更改這些變量的值。 對(duì)于那些告訴機(jī)器如何思考的人,他們擁有不亞于天真的戀物癖的人,這是理想的編程范例。 過程編程程序代碼使用過程來管理其結(jié)構(gòu)。過程只是一組按特定順序運(yùn)行的操作,可以重復(fù)調(diào)用這些操作,而不必使用goto命令進(jìn)行跳轉(zhuǎn)。 #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語(yǔ)言示例讀取三個(gè)數(shù)字,使用指針,并通過條件邏輯驅(qū)動(dòng)程序流,以確定三個(gè)數(shù)字中的最大數(shù)字。像C這樣的過程語(yǔ)言可以提供一個(gè)非常簡(jiǎn)單且非常高效的解決方案,以應(yīng)對(duì)應(yīng)用程序挑戰(zhàn)。 通常,需要從上至下閱讀每個(gè)過程以了解其作用。有時(shí)可能會(huì)批評(píng)過程程序員編寫意大利面條代碼的趨勢(shì)。但是,任何不依賴意大利面條和番茄醬做晚餐的大學(xué)生,生活都很輕松。 過程編程語(yǔ)言的示例是Pascal(1970)和C(1972)。過程編程具有強(qiáng)大的支持。Linux之父Linus Torvalds對(duì)C ++和面向?qū)ο缶幊痰呐u(píng)一直很開放。 面向?qū)ο缶幊?/h2>面向?qū)ο缶幊淌菍?duì)具有內(nèi)部狀態(tài)的對(duì)象進(jìn)行建模。然后,編程代碼基于這些對(duì)象之間的關(guān)系。在基于分類的語(yǔ)言中,對(duì)象是類的實(shí)例。 對(duì)象方法中的代碼仍然是命令性的,并且基于修改狀態(tài)的語(yǔ)句。
上面是用Java實(shí)現(xiàn)的工廠設(shè)計(jì)模式的示例。注意所有代碼如何集中于定義類并通過接口使用它們之間的關(guān)系。通常,所有這些類都將被分離到各自的文件中。 面向?qū)ο笳Z(yǔ)言的示例包括Smalltalk(1972),C ++(1985),Python(1991),Java(1995),JavaScript(1995),Ruby(1995),C#(2000),Scala(2004)和Swift(2014)。 JavaScript最初是基于原型的,沒有類的面向?qū)ο笳Z(yǔ)言。在2015年的ECMAScript 6中添加了類。 在學(xué)習(xí)編程時(shí),在所有范例中,最有可能會(huì)遇到面向?qū)ο蟮拇a。盡管它是最流行的范例,但由于其復(fù)雜性,理解設(shè)計(jì)模式的難度以及整個(gè)應(yīng)用程序中棘手的狀態(tài)管理,它仍然遭到嚴(yán)重的批評(píng)。同時(shí),面向?qū)ο蟮木幊陶Z(yǔ)言非常成熟并且受到專業(yè)人士的贊賞。 在JavaScript中,前端框架Angular是C#的一個(gè)很好的例子,它對(duì)希望將更強(qiáng)的面向?qū)ο笤硪隬eb開發(fā)的開發(fā)人員有很大的影響。 請(qǐng)繼續(xù)在所有項(xiàng)目中使用面向?qū)ο蟮木幊?。因?yàn)槿绻贿@樣做,所有只知道這一范例的人都會(huì)突然失業(yè),然后住在紙板箱中。而且你不想為此承擔(dān)責(zé)任,對(duì)嗎? 聲明式編程聲明性代碼非常普遍,并且由領(lǐng)域特定的,邏輯和功能性編程語(yǔ)言表示。這些示例包括HTML,SQL,F(xiàn)#,Prolog和Lisp。 聲明性代碼專注于在不添加方式的情況下說出什么的表達(dá)式。例如,HTML代碼<img src =' ./ turtle.jpg' />告訴瀏覽器不顯示瀏覽器圖像就顯示烏龜圖像。聲明式代碼通常避免狀態(tài)和變量的突變。 特定于域的代碼特定領(lǐng)域的語(yǔ)言不是圖靈完整的,這意味著它們無法完成其他圖靈完整的語(yǔ)言可以做的所有事情。例如,C#(命令式)和F#(聲明式)都是圖靈完備的語(yǔ)言,可以用一種語(yǔ)言開發(fā)的所有內(nèi)容,也可以用另一種語(yǔ)言開發(fā)。HTML并非圖靈完整的,并且僅允許做特定的事情。 在數(shù)據(jù)庫(kù)中查找員工及其經(jīng)理的SQL代碼示例: SELECT e.name, m.name FROM Employee e, Employee m WHERE e.Employee_id=m.Manager_id; 特定領(lǐng)域的語(yǔ)言通常很容易編寫和閱讀。因此,它們是最流行的用戶界面聲明方式。例如,JavaScript編程庫(kù)React使用JSX定義組件:
特定領(lǐng)域語(yǔ)言的示例是SQL(1974),HTML(1993),CSS(1996)和XML(1996)。 邏輯編程邏輯編程是基于形式邏輯的聲明性范式。程序是一組邏輯形式的句子,表達(dá)有關(guān)某些問題領(lǐng)域的事實(shí)和規(guī)則。 圖靈完備的最典型的邏輯編程語(yǔ)言是Prolog(1972)。這意味著理論上可以用C語(yǔ)言編寫的所有內(nèi)容,也可以在Prolog中編寫。 Prolog基于定義謂詞的謂詞,這些謂詞定義了它們的參數(shù)之間的關(guān)系。 food(salad). % <- salad is food factfood(pizza). % <- pizza is food fact?- food(salad). % <- is salad food? True?- food(turtle). % <- is turtle food? False 在上面的示例中,您定義了導(dǎo)致真實(shí)的事實(shí),然后又問了一些導(dǎo)致真實(shí)或錯(cuò)誤的布爾值的問題。 請(qǐng)記住,海龜不是食物,有人應(yīng)該告訴赤裸裸和害怕的饑餓者。 當(dāng)你使用Prolog工作時(shí),Prolog有點(diǎn)神奇,如果你不同意,那么你還是個(gè)邪惡的家伙。 函數(shù)式編程函數(shù)式編程是基于純函數(shù)組成的聲明性范例。函數(shù)式編程語(yǔ)言是圖靈完備的,并且基于lambda微積分,它是1930年代的一種數(shù)學(xué)邏輯系統(tǒng)。 純函數(shù)是僅依賴于其輸入并且始終提供輸出而不會(huì)改變或讀取任何外部狀態(tài)的函數(shù)。這與過程編程大不相同。然后,函數(shù)組合是關(guān)于按順序一起使用簡(jiǎn)單函數(shù)來構(gòu)建代碼。 在過去的幾年中,函數(shù)式編程的流行一直穩(wěn)步增長(zhǎng),并且已進(jìn)入命令式編程語(yǔ)言。這意味著諸如Python,C ++和JavaScript之類的語(yǔ)言是多范式的,因?yàn)樗鼈冎С忠远喾N范式編寫代碼。 這是使用@ 7urtle / lambda庫(kù)用JavaScript編寫的功能代碼的示例:
函數(shù)式程序設(shè)計(jì)帶來了許多面向?qū)ο蟪绦蛟O(shè)計(jì)中沒有的新概念,例如純函數(shù),高階函數(shù),不變性,函子,部分應(yīng)用程序,無點(diǎn)函數(shù)等等。因此,入門的門檻似乎很高,尤其是因?yàn)樵S多函數(shù)式編程文章都喜歡深入其數(shù)學(xué)基礎(chǔ)。我建議看一下簡(jiǎn)單的文章,例如@ 7urtle / lambda JavaScript函數(shù)式編程基礎(chǔ)知識(shí)。 只有邪惡的巫師認(rèn)為函數(shù)式編程是不好的。因此,要聰明一點(diǎn),不要聽他們邪惡的詛咒,而要在他們所屬的木樁上焚燒他們。請(qǐng)記住,如果有人說原子很復(fù)雜,那只是假新聞。 函數(shù)式編程語(yǔ)言的其他示例是LISP(1984),Haskell(1990)和F#(2005)。 學(xué)習(xí)你的編程技巧實(shí)際上,許多程序員只熟悉命令式和面向?qū)ο蟮能浖_發(fā)方法。學(xué)習(xí)其他范例可幫助你成為更好的開發(fā)人員,即使你最終不會(huì)越過障礙。 (本文由聞數(shù)起舞翻譯自Martin Novák的文章《Declarative Versus Imperative Code》,轉(zhuǎn)載請(qǐng)注明出處,原文鏈接: |
|