admin管理员组文章数量:1794759
大象
第一部分 准备篇
1.1 面向过程还是面向对象
在很多人看来,面向过程和面向对象都是一种软件技术。例如把面向过程归纳为结构化程序设计、DFD图、ER模型、UC矩阵等,而面向对象则被归纳为继承、封装、多态、复用等具体的技术。事实上,上述的所有技术都只是人们在采用不同的方法来认识和描述这个世界时所采用的工具,它们都只是表征而不是本征。
从本质上说面向过程和面向对象是一个古已有之的认识论的问题。之所以面向对象方法会兴起,是因为这种认识论能够帮助我们构造更为复杂的系统来解释越来越复杂的现实世界。认识到这一点,我们应该知道比掌握具体的技术更重要的是掌握认识论所采用的方法和分析过程。只有掌握了方法才能自如地使用工具。
这个世界的本质是由对象组成的,平时看上去相互无关的独立对象在不同的驱动力和规则下体现出不同的运动过程,然后这些过程便展现出了我们这个生动的世界。在面向过程的眼中,世界的一切都不是孤立的,它们相互紧密联系在一起,缺一不可, 相互影响,互相作用,并形成一个个具有严格因果律的小系统;而更多的小系统组成了更大的系统,所有小系统之间的联系也是紧密和不可分割的。
1.1.1 面向过程方法
面向过程方法认为我们的世界是由一个个相互关联的的小系统组成的。正如下图DNA,整个人体就是由这样小系统依据严密的逻辑组成的,环环相扣,井然有序。面向过程方法还认为每个小系统都有着明确的开始和明确的结束,开始和结束之间有着严谨的因果关系。只要我们将这个小系统中的每一个步骤和影响这个小系统走向的所有因素都分析出来,我们就能完全定义这个系统的行为。
然而,好方法只是使得困难暂时得以缓解。本质的问题出在认识方法上。将世界视为过程的这个方法本身蕴涵着一个前提假设,即这个过程是稳定的,这样我们才有分析的基础,所有的工作成果都依赖于对这个过程的步步分析。同时,这种步步分析的过程分析方法还导致另一个结果,即过程中的每一步都是预设好的,有着严谨的因果关系。只可惜我们这个世界从来都不是一成不变的, 尤其到了信息化时代,一切都无时无刻不在发生着变化,系统所依赖的因果关系变得越来越脆弱。面向过程已经面临了太多的困难,世界的复杂性和频繁变革已经不是面向过程可以轻易应付的了。
1.1.2 面向过程的困难
面向过程的困难,本质上是因为面向过程方法将世界看作是过程化的,一个个紧密相连的小系统,构成这个系统的各个部分之间有着密不可分的因果关系。这种分析方法在需求复杂度较低的时候非常管用,如同一台照相机,将物体的反光经过镜头传导到感光胶片,再经过冲洗就能将信息复制出来。然而这个世界系统是如此的复杂和不可捉摸,就如同那个著名的蝴蝶效应,预设的过程仅仅因为一只蝴蝶轻轻扇动了 一下翅膀就从此被颠覆,变得面目全
非了。
其实并非面向过程的方法不正确,只是因为构成一个系统的因素太多,要把所有可能的因素都考虑到,把所有因素的因果关系都分析清楚,再把这个过程模拟出来实在是太困难了。我们的精力有限,计算能力有限,只能放弃对整个过程的了解,重新寻找一个方法,能够将复杂的系统转化成一个个我们可以控制的小单元。这个方法的转换正如:如果一次成型一辆汽车太过困难,我们可以将汽车分解为很多零件,分步制造,再依据预先设计好的接口把它们安装起来,形成最终的产品。
1.1.3 面向对象方法
面向对象(Object Oriented,简称OO)方法将世界看作一个个相互独立的对象,相互之间并无因果关系,它们平时是“鸡犬之声相闻,老死不相往来”的。只有在某个外部力量的驱动下,对象之间才会依据某种规律相互传递信息。这些交互构成了这个生动世界的一个“过程”。在没有外力的情况下,对象则保持着“静止”的状态。
正如下图所示,在面向对象看来,同样一个DNA,它们的联系并非是那样紧密的。看上去浑然一体的小系统,其实是由许多具有不同性质的独立对象构成的。这些对象依据某个规律结合在一起然后具备了每一个DNA的特有性质。
从微观角度说,这些独立的对象有着一系列奇妙的特性。 例如,对象有着坚硬的外壳,从外部看来,除了它用来与外界交互的消息通道之外,对象内部就是一个黑匣子,什么也看不到,这被称为封装:再例如对象可以结合在一起形成新的对象,结合后的对象具有前两者特性的总和,这称为聚合;对象可以繁育,产下的孩子将拥有父辈全部的本领,这称为继承:对象都是多面派,它会根据不同的要求展现其中的一个面,这就是接口:多个对象可能长着相同的脸,而这张脸背后却有着不同的行为,这就是多态…
从宏观角度说,对象是“短视"的,它不知道它身处的整个世界是怎么回事,也不知道它的行为是如何贡献给这个世界的。它只知道与它有着联系的身边的一小群伙伴(这称为依赖),并与伙伴间保持着信息交流的关系(这称为耦合)。同时对象也是“自私”的,即便在伙伴之间,每个对象也仍然顽固地保护着自己的领地,只允许其他人通过它打开的小小窗口(这称为方法)进行交流,从不会向对方敞开心扉。
面向对象方法与面向过程方法根就是不再把世界看作是一个紧密关联的系统,而是看成一些相互独立的小零件, 这些零件依据某种规则组织起来,完成一个特定的功能。原来,过程并非这个世界的本源,过程是由通过特定规则组织起来的一些对 象“表现”出来的。面向对象和面向过程的这个差别导致了整个分析设计方法的革命。分析设计从过程分析变成了对象获取,从数据结构变成了对象结构。当然,世上并无完美的事情,面向对象尽管有这么一大堆的好处,它也有着其与生俱来的困难。
1.1.4 面向对象的困难
在实际的工作中,我们常常设计出许多类来满足某个需求。但是如果问一问为什么要这样设计,为什么是五个类而不是七个类?为什么是十个方法而不是十二个?能很好回答这个问题的人并不多,绝大部分人的回答是凭经验。经验是宝贵的,可惜经验也是靠不住的,凭经验的另一个说法是拍脑袋。从需求到设计,从现实到对象,那些类的确正如孙悟空从石头里蹦出来一样,设计师一拍脑袋就出来了。而可怜的经验不足的设计师们,在面对一个复杂需求的时候,只好不断尝试着弄出几个类来,拼一拼,凑一凑,发现解决不了问题,再重新来…多项目就在这样的尝试中不断受伤。
尽管不情愿,还是得承认很多时候我们只能通过不断测试来证明我们设计出来的那些类的确实现了需求,这往往需要在项目后期投入大量的返工成本,却不能清楚地在设计阶段就证明这些类已经满足了实际需求。许多设计师在被要求验证他的设计的确满足需求的时候,常常听到的回答是我的这个设计应用了某某设计模式,这个结构很灵活,扩展性很强,它肯定能满足需求…空谈了许多却无法拿出一个实实在在的推导过程。
而同时许多程序员,一手拿着设计师设计出来的结果,一手拿着系统分析员编写的需求说明书,苦思冥想就是无法把两者对上号:既搞不清楚到底设计是如何映射到需求的,也找不到两者之间的关系:他们脑子里常常盘旋着的问题是:这个类是表达了什么意思?为什么是这样的?
我们把世界看作是由许多对象组成的这并没有错,知识现实世界和对象世界之间存在着一道鸿沟,这道鸿沟的名字就叫做抽象。抽象是现象对象的精髓所在,同时也是面向对象的困难所在。实际上,要想跨越这道鸿沟,我们需要:
- 一种把现实世界映射到对象世界的方法。
- 一种从对象世界描述现实世界的方法。
- 一种验证对象世界行为是否正确反映了现实世界的方法。
本文标签: 大象
版权声明:本文标题:大象 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1697970598a354866.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论