一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

聲明式與命令式代碼

 菌心說 2021-11-17

編程范式中的術(shù)語(yǔ)和差異

文章圖片1

> 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ǔ)句。

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實(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定義組件:

const myComponent = props => (   <h1>Hello, {props.userName}</h1>};

特定領(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編寫的功能代碼的示例:

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')

函數(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í)。
https://www./javascript-functional-programming-basics

只有邪惡的巫師認(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)注明出處,原文鏈接:
https:///better-programming/declarative-versus-imperative-code-180c0cf4003b)

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    国产不卡的视频在线观看| 中文字幕日产乱码一区二区| 欧美日韩中黄片免费看| 国产不卡免费高清视频| 久久机热频这里只精品| 亚洲国产一级片在线观看| 亚洲一区二区福利在线| 欧美久久一区二区精品| 色婷婷中文字幕在线视频| 91人人妻人人爽人人狠狠| 日本午夜一本久久久综合| 国产在线一区二区三区不卡| 一区二区在线激情视频| 色哟哟在线免费一区二区三区| 日韩精品一区二区一牛| 欧美精品专区一区二区| 九九热视频经典在线观看| 五月综合激情婷婷丁香| 国产精品偷拍视频一区| 欧美黄色黑人一区二区| 国产女优视频一区二区| 99热九九在线中文字幕| 少妇人妻精品一区二区三区| 婷婷色国产精品视频一区| 成人国产激情在线视频| 欧美夫妻性生活一区二区| 最新日韩精品一推荐日韩精品| 国产精品午夜一区二区三区| 欧美日韩亚洲巨色人妻| 少妇人妻无一区二区三区| 亚洲精品美女三级完整版视频| 偷拍美女洗澡免费视频| 日本熟女中文字幕一区| 欧美午夜一区二区福利视频| 国产精品日韩欧美第一页| 国产精品伦一区二区三区在线| 东京热男人的天堂久久综合| 欧美午夜视频免费观看| 日本大学生精油按摩在线观看| 亚洲丁香婷婷久久一区| 欧洲日韩精品一区二区三区|