解释:命令式编程与声明式编程
您很可能听说过声明式编程与命令式编程。
你可能也查过,并得到类似这样的结果
在计算机科学中,声明式编程是一种表达计算逻辑而不描述其控制流的编程范式。
如果你和我一样,这完全说不通。那就让我们来聊聊比喻吧!
假设你想喝杯咖啡。
命令式方法:
我会从左下角的抽屉里拿一个杯子,从冰箱里拿一些牛奶,加热一些牛奶,将牛奶倒入杯子中,从最上面的架子上拿一些咖啡粉倒入咖啡中,然后从桌子上拿一把勺子搅拌咖啡。
声明方式:
妈妈,我想要一杯咖啡!
现在,你想预订一辆出租车去办公室。你可以告诉司机到达办公室的具体路线和转弯信息,或者直接告诉他们地址。
看到了吗?命令式代码是列出做某事的具体步骤,而声明式代码只是说明我们想要做什么。
注意:声明式程序只是对命令式程序的抽象。最终,需要有人去做那些命令式的工作。妈妈需要用命令式的方式煮咖啡。出租车司机需要知道去你办公室的路。
好了,让我们从比喻的世界跳转到代码,亲自尝试一下声明式代码。这里有一个快速测试:编写一个函数,对数组中的所有偶数求和。
时间到了!我见过很多人这样写答案:
function evenSum(numbers) {
let result = 0;
for (let i = 0; i < numbers.length; i++) {
let number = numbers[i]
if (number % 2 === 0) {
result += number;
}
}
return result;
}
这是必要的;这是制定每一步的计划。
这是一个更具声明性的解决方案:
const evenSum = numbers => numbers
.filter(i => i % 2 === 0)
.reduce((a, b) => a + b)
这里我们要求 JavaScript 执行我们想要的操作:过滤出偶数,然后将它们相加。我们可以通过使用更多函数来使函数更具声明性。
const isEven = n => n % 2 === 0;
const sum = (a, b) => a + b;
const evenSum = numbers => numbers.filter(isEven).reduce(sum);
注意:您现在一定已经注意到函数式编程是声明式编程的一个子集!
你肯定已经开始感受到这些好处了。如果没有,以下是清单:
- 声明式程序的可读性更高。我只看到“按偶数过滤,按和减少”这样的代码,而不是那种需要手动单步执行才能理解的循环。
- 声明式程序是可复用的。最终代码中有 3 个独立的函数,可以在整个代码库中复用。由于命令式代码严重依赖于状态,因此复用起来可能比较困难。
- 声明式程序简洁。