读《大象:Thinking in UML(第2版) (谭云杰)》有感:
面向过程还是面向对象:
随着软件行业的发展,面向对象已经在业界中越来越受欢迎,无论是在学校开展的专业课,抑或是现在流行的编程语言、建模思想都离不开面向对象,那么究竟什么是面向对象呢?
其实说实话,现在我还不是非常理解面向对象这一概念,书上对它是这样解释的:“面向对象的精髓在抽象;面向对象的困难在抽象;面向对象的成功在于成功的抽象;面向对象的失败在于失败的抽象。正所谓成也抽象,败也抽象。”归根结底,面向对象关键在于对抽象这一概念的把握。早先几十年我们接触的还是面向过程,面向对象这一理念是这几年才兴起的,在很多人看来,面向过程和面向对象都是一种软件技术。例如把面向过程归纳为结构化程序设计、DFD图、ER模型、UC矩阵等,而面向对象则被归纳为继承、封装、多态、复用等具体的技术。事实上,上述的所有技术都只是人们在采用不同的方法来认识和描述这个世界时所采用的工具,它们都只是表征而不是本征。下面有一段对于面向对象编程理解的话,也是上课老师说过的一段话:“我对面向对象编程的目标从来就不是复用。相反,对我来说,对象提供了一种处理复杂性问题的方式。这个问题可以追溯到亚里士多德:您把这个世界视为过程还是对象?在面向对象兴起运动之前,编程以过程为中心,例如结构化设计方法。然而,系统已经到达了超越其处理能力的复杂性极点。有了对象,我们能够通过提升抽象级别来构建更大的、更复杂的系统——我认为,这才是面向对象编程运动的真正胜利。”
确实,我们这个世界就是由各种各样的对象构成,之所以面向对象方法会兴起,是因为我们所处的世界变得越来越复杂了,通过这种认识论能够帮我们解释这现实世界出现的复杂的现象。要想理解这种思想并不难,但是我们很多人潜移默化的养成了面向过程的思想,例如:吃饭这一词语,我们更关注的是吃而不是饭!饭是对象,而吃是它的行为,这便是面向对象的思想,世界万物都是对象,我们已经习惯了以过程方法来认识这个世界,所以要想理解面向对象的思想,我们就得接受这个世界是分割开的事实来。当然并不是说种思想没有坏处,两种思想各有各的缺点。
面向过程的困难:
本质是因为面向过程方法将世界看成是过程化的,一个个紧密相连的小系统,构成这个系统的各个部分之间有着密不可分的因果关系。这种分析方法在需求复杂度较低的时候非常管用,如同一台照相机,将物体的反光经过镜头传导到感光胶片,再经过冲洗就能将信息复制出来。然而这个世界系统是如此的复杂和不可捉摸,就如同那个著名的蝴蝶效应,预设的过程仅仅因为一只蝴蝶轻轻扇动了一下翅膀就从此被颠覆,变得面目全非了。
面向对象的困难:
面向对象看起来像是只要在开发时将所有东西都写到对象里,所有需要实现的功能都用对象来实现就可以了,然而现实不是这样的,这样做有没有一种可能我们仍是在做面向过程的事情,程序的所有功能所有模块全都封装到一个对象里,不仅仅没有体现面向对象的特点,还将开发过程变得繁琐起来。当然这里还有一种不太可能出现的结果,就是每个功能函数都封装到单个对象中,结果对象之间传递的信息量大增,这也不能体现面向对象的优势。面向对象中的问题不抽象是不允许的,但过分抽象,也当然是不可以的。下面是从文章中找到的有用的抽象方法:
1、一种把现实世界映射到对象世界的方法;
2、一种从对象世界描述现实世界的方法;
3、一种验证兑现对象世界行为是否正确反映了现实世界的方法。