经过利用immutability的能力编写更安全和更整洁的代码

经过利用immutability的能力编写更安全和更整洁的代码

原文:Write safer and cleaner code by leveraging the power of “Immutability”javascript

译者:neal1991java

welcome to star my articles-translator , providing you advanced articles translation. Any suggestion, please issue or contact menode

LICENSE: MITgit

Immutability是函数式编程的重要基础之一。它容许你能编写更安全以及更整洁的代码。我将会经过一些JavaScript例子来向你展现如何来达到immutability。github

根据维基百科:编程

不可变对象是一个在建立以后不能修改其状态的对象。这正与可变对象相反,它可以在建立以后被修改。在某些状况下,对象被认为是不可变的,即便其内部的某些属性发生改变,可是从外部的角度来看这个对象的状态看起来仍是没有发生变化的。数组

Immutable数组

数组是理解immutability如何工做的很好的起点。让咱们一块儿来看一看。安全

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]

这个例子将arrayA的引用分配给arrayB,所以这个push方法在这两个变量中都会添加5这个值。咱们的代码间接地修改其它的值,这并非咱们想要的。这也违反了immutability的原则。并发

咱们能够经过使用 slice函数将咱们的例子提高为immutable,而且这个代码的行为也产生了变化。ide

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函数被调用的时候,它就会修改这个array变量,结果也就不一样了。

让咱们一块儿看看看如何改变咱们add函数的事先,所以让其成为immutable。

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经过event-loop让并发变得可能。event-loop会重复获取一个事件,而且每次会激活任一一个事件处理器来监听事件。这个模型容许NodeJS应用处理大量的请求。若是你想了解更多,阅读这篇关于event-loop的文章

Immutability和并发之间有什么关系呢?由于作个操做可以在函数的做用域外以并发的方式改变值,这会产生一个不可靠的输出以及没法预期的结果。意识到函数可能会在做用域外修改变量,所以这可能会很是危险的。

下一步

Immutability对于你理解和学习函数式编程是很是重要的一个概念。你可能但愿了解mmutableJS](https://facebook.github.io/im...,其由Facebook开发者编写。这个library提供了某些不可变的数据机构,好比 Map, Set以及List.

Immutable.js, persistent data structures and structural sharing(译者注:墙外地址)

相关文章
相关标签/搜索