《大象-Think In UML》读书笔记1
大音希声,大象希行。
什么是面向过程?什么是面向对象?
面向过程归纳为结构化程序设计、DFD图、ER模型、UC矩阵等,而面向对象则被归纳为继承、封装、多态、复用等具体的技术。事实上,上述的所有技术都只是人们在采用不同的方法来认识和描述这个世界时所采用的工具,他们都只是表征而不是本质。
面向过程方法认为我们的世界是一个个相互关联的小系统依据严密的逻辑组成的,环环相扣,井然有序。对于每一个小系统都有着明确的开始和明确的结束,开始和结束之间有着严禁的因果关系。只要我们将这个小系统中的每一个步骤和影响这个小系统走向的所有因素都分析出来,我们就能完全定义这个系统的行为。
所以我们要分析这个世界,并用计算机来模拟它,首要的工作是将这个过程描绘出来,把它们的因果关系都定义出来:再通过结构化的设计方式,将这些过程进行细化,形成可以控制的、范围较小的部分。通常,面向过程的分析方法是找到过程的起点,然后顺藤摸瓜,分析每一个部分,直至达到过程的重点。在这个过程中的每一个部分都是过程链上不可分割的一环。
面向过程的困难,本质上是因为面向过程方法将世界看作是过程化,一个紧密相连的小系统,构成这个系统的各个部分之间有着不可分的因果关系。这种分析方法在需求复杂度较低的时候非常管用,如同一台照相机,将物体的反光经过镜头传导到感光胶片,再经过冲洗就能将信息复制出来。然而这个世界系统是如此的复杂和不可捉摸,就如同那个著名的蝴蝶效应,预设的过程仅仅因为一只蝴蝶扇动了一下翅膀就从此被颠覆,变得面目全非了。
面向对象方法将世界看做一个个相互独立的对象,相互之间并无因果关系,他们平时是“鸡犬之声相闻,老死不相往来”的。只有在某个外部力量的推动下,对象之间才会依据某种规律相互传递信息,这些交互构成了这个生动世界的一个“过程”,在没有外力的情况下,对象则保持这“静止”的状态。
对象有着坚硬的外壳,从外部来看,除了它用来与外界交互的消息通道之外,对象内部就是一个黑匣子,什么也看不到,这被称为封装;在例如对象可以结合在一起形成新的对象,结合后的对象具有前两者特性的总和,这称为聚合;对象可以繁育,产下的孩子将拥有父辈全部的本领,这称为继承;对象都是多面派,他会根据不同的要求展现其中的一个面,这就是接口;多个对象可能长着相同的脸,而这张脸背后却有着不同的行为,这就是多态。
面向对象方法与面向过程方法根本的不同,就是不再把世界看做是一个紧密关联的系统,而是看成一些相互独立的小零件,这些零件依据某种规则组织起来,完成一个特定的功能。
面向对象的困难:
对象是怎么对抽取出来的?现实世界和对象世界看上去差别是那么大,为什么要这么抽象而不是那么抽象呢?(why)
对象世界由于其灵活性,可以任意组合,可是我们怎么知道某个组合就正好满足了现实世界的需求呢?什么样的组合是好的,什么样的组合是差点?(how)
抛开现实世界,对象世界是如此的难以理解。如果只给一个对象组合,我怎么才能理解它表达了怎样的含义呢?(what)
我们把世界看做是由许多对象组成的这并没有错,只是现实世界和对象世界之间存在着一道鸿沟,这道鸿沟的名字就叫做抽象,抽象是面向对象的精髓所在,同时也是面向对象的困难所在。实际上,想要跨越这道鸿沟,我们需要:
一种把现实世界映射到对象世界的方法。
一种从对象世界描述现实世界的方法。
一种验证对象世界行为是否正确反映了现实世界的方法。幸运的是,UML,准确的说是UML背后所代表的面向对象设计方法,正好架起了跨越这道鸿沟的桥梁。