浅谈声明式编程范式

近来发现到处都能发现声明式编程范式的影子,也越发越发觉得如果合理使用声明式编程范式,将有效的改善软件架构,固编写这篇文档,简单的谈一谈笔者对声明式编程范式的理解。

1. 声明式与命令式

命令式(Imperative)和声明式(Declarative)是很早就有的概念,比如 SQL、HTML、CSS 是典型的声明式语言,而我们使用的绝大部分编程语言都是命令式的。

命令式编程就像它的名字一样,它由开发者我们一步一步的告述计算机,执行一系列的操作,然后得到想要的结果,起主要作用的是开发者,计算机只是帮助开发者执行计算而已。

而声明式编程却与此相反,它不是告述计算机做什么做,而是直接告述计算它想要的结果,至于怎么做,由预先写好的程序依据一定的算法由计算机自动推算出来。

声明式与命令式的主要区别在于,声明式描述的是结果,它不关心过程。比如 SQL,我们告述数据库的是,我们要查询某张表满足某某条件的数据,但我们并不会告述数据库怎么去查,怎么查数据是数据库系统自己关心的事情。

2. 声明式的应用领域

很多领域都引入了声明式的编程范式和思想,比如笔者知道的就有如下几个方面。

2.1 SQL

SQL 是最成功的第四代编程语言,它有着众多的方言和实现,因为它的成功,现在各大数据产品也纷纷支持 SQL 进行查询和分析。SQL 是一门典型的声明式语言,它将复杂的数据查询和写入操作封装了起来,我们只需要简单的一个 SQL 语句,就能够获取需要的数据。

早年间,当 SQL 在大数据领域还不是那么流行的时候,我们需要编写复杂的 MapReduce 程序来分析数据,直到有了各种 SQL on MapReduce 产品,我们直接就能够通过 SQL 进行大数据分析,而不用关心复杂的底层实现细节。

2.2 jQuery 与 MVVM

在前端领域,在 jQuery 及以前的时代,我们做的最多的就是通过命令式的编程范式,告述浏览器第一步做什么,第二部做什么来控制视图显示。但直到 MVVM 框架的出现,我们对视图的操作变成了更简单的方便的声明式操作,我们只需要修改对应的数据,视图就自动变化,无需我们手动操作 DOM 结构,让开发人员更专注的处理业务逻辑。

然后,前端对声明式编程范式的应用不仅如此,最近看到的是 Facebook 通过 GraphQL 和 Relay 对 Facebook 网页版进行了重构,通过声明式思想重新组织组件、数据和代码,让所有组件、数据以及代码都能够全局的被管理起来。有了这些整体的数据,再加上一个全局管理器,进而实现代码与数据的并行加载,提升网站访问效率,缩短加载时间。笔者看来,这也是声明式思想的应用。

2.3 Kubernetes

容器编排的事实标准 Kubernetes 其 API 设计的核心也是声明式的,我们只需要通过声明式的方式,告述 Kubernetes 的 Controller,我们需要什么样的 Pod,什么样的 Service,其他的一切都由 Kubernetes 内部搞定。

通过声明式,极大的减少了管理一个 Pod 或者 Service 所需要关注的事情,Kubernetes 会帮助我们做好几乎一切的事情。

3. 总结

所以,我们看到,声明式的编程范式在各个领域都有很好应用,总结一下,它主要有如下几个优点:

  1. 对系统使用方,通过设计声明式的接口,开发者无需关心底层实现,而更多的关注上层业务
  2. 对系统实现方,通过声明式的接口,上层使用者接口相对稳定前提下,系统可以不断的迭代优化
  3. 对整个系统而言,能够更系统的收集更多信息,能够依据策略进行系统行为优化,提升系统效率

基于这些优点,笔者有理由相信,声明式的编程范式和思想将越来越多的应用到现代的软件系统之中,让人们设计出更优雅、易用和可靠的软件系统。