命令式编程(Imperative) 和声明式编程( Declarative)对比

命令式编程(Imperative) 和声明式编程( Declarative)

命令式编程(又称为指令式编程)(Imperative programming):常见的语言例如C,Java,Python等,编程过程都是一步一步的告诉机器如何执行代码,步骤逻辑必须非常清晰,大部分语言都支持以下语句:运算(+,-*,%),循环(for,while),条件分支(if else)

声明式编程(Declarative programming):常见的语言有数据库查询语言SQL,正则表达式等。编程过程都是声明所需要的结果,而不关系具体的实现逻辑。在声明式编程范式中又包括了几种自编程范型。如:逻辑式编程,函数式编程,约束式编程

场景:过滤偶数:

命令式编程:

//java 代码
//必须实现 循环和判断逻辑
public List filter(List<Integer> list) {
    List<Integer> res = new ArrayList<>();
    for (int i : list) {
        if(i%2==0){
            res.add(i);
        }
    }
    return res;
}

声明式编程:

# SQL 代码
# 只需声明所需要的数据
select * form list where number%2==0

显然,声明式语言对用户更友好,用户可以关心更少的细节。更重要的是:它允许多种底层实现方式,保持目标不变的同时不断优化,如上例中 SQL 的实现既可以遍历所有的用户,也可以使用索引来加速查找。

Java中的函数式编程

例如在java语言中,既有命令式编程,也有声明式编程,其中函数式编程非常清晰的表明了数据的流向,简化了开发。

java中的函数式接口和lamdba表达式的出现,使得java也可以写的很声明式,特别是大数据开发中,写scala时深有体会。

List<String> list = Arrays.asList("apple", "banana", "orange", "pear");
if(list.isEmpty()){
    list.add("pineapple");
}
Stream<String> stream = list.stream().filter(s -> s.length() > 5);

当描述的目标变复杂时,声明式语言也不可避免变得更命令式,通过描述过程来描述更多细节

命令式里的声明式

传统上的一些编程语言,如 C/C++、Java、Python 等都被认为是命令式语言。用这些语言编写程序时的确是一条语句一条语句导向最终的目标。但这些编程语言与声明式的界限也并非泾渭分明。

除了机器码,包括汇编在内的几乎其它所有编程语言都有“函数”的概念。通过将语句组装成函数,无论是在使用还是阅读上,似乎都可以认为是在指定目标,是声明式的。例如要计算 Fibonacci 数列的第 N 个数,如果已经有现成的库,我们也只需要写 x = fibonacci(n),似乎也不是“命令式”吧。

另外,编程语言的一些语法糖也加强了我们**“声明目标”**的能力,如 Python 的装饰器 (decorator) @dataclass,“声明”式地定义一个类为数据类,Java 的 lombok 库也有 @Data 这样的注解(annotation)实现类似的功能。

小结

  • 在具体的复杂业务逻辑场景,有时声明式编程无法用简单的声明达到我们想要的结果,所以使用命令式更为方便,对于数据流处理,并发编程等场景,明显声明式编程更为简单方便。

  • 声明式使用方便、容易理解、易于优化,但表达能力有限,要表达更复杂的目标时,它往往也在向命令式靠拢了。而命令式里很多重复性的工作,也可以通过适当地组件化部分变成声明式。通过适当的封装、组件化,命令式也可以变成目标导向,变得更加“声明式”

  • 我们在开发时往往更倾向于调用声明式接口和函数,简单不用关系底层,但同时当我需要对外提供服务时,也尽量暴露更少的细节给使用者,可以方便的让他们声明式调用。

参考

指令式编程 - 维基百科,自由的百科全书 (wikipedia.org)

声明式编程 - 维基百科,自由的百科全书 (wikipedia.org)

声明式(declarative) vs 命令式(imperative) | 三点水 (lotabout.me)

(19 封私信 / 20 条消息) 声明式编程和命令式编程有什么区别? - 知乎 (zhihu.com)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值