背景介绍
上一篇文章我们一起粗略了解了三种编程范式,并一起学习了结构化编程,这一篇文章我们就一起学习面向对象编程吧~
《架构整洁之道》系列:
面向对象编程
什么是面向对象编程?
有些人在回答这个问题的时候,往往会搬出一些神秘的词语,譬如封装、继承、多态。其隐含意思就是说面向对象编程是这三顶的有机组合,或者任何一种支持面向对象的编程语言必须支持这三个特性。
那么接下来逐个分析这三个特性~
封装
由于面向对象编程语言为我们方便而有效地封装数据和函数提供了有力的支持,导致封装这个概念经常被引用为面向对象编程定义的一部分。通过采用封装特性,我们可以把一组相关联的数据和函数圈起来,使圈外面的代码只能看见部分函数,数据则完全不可见。譬如,在实际应用中,类(class)中的公共函数和私有成员变量就是这样。
这个特性其实并不是面向对象编程所独有的。其实,C 语言也支持完整的封装。比如在头文件中进行数据结构以及函数定义的前置声明(forward declare),然后在程序文件中具体实现。程序文件中的具体实现细节对使用者来说是不可见的。
面向对象编程在应用上确实会要求程序员尽量避免破坏数据的封装性。但实际情况是,那些声称自己提供面向对象编程支持的编程语言,相对于 C 这种完美封装的语言而言,其封装性都被削弱了,而不是加强了。
继承
继承的主要作用是让我们可以在某个作用域内对外部定义的某一组变量与函数进行覆盖。
但是,早在面向对象编程语言被发明之前,对继承性的支持就己经存在很久了,但是并不像如今的继承这样便利易用。
面向对象编程在继承性方面并没有开创出新,但是的确在数据结构的伪装性上提供了相当程度的便利性。
面向对象编程在封装性上得 0 分,在继承性上勉强可以得 0.5 分(满分为 1)。
多态
归根结底,多态其实不过就是函数指针的一种应用。自从 20 世纪 40 年代末期冯·诺依曼架构诞生那天起,程序员们就一直在使用函数指针模拟多态了。也就是说,面向对象编程在多态方面没有提出任何新概念。
所以,面向对象的三个特性没有一个是它独创的。
当然了,面向对象编程语言虽然在多态上并没有理论创新,但它们也确实让多态变得更安全、更便于使用了。用函数指针显式实现多态的问题就在于函数指针的危险性。毕竟,函数指针的调用依赖于一系列需要人为遵守的约定。程序员必须严格按照固定约定来初始化函数指针,并同样严格地按照约定来调用这些指针。只要有一个程序员没有遵守这些约定,整个程序就会产生极其难以跟踪和消除的 Bug。
面向对象编程语言为我们消除了人工遵守这些约定的必要,也就等于消除了这方面的危险性。采用面向对象编程语言让多态实现变得非常简单,让一个传统 C 程序员可以去做以前不敢想的事情。 综上所述,我们认为面向对象编程其实是对程序间接控制权的转移进行了约束。
结束语
面向对象编程到底是什么?业界在这个问题上存在着很多不同的说法和意见。
然而对一个软件架构师来说,其含义应该是非常明确的:面向对象编程就是以多态为手段来对源代码中的依赖关系进行控制的能力,这种能力让软件架构师可以构建出某种插件式架构,让高层策略性组件与底层实现性组件相分离,底层组件可以被编译成插件,实现独立于高层组件的开发和部署。
《架构整洁之道》中的面向对象编程讲的部分内容不理解,后续面向对象将参考更多文献进行输出。
最后
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
少年向来不识天高地厚
放眼处皆自负才高八斗
虽是自命风流
倒也坦诚无忧
我爱这样的少年
谦和而狂妄
骄傲又坦然☀️
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨