web前端开发修炼之道-面向对象编程(二)
好吧,还是先说一些p话,昨天说好这两天的电话面试是下午四五六点的。结果今天早上10点就给我打来电话。表示还准备早上准备一下的,毕竟有一段时间没搞页面了。面试完之后问结果怎么样的时候,那边说如果我是广州本地的就直接给offer了。这,武汉的孩子伤不起呀。可是我真的想去广州。
好,p话结束。
面向过程编程所有的数据和处理函数都是公有的,整个编程的思维过程就是定义数据,定义处理函数,然后将数据传给处理函数进行处理,处理函数之间也可以互相调用,数据和处理函数紧密耦合。面相对象编程的思维过程是定义一个个对象,对象有自己的属性和行为。因为属性和行为都是从属于对象的,于是有了“对象内”和“对向外”的概念,整个程序可以由一堆对象组成,对象与对象之间可能会有通信,为了实现这种通信,对象会将自己的部分属性和行为设计成公有,暴露出来成为通信的接口。对象和对象之间的通信都是建立在接口的基础之上的。当然我们可以将对象的所有属性和行为都设为公有的,全部都作为接口,但是接口越多,会让对象之间耦合越紧密,增加维护难度,所以一般情况下,我们都会尽量将对象的属性和方法设为私有,只将必要的属性和行为设为公有。但对象的公有属性和公有行为越少,整个程序的扩展性会越差,所以我们在设计公有和私有的时候需要权衡一下,在不影响扩展性的前提下,尽量将属性和行为设为私有。
经常听到这么一个比喻:面向对象编程程序的耦合关系就像是一个老旧的半导体收音机,整个收音机的线路错综复杂的交织在一起,形成一个不可分割的整体。如果哪一部分坏掉了,整个收音机就报废了;面向对象编程程序的耦合关系就像是一台先进的计算机,计算机由一系列的零件组装而成,有硬盘、内存、屏幕、声卡等,每个零件都是互相独立的,通过接口链接起来形成一个整体,如果哪一部分坏了,只需要更换相应的零件,其他的零件可以不受影响。
面向对象的英文全称叫做Object Oriented,简称OO。OO其实包括OOA(Object Oriented Analysis,面向对象分析)、OOD(Object Oriented Design,面向对象设计)和OOP(Object Oriented Programming,面向对象的程序设计)。面向对象的语法只对应OOP,只是OO的一部分。
一个典型的OO编程过程应该是先整理需求,根据需求进行OOA,将真实世界的客观物件抽象成程序中的类或者对象,这个过程经常会用到UML语言,也称UML建模,OOA的输出结果是一个个类或者对象的模型图。。接下来要进行OOD,这一步的目的是处理类之间的耦合关系,设计类或者对象的接口,此时会用到各种设计模式,例如观察者模式,责任链模式等。OOA和OOD是个反复迭代的过程,它们本身也没有非常清晰的边界,是相互影响、制约的。等OOA和OOD结束之后,才到了OOP,进行实际的编码工作。
OOA和OOD是面向对象编程的思想和具体语言无关,而OOP是面相对象编程的工具,和选用的语言相关。
但OOA和OOD与具体要求语言无关,一般情况下可以轻易跨语言重用。
OOP是使用面向对象技术的基础,面向对象的思维最后都要通过OOP来实施的。但OOP并不等于OO,甚至并不是OO的最重要的部分,我认为OOA才是OO的最重要最关键的部分,绝大多数情况下,我们的程序可能用不上很复杂的OOD设计。
我们常说的优秀程序是“高内聚、低耦合”的。聚合指的是把一个复杂的事物看成若干比较简单的事物的组装体,从而简化对复杂事物的描述,“高内聚”就是指对象(或类)对外提供的接口非常简单易懂,复杂的低层操作都封装在对象(或类)的接口内部,对用户透明。用户不用关心过多的低层细节,只需要类提供了哪些接口,用户知道的低层细节越少,对象的聚合程度就越高。耦合指的是类与类之间关联和以来的程度,低耦合就是类于类之间的依赖的程度低,类与类通信需要关联的接口越少,耦合程度越低。
从大局上决定程序品质的,不是OOP而是OOA和OOD,这是很多人需要注意的。