自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

聲明式與命令式代碼

開發(fā) 前端
信不信由你,你可能已經(jīng)以開發(fā)人員的身份使用了多種編程范例。因?yàn)闆]有什么比用編程理論招待朋友更有趣的了,所以這篇文章可以幫助您認(rèn)識(shí)代碼中的流行范例。

信不信由你,你可能已經(jīng)以開發(fā)人員的身份使用了多種編程范例。因?yàn)闆]有什么比用編程理論招待朋友更有趣的了,所以這篇文章可以幫助您認(rèn)識(shí)代碼中的流行范例。

命令式編程

命令式編程是我們從Assembly(1949)開始并以諸如C,C ++,C#,PHP和Java之類的語言繼續(xù)的方式。過程和面向?qū)ο蟮木幊虒儆诿钍椒妒健?/p>

代碼基于通過告訴計(jì)算機(jī)如何執(zhí)行操作來更改程序狀態(tài)的語句。換句話說,代碼基于定義變量并更改這些變量的值。

對(duì)于那些告訴機(jī)器如何思考的人,他們擁有不亞于天真的戀物癖的人,這是理想的編程范例。

過程編程

程序代碼使用過程來管理其結(jié)構(gòu)。過程只是一組按特定順序運(yùn)行的操作,可以重復(fù)調(diào)用這些操作,而不必使用goto命令進(jìn)行跳轉(zhuǎn)。

  1. #include <stdio.h> 
  2. int main() 
  3.     int num1, num2, num3; 
  4.     int *p1, *p2, *p3; 
  5.  
  6.     //taking input from user 
  7.     printf("Enter First Number: "); 
  8.     scanf("%d",&num1); 
  9.     printf("Enter Second Number: "); 
  10.     scanf("%d",&num2); 
  11.     printf("Enter Third Number: "); 
  12.     scanf("%d",&num3); 
  13.  
  14.     //assigning the address of input numbers to pointers 
  15.     p1 = &num1; 
  16.     p2 = &num2; 
  17.     p3 = &num3; 
  18.     if(*p1 > *p2) { 
  19.       if(*p1 > *p3){ 
  20.         printf("%d is the largest number", *p1); 
  21.       }else{ 
  22.         printf("%d is the largest number", *p3); 
  23.       } 
  24.         }else{ 
  25.       if(*p2 > *p3){ 
  26.         printf("%d is the largest number", *p2); 
  27.       }else{ 
  28.         printf("%d is the largest number", *p3); 
  29.       } 
  30.     } 
  31.     return 0; 

上面的C語言示例讀取三個(gè)數(shù)字,使用指針,并通過條件邏輯驅(qū)動(dòng)程序流,以確定三個(gè)數(shù)字中的最大數(shù)字。像C這樣的過程語言可以提供一個(gè)非常簡單且非常高效的解決方案,以應(yīng)對(duì)應(yīng)用程序挑戰(zhàn)。

通常,需要從上至下閱讀每個(gè)過程以了解其作用。有時(shí)可能會(huì)批評(píng)過程程序員編寫意大利面條代碼的趨勢(shì)。但是,任何不依賴意大利面條和番茄醬做晚餐的大學(xué)生,生活都很輕松。

過程編程語言的示例是Pascal(1970)和C(1972)。過程編程具有強(qiáng)大的支持。Linux之父Linus Torvalds對(duì)C ++和面向?qū)ο缶幊痰呐u(píng)一直很開放。

面向?qū)ο缶幊?/strong>

面向?qū)ο缶幊淌菍?duì)具有內(nèi)部狀態(tài)的對(duì)象進(jìn)行建模。然后,編程代碼基于這些對(duì)象之間的關(guān)系。在基于分類的語言中,對(duì)象是類的實(shí)例。

對(duì)象方法中的代碼仍然是命令性的,并且基于修改狀態(tài)的語句。

  1. public interface Retile { 
  2.    void walk(); 
  3.  
  4. public class Turtle implements Reptile { 
  5.    @Override 
  6.    public void walk() { 
  7.       System.out.println("Turtle is walking!"); 
  8.    } 
  9.  
  10. public class Tortoise implements Reptile { 
  11.    @Override 
  12.    public void walk() { 
  13.       System.out.println("Tortoise is walking!"); 
  14.    } 
  15.  
  16. public class ReptileFactory { 
  17.    public Reptile getReptile(String reptileType){ 
  18.       if(reptileType == null){ 
  19.          return null; 
  20.       }      
  21.       if(reptileType.equalsIgnoreCase("TURTLE")){ 
  22.          return new Turtle(); 
  23.       } else if(shapeType.equalsIgnoreCase("TORTOISE")){ 
  24.          return new Tortoise(); 
  25.       } 
  26.       return null; 
  27.    } 
  28.  
  29. public class ReptileDemo { 
  30.    public static void main(String[] args) { 
  31.       ReptileFactory reptileFactory = new ReptileFactory(); 
  32.  
  33.       Reptile reptile = Reptile.getReptile("TURTLE"); 
  34.  
  35.       reptile.walk(); 
  36.    } 

上面是用Java實(shí)現(xiàn)的工廠設(shè)計(jì)模式的示例。注意所有代碼如何集中于定義類并通過接口使用它們之間的關(guān)系。通常,所有這些類都將被分離到各自的文件中。

面向?qū)ο笳Z言的示例包括Smalltalk(1972),C ++(1985),Python(1991),Java(1995),JavaScript(1995),Ruby(1995),C#(2000),Scala(2004)和Swift(2014)。

JavaScript最初是基于原型的,沒有類的面向?qū)ο笳Z言。在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è)人士的贊賞。

在JavaScript中,前端框架Angular是C#的一個(gè)很好的例子,它對(duì)希望將更強(qiáng)的面向?qū)ο笤硪隬eb開發(fā)的開發(fā)人員有很大的影響。

請(qǐng)繼續(xù)在所有項(xiàng)目中使用面向?qū)ο蟮木幊獭R驗(yàn)槿绻贿@樣做,所有只知道這一范例的人都會(huì)突然失業(yè),然后住在紙板箱中。而且你不想為此承擔(dān)責(zé)任,對(duì)嗎?

聲明式編程

聲明性代碼非常普遍,并且由領(lǐng)域特定的,邏輯和功能性編程語言表示。這些示例包括HTML,SQL,F(xiàn)#,Prolog和Lisp。

聲明性代碼專注于在不添加方式的情況下說出什么的表達(dá)式。例如,HTML代碼告訴瀏覽器不顯示瀏覽器圖像就顯示烏龜圖像。聲明式代碼通常避免狀態(tài)和變量的突變。

特定于域的代碼

特定領(lǐng)域的語言不是圖靈完整的,這意味著它們無法完成其他圖靈完整的語言可以做的所有事情。例如,C#(命令式)和F#(聲明式)都是圖靈完備的語言,可以用一種語言開發(fā)的所有內(nèi)容,也可以用另一種語言開發(fā)。HTML并非圖靈完整的,并且僅允許做特定的事情。

在數(shù)據(jù)庫中查找員工及其經(jīng)理的SQL代碼示例:

  1. SELECT e.name, m.name  
  2. FROM Employee e, Employee m  
  3. WHERE e.Employee_id=m.Manager_id; 

特定領(lǐng)域的語言通常很容易編寫和閱讀。因此,它們是最流行的用戶界面聲明方式。例如,JavaScript編程庫React使用JSX定義組件:

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

特定領(lǐng)域語言的示例是SQL(1974),HTML(1993),CSS(1996)和XML(1996)。

邏輯編程

邏輯編程是基于形式邏輯的聲明性范式。程序是一組邏輯形式的句子,表達(dá)有關(guān)某些問題領(lǐng)域的事實(shí)和規(guī)則。

圖靈完備的最典型的邏輯編程語言是Prolog(1972)。這意味著理論上可以用C語言編寫的所有內(nèi)容,也可以在Prolog中編寫。

Prolog基于定義謂詞的謂詞,這些謂詞定義了它們的參數(shù)之間的關(guān)系。

  1. food(salad). % <- salad is food fact 
  2. food(pizza). % <- pizza is food fact 
  3.  
  4. ?- food(salad). % <- is salad food? True 
  5. ?- 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ù)式編程語言是圖靈完備的,并且基于lambda微積分,它是1930年代的一種數(shù)學(xué)邏輯系統(tǒng)。

純函數(shù)是僅依賴于其輸入并且始終提供輸出而不會(huì)改變或讀取任何外部狀態(tài)的函數(shù)。這與過程編程大不相同。然后,函數(shù)組合是關(guān)于按順序一起使用簡單函數(shù)來構(gòu)建代碼。

在過去的幾年中,函數(shù)式編程的流行一直穩(wěn)步增長,并且已進(jìn)入命令式編程語言。這意味著諸如Python,C ++和JavaScript之類的語言是多范式的,因?yàn)樗鼈冎С忠远喾N范式編寫代碼。

這是使用@ 7urtle / lambda庫用JavaScript編寫的功能代碼的示例:

  1. import {upperCaseOf, trim, map, compose, Maybe} from '@7urtle/lambda'; 
  2.  
  3. const getElement = selector => Maybe.of(document.querySelector(selector)); 
  4. const getText = element => element.textContent; 
  5. const transformer = compose(trim, upperCaseOf); 
  6. const getElementText = compose(map(transformer), map(getText), getElement); 
  7.  
  8. 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ǔ)。我建議看一下簡單的文章,例如@ 7urtle / lambda JavaScript函數(shù)式編程基礎(chǔ)知識(shí)。https://www.7urtle.com/javascript-functional-programming-basics

只有邪惡的巫師認(rèn)為函數(shù)式編程是不好的。因此,要聰明一點(diǎn),不要聽他們邪惡的詛咒,而要在他們所屬的木樁上焚燒他們。請(qǐng)記住,如果有人說原子很復(fù)雜,那只是假新聞。

函數(shù)式編程語言的其他示例是LISP(1984),Haskell(1990)和F#(2005)。

學(xué)習(xí)你的編程技巧

實(shí)際上,許多程序員只熟悉命令式和面向?qū)ο蟮能浖_發(fā)方法。學(xué)習(xí)其他范例可幫助你成為更好的開發(fā)人員,即使你最終不會(huì)越過障礙。

 

責(zé)任編輯:趙寧寧 來源: 今日頭條
相關(guān)推薦

2020-09-04 06:27:22

編碼命令式聲明式代碼

2013-06-27 09:31:37

聲明式編程命令式編程編程

2009-06-22 14:59:51

AOP實(shí)現(xiàn)原理聲明式編程命令式編程

2009-06-22 09:01:57

Spring聲明式事務(wù)

2022-06-21 08:12:17

K8sAPI對(duì)象Kubernetes

2021-03-03 14:09:57

API命令式聲明式

2021-01-08 07:48:19

Pipeline腳本式聲明式

2024-11-13 19:03:14

2021-09-06 13:42:14

Spring聲明式事務(wù)

2024-11-13 10:07:39

Java聲明式Http

2010-05-26 13:56:59

Tomcat 7Servlet 3.0

2022-08-23 16:07:02

ArkUI鴻蒙

2009-09-01 10:49:28

C#具有隱式類型聲明

2025-01-16 08:45:48

2017-09-08 18:29:17

jQuery代碼React

2016-11-23 13:46:08

Android

2023-04-18 23:33:46

分類模型辨別式模型生成式模型

2024-10-09 17:12:34

2019-09-09 11:40:18

編程函數(shù)開發(fā)

2022-09-02 15:17:04

ArkUI鴻蒙
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)