【UML】初识UML(一)

为什么需要UML

过程还是对象?这是个问题。谈到UML,第一个绕不开的话题就是面向对象,就让我们从基本的方法开始,逐步揭开面向对象的面纱吧。

面向过程还是面向对象

在很多人看来,面向过程和面向对象都是一种软件技术。例如把面向过程归纳为结构化程序设计、DFD图、ER模型、UC矩阵等,而面向对象则被归纳为继承、封装、多态、复用等具体的技术。事实上,上述的所有技术都只是人们在采用不同的方法来认识和描述这个世界时所采用的工具,它们都只是表征而不是本征。
这个世界的本质是由对象组成的,平时看上去相互无关的独立对象在不同的驱动力和规则下体现出不同的运动过程,然后这些过程便展现出了我们这个生动的世界。在面向过程的眼中,世界的一切都不是孤立的,它们相互紧密联系在一起,缺一不可,相互影响,互相作用,并形成一个个具有严格因果律的小系统;而更多的小系统组成了更大的系统,所有小系统之间的联系也是紧密和不可分割的。

面向过程方法

面向过程方法认为我们的世界是由一个个相互关联的小系统组成的。它认为每个小系统都有着明确的开始和明确的结束,开始和结束之间有着严谨的因果关系。只要我们将这个小系统中的每一个步骤和影响这个小系统走向的所有因素都分析出来,我们就能完全定义这个系统的行为。
所以如果我们要分析这个世界,并用计算机来模拟它,首要的工作就是将这个过程描绘出来,把它们的因果关系都定义出来;再通过结构化的设计方法,将这些过程进行细化,形成可以控制的、范围比较小的部分、通常,面向过程的分析方法是找到过程的起点,然后顺藤摸瓜,分析每一个部分,直至达到过程的终点。这个过程中的每一个部分都是过程链上不可分割的一部分。

面向过程的困难

面向过程的困难,本质上是因为面向过程方法是将世界看作是过程化的,一个紧密相连的小系统,构成这个系统的各个部分之间有着密不可分的因果关系。这种分析方法在需求复杂度较低的时候非常管用,如同一台照相机,将物体的反光经过镜头传导到感光胶片,在经过冲洗就能将信息复制出来。然而这个世界系统是如此的复杂和不可捉摸,就如同那个著名的蝴蝶效应,预设的过程仅仅因为一只蝴蝶轻轻扇动了一下翅膀就从此被颠覆,变得面目全非了。
其实并非面向过程的方法不正确,只是因为构成一个系统的因素太多,要把所有的可能的因素都考虑到,把所有因素的因果关系都分析清楚,再把这个过程模拟出来实在是太难了。我们的精力有限,计算能力有限,只能放弃对整个过程的了解,重新寻找一个方法,能够将复杂的系统转化成一个个我们可以控制的小单元。
面向过程面对如今这个复杂的世界显得无能为力,面向对象又如何呢?让我们一起进入精彩纷呈的面向对象的世界,来探询面向对象方法是如何面对这个复杂世界的。

面向对象方法

面向对象(Object Oriented,简称OO)方法将世界看做一个个相互独立的对象,相互之间并无因果关系,它们平时是“鸡犬之声相闻,老死不相往来”的。只有在某个外部力量的驱动下,对象之间才会一句某种规律相互传递信息。这些交互构成了这个生动世界的一个“过程”。在没有外力的情况下,对象则保持着“静止”的状态。
从微观角度说,这些独立的对象有着一系列奇妙的特性。例如,对象有着坚硬的外壳,从外部来看,除了它用来与外界交互的消息通道外,对象内部就是一个黑匣子,什么也看不到,就被称为封装;再例如对象可以结合在一起形成新的对象,结合后的对象具有前两者特性的总和,这称为聚合;对象可以繁育,产下的孩子将拥有父辈全部的本领,这称为继承;对象都是多面派,他会根据不同的要求展现其中的一个面,这就是接口;多个对象可能长着相同的脸,而这张脸背后却有着不同的行为,这就是多态……
从宏观角度说,对象是“短视”的,他不知道它身处的整个世界是怎么回事,也不知道它的行为是如何贡献给这个世界的。它只知道与它有着联系的身边的一群小伙伴(这称为依赖),并与小伙伴保持着信息交流的关系(这称为耦合)。同事对象也是“自私”的,即便在伙伴之间,每个对象也仍然顽固地保护着自己的领地,只允许其他人通过她打开的小小窗口(这称为方法)进行交流,从不会向对方敞开心扉。
面向对象与面向过程方法根本的不同,就是不在把世界看作是一个紧密相连的系统,而是看成一些相互独立的小零件,这些零件依据某种规则组织起来,完成一个特定的功能。原来,过程并非这个世界的本源,过程是由通过特定规则组织起来的一些对象“表现”出来的。面向对象和面向过程的这个差别导致了这个分析设计方法的革命。分析设计从过程分析变成了对象获取,从数据结构变成了对象结构。
当然,世上并无完美的东西,面向对象尽管有这么一大堆好处,它也有着其与生俱来的困难。

面向对象的困难

现实世界和对象世界实质上是有差距的,及时面对简单的传统商业模式,我们仍有如下困惑:

  • 对象是怎么被抽象出来的?现实世界和对象世界看上去差别是那么大,为什么要这么抽象而不是那么抽象呢?(Why)
  • 对象世界由于其灵活性,可以任意组合,可是我们这么知道某个组合就正好满足了现实世界的需求呢?什么样的组合是好的,什么样的组合是差的呢?(How)
  • 抛开现实世界,对象世界是如此的难以理解,如果只给我一个对象组合,我怎么才能理解它表达了怎样的含义呢?(What)

如果您正被上面的这些问题困扰着,请您不要怀疑是否面向对象错了。我们把世界看作是由许多对象组成的这并没有错,只是现实世界和对象世界之间存在着一道鸿沟,这道鸿沟的名字就叫做抽象。抽象是面向对象的精髓所在,同时也是面向对象的困难所在。实际上,要想跨越这道鸿沟,我们需要:

  • 一种把现实世界映射到对象世界的方法。
  • 一种从对象世界描述现实世界的方法。
  • 一种验证对象世界行为是否正确反映了现实世界的方法。

幸运的是,UML,准却的说是UML背后所代表的的面向对象分析设计方法,正好架起了跨越这道鸿沟的桥梁。

在下一节里,让我们带着疑问,来看看UML是如何解决这些问题的。


更多精彩UML内容,请点击:

【UML】初识UML(二)

你可能感兴趣的:(UML,UML学习)