面向过程/对象/接口/方面编程的总结

原创声明

对于这些概念的解释,网络上是有许多文章。但本文是纯手打的成果,完全用自己的语言来描述、综合、概括,绝非采集和转载。

关于这些「面向」,网络上的介绍已经非常丰富。不过为了达到「一站式」的效果,这篇文章尝试用作者自己的语言概括,让读者能够快速了解它们。

它们都是编程范式,或者说一种模式,习惯,而不是技术。

面向过程和对象是一组关系,强调完成任务过程中不同的关注点(Concern)。面向接口和切面基于面向对象,目的是方便日后移植、扩展和代码复用(Reuse)。

关键词:编程 面向 过程 对象 接口 方面 切面 对比

过程和面向对象编程

以打印机打印为例。

过程编程

过程编程(Procedural programming)类似流水线每个步骤——读取、分析、检查设备和墨水、打印、打印后……串联起来,依次执行

面向对象编程

面向对象编程(Object oriented programming)类似职能部门。把任务分解为一系列变量数据结构子方法等,按需调用。

告诉电脑有「打印机」这么一个东西(对象),它有墨水、纸等配件(属性),墨水又有剩余量的子属性。并且打印机还有一个打印东西的功能(方法),其中又有检查墨水、打印等步骤(子方法

上司知道自己公司有打印的能力,对打印部下达命令,打印部按照公司规章流程,先去命令后勤部检查墨水等材料的库存,然后命令生产部开始生产。

对比

很显然它们其实都可以达到同样的目的,只不过达到目的的方式略有不同。一个比较直接(要做什么就直接做了),一个比较直观、方便管理(通过封装成一个对象,或者说一个职能部门,要你做什么就做什么)。

所以写驱动程序的时候一般用 C/C++,因为通常,打印机就是打印机,它不要求播放音乐和拍照。但是如果写一套复杂的程序,比如 Word,它的功能不只是打印,还有编辑排版、审阅、统计字数、加密、发送等一系列要求,这时对象就比较高效。

需要注意的是,语言和面向没有直接关系。不是说 C语言 = 面向过程,C# = 面向对象。

面向接口和面向切面(方面)

面向接口

面向接口编程(Interface-Oriented Programming)是基于面向对象的,因为接口是对对象的抽象,目的是方便移植扩展。除此之外,你也可以把接口理解为协议、功能描述、标准、要求、共同之处等。

它通常和模块化(Modularity)联系在一起,如同机器的一个个部件,可以拆开单独开发(团队开发)和单独测试(单元测试,Unit testing)。如果两个部件需要联系,比如 USB 设备和电脑需要通信,则它们需要一个接口,即 USB 端口。

USB 端口就是一个现实的物理的接口,只要是带 USB 功能的设备,不管是可移动磁盘、鼠标、键盘还是什么东西都能用(可移植)。而且一开始电脑可能什么功能都没有,而你通过接入其它硬件接入这个接口就能拓展电脑的功能(可扩展)。

打印机接口可以视为打印机和电脑的协议——你给我文档我帮你打印,可以视为打印机的功能描述,一个能打印的东西才能叫做打印机(标准),打印机都要求有打印功能(要求),所有的打印机都能打印(共同之处)。

为什么能方便移植?面向接口编程时,调用的是接口而不是实现类。通俗地说,有奶就是娘。

为什么能方便扩展?扩展的部分是实现类,接口还是那个接口,即所谓开闭原则(Open Closed Principle)。程序原有部分(调用接口的部分,比如要求打印功能的打印按钮)通常不改动,改动的是打印的实现部分(比如增加新的打印机支持等),这样可以减少改来改去的时间,轻松实现功能更新。

面向切面(方面)

面向方面编程(Aspect Oriented Programming)是把频繁使用的方法提取出来。比如每一步操作都需要记录日志,就把日志记录功能提取出来形成模块(Module),这样就不必在每一步操作中一次又一次添加写日志的代码。

参考链接

Wikipedia – Procedural programming

Wikipedia – Object-oriented programming

Wikipedia – Interface-based programming

Wikipedia – Aspect-oriented programming

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注