日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[译] 利用 Immutability(不可变性)编写更为简洁高效的代码

發布時間:2023/12/18 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [译] 利用 Immutability(不可变性)编写更为简洁高效的代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文講的是[譯] 利用 Immutability(不可變性)編寫更為簡潔高效的代碼,
  • 原文地址:Write safer and cleaner code by leveraging the power of “Immutability”
  • 原文作者:Guido Schmitz
  • 譯文出自:掘金翻譯計劃
  • 譯者:gy134340
  • 校對者:bambooom,xunge0613

不可變性是函數式編程中的一部分,它可以使你寫出更安全更簡潔的代碼。我將會通過一些 JavaScript 的例子來告訴你如何達到不可變性。

根據維基(?地址?):

一個不可變對象(不能被改變的對象)是指在創建之后其狀態不能被更改的對象,這與在創建之后可以被更改的可變對象(可以被改變的對象)相反。在某些情況下,一個對象的外部狀態如果從外部看來沒有變化,那么即使它的一些內部屬性更改了,仍被視為不可變對象。

不可變的數組

數組是了解不可變性如何運作的一個很好的起點。我們來看一下。

const arrayA = [1, 2, 3]; arrayA.push(4);const arrayB = arrayA; arrayB.push(5);console.log(arrayA); // [1, 2, 3, 4, 5] console.log(arrayB); // [1, 2, 3, 4, 5]

例子中?arrayB?是?arrayA?的引用,所以如果我們通過 push 方法向任意數組中添加一個值 5,那么就會間接影響到另外一個,這個是違反不可變性的原則的。

我們可以通過使用?slice?函數以達到不可變性,進而優化我們的例子,此時代碼的行為是完全不一樣的。

const arrayA = [1, 2, 3]; arrayA.push(4);const arrayB = arrayA.slice(0); arrayB.push(5);console.log(arrayA); // [1, 2, 3, 4] console.log(arrayB); // [1, 2, 3, 4, 5]

這才是我們要的,代碼不改變其它的值。

記住:當使用?push?來給數組添加一個值時,你在改變這個數組,因為這樣可能會影響代碼里的其他部分,所以你想要避免使變量值發生改變。slice?會返回一個復制的數組。

函數

現在你知道了如何避免改變其它的值。那如何寫「純」的函數呢?純函數是指不會產生任何副作用,也不會改變狀態的函數。

我們來看一個示例函數,其原理與前面數組示例的原理相同。首先我們寫一個會改變其它值的函數,然后我們將這個函數優化為「純」函數。

const add = (arrayInput, value) => {arrayInput.push(value);return arrayInput; }; const array = [1, 2, 3];console.log(add(array, 4)); // [1, 2, 3, 4] console.log(add(array, 5)); // [1, 2, 3, 4, 5]

于是我們又一次改變輸入的變量的值,這使得這個函數變得不可預測。在函數式編程的世界里,有一個關于函數的鐵律:函數對于相同的輸入應當返回相同的值。

上面的函數違反了這一規則,每次我們調用?add?方法,它都會改變數組變量導致結果不一樣。

讓我們來看看怎樣修改?add?函數來使其不可變。

const add = (arrayInput, value) => {const copiedArray = arrayInput.slice(0);copiedArray.push(value);return copiedArray; };const array = [1, 2, 3]; const resultA = add(array, 4); console.log(resultA); // [1, 2, 3, 4] const resultB = add(array, 5); console.log(resultB); // [1, 2, 3, 5]

現在我們可以多次調用這個函數,且相同的輸入獲得相同的輸出,與預期一致。這是因為我們不再改變?array?變量。我們把這個函數叫做“純函數”。

注意:?你還可以使用?concat,來代替?slice?和?push
即:arrayInput.concat(value);

我們還可以使用 ES6 的擴展語法,來簡化函數。

const add = (arrayInput, value) => […arrayInput, value];

并發

NodeJS 的應用有一個叫并發的概念,并發操作是指兩個計算可以同時的進行而不用管另外的一個。如果有兩個線程,第二個計算不需要等待第一個完成即可開始。

可視化的并發操作

NodeJS 用事件循環機制使并發成為可能。事件循環重復接收事件,并一次觸發一個監聽該事件的處理程序。這個模型允許 NodeJS 的應用處理大規模的請求。如果你想學習更多,讀一下這篇關于事件循環的文章。

不可變性跟并發又有什么關系呢?由于多個操作可能會并發地改變函數的作用域的值,這將會產生不可靠的輸出和導致意想不到的結果。注意函數是否改變它作用域之外的值,因為這可能真的會很危險。

下一步

不可變性是學習函數式編程過程中的一個重要概念。你可以了解一下由 Facebook 開發者寫的?ImmutableJS,這一個庫提供一些不可變的數據結構,比如說?MapSet、和?List

點擊 讓更多的人可以在 Medium 上看見這篇文章,感謝閱讀。






原文發布時間為:2017年5月31日
本文來自云棲社區合作伙伴掘金,了解相關信息可以關注掘金網站。

總結

以上是生活随笔為你收集整理的[译] 利用 Immutability(不可变性)编写更为简洁高效的代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。