(4) – 面向对象是瑞士军刀还是一把锤子?
最后更新于:2022-04-01 07:28:49
## 连载:面向对象葵花宝典:思想、技巧与实践(4) - 面向对象是瑞士军刀还是一把锤子?
**为什么要面向对象?**
可以说,面向过程和计算机是如影随形的。从计算机诞生之日起,面向过程就是占据着主导地位的思想,即使到了现在,面向过程也是无处不在的,C语言、操作系统、协议栈、驱动系统,都是面向过程的代表。
那为什么还会有面向对象的诞生并流行呢?当然是面向过程存在某些不足,如果面向过程足够好,谁还费心费力的去搞另外一套呢?
前面我们提到,面向过程是一种机器的思想,我们以流水线作为类比,那么我们先抛开面向过程,来看看流水线有什么不足。
举个简单的流水线例子:啤酒生产流水线。啤酒生产流水线分为“洗瓶”,“灌装”,“压盖”,“杀菌”等几个阶段,这些阶段总体上来说对生产一瓶醋是差不多的,但是一条啤酒生产线能够生产醋么?应该是不行的,即使行,估计也要换一些东西,但是换了东西后,又不能生产啤酒了。
面向过程同样就有流水线的这个缺点,即:流程和原料相对固定,扩展比较麻烦。
对于工业系统来说,流水线的缺点几乎可以微不足道,因为工业化讲究的是效率,而扩展性却不是那么重要,一旦一条生产线建成,至少需要运行几年,甚至运行十几年都有。
而对于软件系统来说,很难想象一个软件开发完成后,几年都不变,大部分的情况是,软件可能是1年扩展多次,甚至还没有开发完,客户新的需求又来了。
在软件系统这种环境下,面向过程显得就比较吃力了,每次需求的变更,可能都要将流程的每个步骤、原料、中间产品都进行修改,这样的代价在软件系统中几乎是不可接受的,因为每次修改都需要对全系统改动一次,不但工作量上大大增加,同时风险也是大大增加。
而面向对象正是为了解决面向过程的这个缺点儿诞生的,因此面向对象其实也不是什么复杂和玄妙的技术,面向对象思想的核心是“可扩展性”!
注:中文“可扩展性”对应英文有两种解释:extensibility 和 scalability,extensibility指系统需求变化后,能够比较容易的扩展以支持新需求;scalability指系统访问压力增加后,能够通过简单的增加更多硬件设备以支撑访问压力,又翻译为“可伸缩性”。 本文的可扩展性是指extensibility。
**面向对象应用范围**
能做什么?
既然面向对象思想的核心是“可扩展性”,那么其适用范围就显而易见了:经常变化的地方就是面向对象应用的地方。
对于软件系统来说,常见的可变的主要集中在客户需求部分,而不变的一般都是属于计算机系统的基础。
因此,操作系统、数据库、协议(TCP、3GPP等)这些并不适合面向对象大展身手,因为这些基础软件一般都比较稳定(相对稳定,并不是不变)。而对于企业应用、互联网等应用,需求经常变更,功能不断扩展,这正是面向对象大展身手的地方。
不能做什么?
下图是一个软件质量属性的全图:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-20_569f5cc924704.jpg)
大家可以看到,“可扩展性”只是软件质量属性中很小的一部分,其它的属性都不是面向对象能够解决的。
明白了面向对象的特点和适用范围,是应用面向对象的关键,经过前面的分析,我们知道,面向对象不是瑞士军刀,而只是一个普通的锤子而已,千万不要拿着锤子到处敲!