宣告式程式設計與命令式程式設計

2021-10-03 04:26:53 字數 1545 閱讀 5847

先統一一下概念,我們有兩種程式設計方式:命令式和宣告式。

我們可以像下面這樣定義它們之間的不同:

·命令式程式設計:命令「機器」如何去做事情,告訴它如何去做。

·宣告式程式設計:告訴「機器」你想要的是什麼,讓機器自己去做。

宣告式程式設計和命令式程式設計的**例子:

舉個簡單的例子,假設我們想讓乙個陣列裡的數值翻倍。

我們用命令式程式設計風格實現,像下面這樣:

var numbers = [1,2,3,4,5]

var doubled =

for(var i = 0; i < numbers.length; i++)

console.log(doubled) //=> [2,4,6,8,10]

我們直接遍歷整個陣列,取出每個元素,乘以二,然後把翻倍後的值放入新陣列,每次都要操作這個雙倍陣列,直到計算完所有元素。

而使用宣告式程式設計方法,我們可以用 array.map 函式,像下面這樣:

var numbers = [1,2,3,4,5]

var doubled = numbers.map(function(n) )

console.log(doubled) //=> [2,4,6,8,10]

map 利用當前的陣列建立了乙個新陣列,新陣列裡的每個元素都是經過了傳入map的函式(這裡是function(n) )的處理。

map函式所作的事情是將直接遍歷整個陣列的過程歸納抽離出來,讓我們專注於描述我們想要的是什麼(what)。注意,我們傳入map的是乙個純函式;它不具有任何***(不會改變外部狀態),它只是接收乙個數字,返回乘以二后的值。

在一些具有函式式程式設計特徵的語言裡,對於list資料型別的操作,還有一些其他常用的宣告式的函式方法。例如,求乙個list裡所有值的和,命令式程式設計會這樣做:

var numbers = [1,2,3,4,5]

var total = 0

for(var i = 0; i < numbers.length; i++)

console.log(total) //=> 15

而在宣告式程式設計方式裡,我們使用 reduce 函式:

var numbers = [1,2,3,4,5]

var total = numbers.reduce(function(sum, n) );

console.log(total) //=> 15

reduce 函式利用傳入的函式把乙個 list 運算成乙個值。它以這個函式為引數,陣列裡的每個元素都要經過它的處理。每一次呼叫,第乙個引數(這裡是sum)都是這個函式處理前乙個值時返回的結果,而第二個引數(n)就是當前元素。這樣下來,每此處理的新元素都會合計到sum中,最終我們得到的是整個陣列的和。

同樣,reduce 函式歸納抽離了我們如何遍歷陣列和狀態管理部分的實現,提供給我們乙個通用的方式來把乙個 list 合併成乙個值。我們需要做的只是指明我們想要的是什麼?

宣告式程式設計:告訴「機器」你想要的是什麼(what),讓機器想出如何去做(how)。可以提高我們的**的效率,「機器」自身能夠自己做的就不需要用命令式程式設計,這樣可以減少我們敲**的量。而想熟練使用宣告式程式設計就需要熟練掌握js自帶的方法了。

宣告式程式設計和命令式程式設計

宣告式程式設計是一種程式設計正規化,它關注的是你要做什麼 what 而不是如何做 how 也就是你只需要告訴 機器 你想要的是什麼 what 讓機器想出如何去做 how 舉例 想要顯示乙個p標籤 this is a textp 查詢學生中年齡大於18對的學生的資訊 select from stude...

命令式程式設計和宣告式程式設計區別

我是個新手,雖然在某個領域還算可以,但是在net,還算個新手。還需要向各位學習。今天做了個例子,是把相同地域的學生進行分組。想看看2種方式的區別,有很多不懂地方,還要向大俠請教。有個方法是別人幫我編寫的,還有些不懂。請教下。例項 1 public class student24 public str...

函式式程式設計和命令式程式設計

所謂命令式程式設計,是以命令為主的,給機器提供一條又一條的命令序列讓其原封不動的執行。程式執行的效率取決於執行命令的數量。因此才會出現大o表示法等等表示時間空間複雜度的符號。而函式式語言並不是通常意義上理解的 通過函式的變換進行程式設計 注意到純的函式式語言中是沒有變數的 沒有可以改變的東西,所有的...