编程范式的整理和借鉴
什么是编程范式 【编程范式的整理和借鉴】所谓编程范式(programming paradigm),指的是计算机编程的基本风格或典范模式。我们知道,编程是为了解决问题,而解决问题可以有多种视角和思路,其中普适且行之有效的模式被归结为范式。目前来讲编程大概有面向过程式(Procedure Oriented Programming)、面向对象式(Object 0riented Programming)、函数式(Functional Programming)、面向切面式(Aspect Oriented Programming)。
编程范式是抽象的,必须通过具体的编程语言来体现。它代表的世界观往往体现在语言的核心概念中,代表的方法论往往体现在语言的表达机制中。反过来说,编程语言的的发展过程,也代表着编程范式的发展过程,所以我们从这角度来梳理编程范式的演化过程。
面向过程
我们知道最早的编程语言是机器语言,我们直接使用机器指令进行编程,这个时候的编程方式是非常繁琐的,只能解决基本的计算和输入输出,基本难以发展出理论模型。后来发展出了汇编语言,我们使用助计符来编写代码,使用翻译程序来将代码翻译成机器指令。并且基于这种模式,优化出了B语言、C语言,在这个阶段我们的主要编程方式,都是过程式编程。即我们的编程的重心,放在了目标程序实现某些功能的执行过程上。在这个阶段,我们设计程序的思路,都是将程序的功能,以计算机的视角,抽象成输入输出等计算任务,来组合实现我们的目标功能。
面向对象
在面向过程编程中,我们发现从程序功能所处理的现实世界的事物、到计算机能够处理的计算任务中,存在着一种生硬的强制的对应转换。由于计算机只能处理格式化的数据和计算,导致我们也被迫按照它的方式去思考,这与我们人类将事物按照类别和特征来思考的习惯是不相符的,进而增加了我们的程序设计、实现难度,降低了程序的可读性和可维护性。所以我们为计算机语言增加了新的特性来模拟我们的思维方式,即允许我们以类的方式来组织程序,一个类代表一个现实的事物,它有自己的属性和行为,以及与其他类的继承、组合关系。这种模式就叫面向对象模式,它极大的降低了程序的设计难度,增加了程序的可读性和复用性,为我们构建大规模复杂的程序提供了更加合理的组织方式。由此特性,基于C语言发展出了c++语言,再后来又有java语言,到现在,除了少数的脚本语言之外,绝大部分的语言都支持面向对象的编程方式。
函数式编程
函数式编程这个名词,在字面上具有一定的迷惑性。因为我们对函数这个概念并不陌生,它是某个计算过程的组织方式,在所有语言中都存在这种结构,虽然有些语言里叫做方法。所以我们看到函数式编程,很容易就想到C语言这种面向过程的编程方式,然后就会萌生疑问,我们难道不是已经用上了函数式编程了吗?
实际上我们确实用上了函数式编程了,这种编程范式里的函数,与我们之前所见的函数的定义是一样的,只是它提倡更加极致的使用方式。函数式编程中,没有赋值语句,所有的结果都由计算过程的组合得到,并且函数的参数,也可以是函数本身,就像C/C++里的函数指针一样。
使用这种范式编程,有几个主要特点:
1.没有赋值语句,所有的变量都是不可变的,所已在所有的线程中都是唯一的值,所以它是并发安全的。但这会导致变量在创建之后,一直存在直到它参与的整个计算过程结束,从而占用大量的内存资源。
2.所有的复用单元都是函数,这有助于减少程序体积,一定程度上可以提高开发效率。并且它会使得表达式的结构更加易于理解。但它也会导致程序设计的困难,前面我们说了我们思考的自然方式是面向对象的。
- 支持惰性计算,即表达式不在绑定变量时立即求值,而是在需要产生结果时再进行求值。
面向切面
在程序中存在很多的通用功能,比如日志记录,性能统计,安全控制,事务处理等等,这些功能与程序的业务逻辑没有强制的关联性,属于辅助或维护功能,如果我们采用面向对象的方式来实现这些功能,那我们必须在业务逻辑实现的同时,处理这些通用的功能。一但这些功能实现需要变更或者扩展,会导致业务代码的变更。我们将这些通用的功能,称为程序的一个切面。
面向切面编程的思想,就是通过预编译的方式或者动态代理技术,在不修改源码的情况下,为程序增加功能。通过这种方式,分离业务逻辑和辅助功能的实现,使程序可以专注于业务逻辑的实现,更加内聚和高效。
面向切面编程是很常用的一种技术,它天然是面向对象编程方式,在通用步骤处理能力上的一个补齐,可以极大的简化程序开发和提高程序的灵活性。比如java的APT技术衍生的很多框架,dagger、butterknife、greendao等,使用注解来生成辅助代码;比如使用ASM技术直接修改和生成class字节码的jacoco,再比如android的databinding框架,甚至是一些hook和插件化机制,都可以说是AOP编程方式的一种应用。
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量