可以说,面向过程与计算机是如影随形的。从计算机诞生之日起,面向过程就是占据着主导地位的思想,即使到了现在,面向过程也是无处不在的,如C语言、操作系统、协议栈、驱动系统,都是面向过程的代表。 那么,为什么还会有面向对象的诞生并流行呢?当然是面向过程的某些不足,如果面向过程足够好,那么谁还会费心费力去搞另外一套呢?
面向过程是一种机器的思想,以流水线作为类比,那么我们先抛开面向过程,来看看流水线有什么不足。
举个简单的流水线例子:啤酒生产流水线。啤酒生产流水线分为“洗瓶”、“灌瓶”、“压盖”、“杀菌”等几个阶段,从总体上来说,这些阶段和生产一瓶醋是差不多的,但是一条啤酒生产线能够生产醋吗?应该是不行的,即使行,估计也要换一些东西,但是换了东西后,又不能生产啤酒了。
面向过程同样也有流水线的这个缺点,即:流程和原料相对固定,扩展比较麻烦。
对于工业系统来说,流水线的缺点可以说是微不足道的,因为工业化讲究的是效率,而扩展性却不是那么重要,一旦一条生产线建成,至少需要运行几年,甚至运行几十年的都有。
而对于工业系统来说,很难想象一个软件开发完成后,几年都不变,大部分情况是,软件可能一年扩展多次,甚至还没有开发完,客户的新需求又来了。
在软件系统这种环境下,面向过程就显得比较吃力了,每次需求的变更,可能都要对流程的每个步骤、原料、中间产品进行修改,这样的代价在软件系统中几乎是不可接受的,因为每次修改都需要对全系统改动一次,不但工作量会大大增加,同时风险也在大大增加。
而面向对象正是为了解决面向过程的这个缺点诞生的,因此面向对象其实也不是什么复杂和玄妙的技术,面向对象思想的核心是“可扩展性”!有了面向对象,我们可以将变化带来的影响控制在有限的范围内,避免产生全流程或者大范围的印象,从而降低风险。
中文“可扩展性”对应的英文有两种解释:extensibility和scalability,extensibility指系统需求变化后,能够比较容易地扩展以支持新需求;scalability指系统访问压力增加后,能够通过简单的增加更多的硬件设备以支撑访问压力,又翻译为“可伸缩性”。本文的可扩展性是指extensibility。
摘自李云华老师的《面向对象葵花宝典:思想、技巧与实践》