编程范式的整理和借鉴

什么是编程范式


所谓编程范式(programming paradigm),指的是计算机编程的基本风格或典范模式。我们知道,编程是为了解决问题,而解决问题可以有多种视角和思路,其中普适且行之有效的模式被归结为范式。目前来讲编程大概有面向过程式(Procedure Oriented Programming)、面向对象式(Object 0riented Programming)、函数式(Functional Programming)、面向切面式(Aspect Oriented Programming)。

编程范式是抽象的,必须通过具体的编程语言来体现。它代表的世界观往往体现在语言的核心概念中,代表的方法论往往体现在语言的表达机制中。反过来说,编程语言的的发展过程,也代表着编程范式的发展过程,所以我们从这角度来梳理编程范式的演化过程。

面向过程

我们知道最早的编程语言是机器语言,我们直接使用机器指令进行编程,这个时候的编程方式是非常繁琐的,只能解决基本的计算和输入输出,基本难以发展出理论模型。后来发展出了汇编语言,我们使用助计符来编写代码,使用翻译程序来将代码翻译成机器指令。并且基于这种模式,优化出了B语言、C语言,在这个阶段我们的主要编程方式,都是过程式编程。即我们的编程的重心,放在了目标程序实现某些功能的执行过程上。在这个阶段,我们设计程序的思路,都是将程序的功能,以计算机的视角,抽象成输入输出等计算任务,来组合实现我们的目标功能。

面向对象

在面向过程编程中,我们发现从程序功能所处理的现实世界的事物、到计算机能够处理的计算任务中,存在着一种生硬的强制的对应转换。由于计算机只能处理格式化的数据和计算,导致我们也被迫按照它的方式去思考,这与我们人类将事物按照类别和特征来思考的习惯是不相符的,进而增加了我们的程序设计、实现难度,降低了程序的可读性和可维护性。所以我们为计算机语言增加了新的特性来模拟我们的思维方式,即允许我们以类的方式来组织程序,一个类代表一个现实的事物,它有自己的属性和行为,以及与其他类的继承、组合关系。这种模式就叫面向对象模式,它极大的降低了程序的设计难度,增加了程序的可读性和复用性,为我们构建大规模复杂的程序提供了更加合理的组织方式。由此特性,基于C语言发展出了c++语言,再后来又有java语言,到现在,除了少数的脚本语言之外,绝大部分的语言都支持面向对象的编程方式。

函数式编程

函数式编程这个名词,在字面上具有一定的迷惑性。因为我们对函数这个概念并不陌生,它是某个计算过程的组织方式,在所有语言中都存在这种结构,虽然有些语言里叫做方法。所以我们看到函数式编程,很容易就想到C语言这种面向过程的编程方式,然后就会萌生疑问,我们难道不是已经用上了函数式编程了吗?

实际上我们确实用上了函数式编程了,这种编程范式里的函数,与我们之前所见的函数的定义是一样的,只是它提倡更加极致的使用方式。函数式编程中,没有赋值语句,所有的结果都由计算过程的组合得到,并且函数的参数,也可以是函数本身,就像C/C++里的函数指针一样。

使用这种范式编程,有几个主要特点:

1.没有赋值语句,所有的变量都是不可变的,所已在所有的线程中都是唯一的值,所以它是并发安全的。但这会导致变量在创建之后,一直存在直到它参与的整个计算过程结束,从而占用大量的内存资源。

2.所有的复用单元都是函数,这有助于减少程序体积,一定程度上可以提高开发效率。并且它会使得表达式的结构更加易于理解。但它也会导致程序设计的困难,前面我们说了我们思考的自然方式是面向对象的。

  1. 支持惰性计算,即表达式不在绑定变量时立即求值,而是在需要产生结果时再进行求值。

完全的函数式编程在目前来说是不流行的,但是我们可以借鉴它的思想。比如在编写函数的时候,尽量不修改全局变量和函数参数,保证函数的作用的内敛性,从而增加程序的健壮性。比如简化我们的函数逻辑,编写小而美的函数,采用函数嵌套来实现复杂的功能。比如使用惰性计算,有目的地控制我们程序的计算量分布情况,当然这需要语言机制的支持。目前大部分的语言,都增加了函数式编程的特性支持,比如java的lambda表达式,groovy的闭包。

面向切面

在程序中存在很多的通用功能,比如日志记录,性能统计,安全控制,事务处理等等,这些功能与程序的业务逻辑没有强制的关联性,属于辅助或维护功能,如果我们采用面向对象的方式来实现这些功能,那我们必须在业务逻辑实现的同时,处理这些通用的功能。一但这些功能实现需要变更或者扩展,会导致业务代码的变更。我们将这些通用的功能,称为程序的一个切面。

面向切面编程的思想,就是通过预编译的方式或者动态代理技术,在不修改源码的情况下,为程序增加功能。通过这种方式,分离业务逻辑和辅助功能的实现,使程序可以专注于业务逻辑的实现,更加内聚和高效。

面向切面编程是很常用的一种技术,它天然是面向对象编程方式,在通用步骤处理能力上的一个补齐,可以极大的简化程序开发和提高程序的灵活性。比如java的APT技术衍生的很多框架,dagger、butterknife、greendao等,使用注解来生成辅助代码;比如使用ASM技术直接修改和生成class字节码的jacoco,再比如android的databinding框架,甚至是一些hook和插件化机制,都可以说是AOP编程方式的一种应用。

你可能感兴趣的:(编程范式的整理和借鉴)