您很可能听说过声明式编程与命令式编程。
你可能也查了一下,得到了类似的东西
在计算机科学中,声明式编程是一种编程范式,它表达了计算的逻辑而不描述其控制流。
如果你和我一样,那是没有意义的。那么让我们来看看隐喻吧!
假设你想要一杯咖啡。
势在必行的方式:
我会从左下抽屉拿一个杯子,从冰箱里拿一些牛奶,加热一些牛奶,把牛奶倒进杯子里,从最上面的架子上拿一些咖啡粉倒进咖啡里,然后挑一个勺子从桌子上混合咖啡。
声明方式:
妈妈,我要一杯咖啡!
现在,您想预订一辆出租车到办公室。你可以告诉司机到达办公室的所有确切转弯和道路,或者你可以只给他们地址。
看?命令式的方式是列出如何做某事的确切步骤,而声明式的方式只是说出我们想要做什么。
注意:声明式程序只是命令式的抽象。最后,需要有人去做必要的工作。妈妈需要以一种必要的方式煮咖啡。出租车司机需要知道去你办公室的路。
好吧,让我们从隐喻世界跳到我们的代码,并自己尝试声明性代码。这是一个快速测试:编写一个函数,将数组中的所有偶数相加
时间到!我见过很多人这样写答案:
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 个单独的函数,我们可以在代码库中重用它们。由于命令式代码严重依赖于状态,它可能很难被重用。
- 声明式程序是简洁的。