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

為什么應(yīng)該首選聲明式API設(shè)計而不是命令式設(shè)計?

開發(fā) 后端
在本文中,聲明性API得到更廣泛使用的主要原因之一是,與命令性API相比,聲明性API的使用更加簡潔,并且提供了更好的抽象性。

React是聲明性的。SQL也是聲明性的。有共同點嗎?

> Provided by author

我們現(xiàn)在的許多應(yīng)用程序周圍的API。例如,我們的應(yīng)用程序代碼的許多核心通過API通信。我們通過用可理解的抽象分層構(gòu)建應(yīng)用程序。此抽象層至關(guān)重要,因為它有助于我們解決我們的軟件是如何編寫的及其問題。

定義API的兩種流行方法是命令式和聲明式。SQL是一種聲明性查詢語言,而IMS和CODASYL查詢數(shù)據(jù)庫則使用命令性代碼。最常用的編程語言是必須的。

但是,在本文中,聲明性API得到更廣泛使用的主要原因之一是,與命令性API相比,聲明性API的使用更加簡潔,并且提供了更好的抽象性。

數(shù)據(jù)模型中的命令式聲明式

在沒有SQL之前,在1960年,IBM設(shè)計了信息管理系統(tǒng)(IMS),它具有一個稱為CODASYL的分層模型,類似于文檔數(shù)據(jù)庫中使用的JSON模型。

該模型稱為網(wǎng)絡(luò)模型,它有助于為多對多關(guān)系創(chuàng)建數(shù)據(jù)模型。每條記錄將有多個父級,我們將一條記錄相對于另一條記錄進行標(biāo)記的方式是使用編程語言中的指針而不是外鍵。

> Source: A Codasyl-type Schela Forp Natural La;g’uage Miedical Records

如果要獲取特定鏈接的值,則必須從列表的頭開始遍歷,一次查看一個記錄,直到找到所需的記錄為止。

這種檢索數(shù)據(jù)的方式使開發(fā)人員很難進行任何更新或更改,因為他們必須跟蹤所有關(guān)系和鏈接的父級,否則他們將找不到所需的數(shù)據(jù)。

關(guān)系模型數(shù)據(jù)查詢有何不同

關(guān)系模型使用另一種查詢數(shù)據(jù)的方式。作為開發(fā)人員,我們將告訴程序“做什么”,而不是“怎么做”。因此,查詢優(yōu)化器將自動決定按哪個順序執(zhí)行查詢的哪個部分以及使用哪個索引。

“告訴程序“做什么”,而不是“如何”做。”

聲明性方法的一個好處是查詢語言使用API抽象了客戶的實現(xiàn)細節(jié)。這可以為優(yōu)化查詢優(yōu)化器留出空間,以產(chǎn)生更好的性能并引入更新的功能,而無需任何查詢更改。

隨著越來越多的計算邏輯轉(zhuǎn)向軟件而非硬件,SQL因其靈活性而變得越來越流行和廣泛使用。

讓我們看一下網(wǎng)絡(luò)瀏覽器中的聲明性API和命令性API的另一種類比和說明。

Web服務(wù)舉例

讓我們舉一個在Web瀏覽器中使用聲明式和命令式方法處理DOM元素的示例。

通常,使用CSS是聲明性的,而使用JavaScript操作DOM元素則勢在必行。在下面的示例中,您可以看到為什么CSS在Web上查詢數(shù)據(jù)要比JavaScript更好的原因。

更改HTML標(biāo)記上“The one who got away”段落中文本的顏色,如下所示:

  1. <ul> 
  2.   <li class="topClass"> 
  3.     <p> The one who got away </p> 
  4.     <ul> 
  5.       <li>article1</li> 
  6.       <li>article2</li> 
  7.       <li>article3</li>     
  8.     </ul> 
  9.   </li> 
  10.   <li> 
  11.     <p> What I learn from my mistakes</p> 
  12.     <ul> 
  13.       <li> subArticle </li> 
  14.       <li> subArticle2 </li> 
  15.     </ul> 
  16.   </li> 
  17. </ul> 

使用CSS,您的代碼將如下所示:

  1. li.topClass > p { 
  2.   color: blue 
  3. }  

比較簡單,因為它聲明了我們要將文本的藍色應(yīng)用于其中的元素的模式。不在類名topClass下的

標(biāo)記段不會更改顏色,因為它與聲明不匹配。

另一方面,使用JavaScript來操縱DOM元素將如下所示:

  1. let liElements = document.getElementsByTagName("li"); 
  2. for(let i = 0; i< liElements.length; i++) { 
  3.   if(liElements[i].className == "topClass") { 
  4.     const children = liElements[i].cildNodes; 
  5.     for(let j = 0; j< children.length; j++) { 
  6.       if(children[i].nodeType === NODE.ELEMENT_NODE && child.tagName === 'P'){ 
  7.         child.setAttribute('style', 'color:blue'); 
  8.       } 
  9.     } 
  10.   } 

使用JavaScript來操作DOM元素,我們必須告訴程序如何做到這一點。它沒有告訴程序我們要達到的目的的抽象概念。該代碼不但比CSS長很多,也很難理解。新手開發(fā)人員將需要完全按照HTML頁面的說明進行操作,以了解其功能意圖。

此外,我們必須跟蹤在DOM節(jié)點上設(shè)置的內(nèi)容,以及未在DOM節(jié)點上放置的內(nèi)容。例如,如果用戶轉(zhuǎn)到下一頁,我們需要手動知道如何將color:blue設(shè)置回黑色。而且,如果API發(fā)生了變化,例如新功能getElementByTagNameV2(我只是在做些事情),則客戶端將需要重寫該函數(shù),因為API與客戶端的實現(xiàn)緊密相關(guān)。

另一方面,以聲明性的方式定義API-我們可以優(yōu)化瀏覽器性能,而無需客戶端更改他們編寫的任何CSS標(biāo)記。

我們知道,與在CODASYL中使用SQL相比,在Web瀏覽器中查詢數(shù)據(jù)比CSS更靈活,更容易向后兼容。

在實踐中

最終,API的抽象度越高,API的聲明性就越高。所有低級API都公開了您要調(diào)用的動詞,并且如果沒有命令性API,我們就無法封裝高級抽象API。換句話說,必須存在命令性API才能將API封裝為聲明性API。

如果要使API更具聲明性,請將配置放在API上進行進一步的抽象。通常,聲明性API將通過為您提供一些容錯功能,因此您不必考慮到某些方面。

假設(shè)您希望在隊列中創(chuàng)建對輪詢值的抽象。您可以通過提供功能poll()提及輪詢的機制。

以聲明poll()的命令方式,它只會做一件事-poll。如果在此過程中出現(xiàn)網(wǎng)絡(luò)問題或故障,它將僅引發(fā)異常。

編寫API的一種聲明方式是提及函數(shù)意圖的配置。例如,如果您希望重試計數(shù)為2,并且在失敗時執(zhí)行特定操作??蛻舳诵枰鉀Q的任何特定錯誤處理或功能都可以將其封裝在config值中,該值可讓API為您完成所有艱苦的工作。

閉幕

我們將了解為什么聲明式API比命令式API更容易理解和使用。首先,我們了解當(dāng)前廣泛使用的查詢語言-SQL,以及與前一個CODASYL相比的查詢語言。然后,我們看到查詢網(wǎng)絡(luò)瀏覽器的聲明方式如何比命令形式更輕松。最后,了解用戶的意圖并使用配置抽象他們需要實現(xiàn)的所有邏輯是過渡到聲明性API的絕佳方法。

原文鏈接:

https://betterprogramming.pub/why-you-should-prefer-declarative-api-designs-over-imperative-ddbc1192f9f6

 

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

2021-08-14 09:04:58

TypeScriptJavaScript開發(fā)

2022-06-21 08:12:17

K8sAPI對象Kubernetes

2020-12-17 07:59:46

聲明式代碼命令式代碼代碼

2020-09-04 06:27:22

編碼命令式聲明式代碼

2021-06-30 12:47:12

標(biāo)簽HTML分辨率

2014-08-13 15:55:17

Web響應(yīng)式設(shè)計design

2021-09-06 13:42:14

Spring聲明式事務(wù)

2013-06-27 09:31:37

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

2023-10-30 11:13:55

2021-03-16 07:56:12

開發(fā)

2019-04-19 11:56:48

框架AI開發(fā)

2013-03-25 10:14:18

NginxApache

2023-09-26 11:28:08

代碼注釋軟件開發(fā)

2012-01-09 14:48:15

響應(yīng)式Web

2024-06-24 00:00:00

AVIFJPEG圖像格式

2012-10-10 16:52:21

CentOSDebianUbuntu

2021-10-30 19:57:00

HTTP2 HTTP

2023-04-24 14:32:54

2009-06-22 14:59:51

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

2024-09-18 00:00:03

SSGSSR服務(wù)器
點贊
收藏

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