解释:命令式编程与声明式编程

2025-06-07

解释:命令式编程与声明式编程

您很可能听说过声明式编程与命令式编程。

你可能也查过,并得到类似这样的结果

在计算机科学中,声明式编程是一种表达计算逻辑而不描述其控制流的编程范式。

如果你和我一样,这完全说不通。那就让我们来聊聊比喻吧!

假设你想喝杯咖啡。

命令式方法:

我会从左下角的抽屉里拿一个杯子,从冰箱里拿一些牛奶,加热一些牛奶,将牛奶倒入杯子中,从最上面的架子上拿一些咖啡粉倒入咖啡中,然后从桌子上拿一把勺子搅拌咖啡。

声明方式:

妈妈,我想要一杯咖啡!

现在,你想预订一辆出租车去办公室。你可以告诉司机到达办公室的具体路线和转弯信息,或者直接告诉他们地址。

看到了吗?命令式代码是列出做某事的具体步骤,而声明式代码只是说明我们想要做什么。

注意:声明式程序只是对命令式程序的抽象。最终,需要有人去做那些命令式的工作。妈妈需要用命令式的方式煮咖啡。出租车司机需要知道去你办公室的路。


好了,让我们从比喻的世界跳转到代码,亲自尝试一下声明式代码。这里有一个快速测试:编写一个函数,对数组中的所有偶数求和。




时间到了!我见过很多人这样写答案:

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;
}

Enter fullscreen mode Exit fullscreen mode

这是必要的;这是制定每一步的计划。

这是一个更具声明性的解决方案:

const evenSum = numbers => numbers
    .filter(i => i % 2 === 0)
    .reduce((a, b) => a + b)

Enter fullscreen mode Exit fullscreen mode

这里我们要求 JavaScript 执行我们想要的操作:过滤出偶数,然后将它们相加。我们可以通过使用更多函数来使函数更具声明性。

const isEven = n => n % 2 === 0;
const sum = (a, b) => a + b;
const evenSum = numbers => numbers.filter(isEven).reduce(sum);

Enter fullscreen mode Exit fullscreen mode

注意:您现在一定已经注意到函数式编程是声明式编程的一个子集!

你肯定已经开始感受到这些好处了。如果没有,以下是清单:

  1. 声明式程序的可读性更高。我只看到“按偶数过滤,按和减少”这样的代码,而不是那种需要手动单步执行才能理解的循环。
  2. 声明式程序是可复用的。最终代码中有 3 个独立的函数,可以在整个代码库中复用。由于命令式代码严重依赖于状态,因此复用起来可能比较困难。
  3. 声明式程序简洁。
文章来源:https://dev.to/siddharthshyniben/explained-imperative-vs-declarative-programming-577g
PREV
从头开始实现反应性
NEXT
60 秒掌握 React.lazy API(使用 Suspense 进行代码拆分)