UML和RUP
大象
所谓UML,就是使用面向对象的方法来设计更为复杂和强大的系统。使用UML,就是为了孤立不同的对象,设计他们的信息交互方式。
面向过程和面向对象,是软件开发过程中遇到的两个不同阶段。前者是最开始出现的,面向过程以数据为中心,这导致了一个问题:由于数据变化是十分常见的,因此面向过程的设计在需求变化的时候需要进行大幅度的修改。面向过程的困难,本质上是因为面向过程方法把世界看作是过程化的,是一个个紧密联系的小系统,构成这个系统的各个部分之间有着密不可分的因果关系,而这种分析方式,只是适合复杂度较低的系统。
面向对象与面向过程的思想不同,面向对象的思想强调不同对象之间的独立性,他们在没人用的时候是独立存在的,只有当某种外力作用时,才促使他们进行不同的信息交换。这是一种封装、聚合的思想。面向过程把世界看成一个紧密联系的系统,但是面向对象把世界看成一个个相互独立的零件,这些零件相互独立,在外力让他们相互作用的前提下,构成了这个世界。面向对象想把面向过程变成下面这个图:
但是,这只是一个简单的介绍:我们如何把左边的图转换成右边的图呢,如何才能够让对象(类)表示好这个过程,怎么样的对象关系(设计)才是好的,怎么样的对象关系才是不好的,这才是我们需要知道的问题。许多设计师当被问到,为什么要这样设计,这样的设计是否满足需求的时候,常常的回答是:我的这个设计用了什么什么设计模式,这个结构怎么怎么灵活,扩展性怎么怎么强,所以它肯定可以满足需求:无法拿出一个实实在在的推导过程。
程序员一手拿着需求说明书,一手拿着软件工程师的设计说明书,看了半天也不知道这两者是怎么联系起来的,为什么这份需求,就产生了这份设计文档。
下面这个例子说明了一些问题:
1, 如果你习惯在调研需求的时候弄清楚有多少业务流程,先画出流程图,然后顺藤摸瓜找到业务流程中每一步的参与部门或者岗位,弄清楚这一步参与者所需要做的事情和填写数据,然后关系这一步的下一步是什么,那么很不幸,你还在做面向过程的事情。
2, 如果你的分析习惯是在调研的时候最先弄清楚有多少部门,多少岗位,然后找到这些部门提供了什么业务,他们平时做了什么,这件事交给谁办,做完之后需要通知或者传达给谁吗?那么这是OO了,恭喜!。
在一个解决世界问题的根本方法,就是要先建立一个抽象的模型,在建立模型的过程中,我们需要考虑下面的问题:什么人做了什么事,什么事产生了什么物,中间的规则是什么,在定义人、事、物之间的关系,这样一个模型也就出来了。(我理解:什么玩家,这些玩家你的游戏提供了什么玩法,这些玩法怎么玩,规则是什么,然后定义好玩家、玩法、玩的结果之间的关系,这样一个游戏模型也就出来了。
人、事、物是UML中需要定义的三个重要方面。人:是creator,任何的软件,都是为人设计的。人驱动着软件,变化需求,即便是游戏,也是用户为中心。事:Use case是表示驱动者的业务目标,表示参与者想做什么并且获得什么。这个业务目标就是现实中的事,游戏里面的Features,这些Features由不同的Mechanics组成。物:UML通过被称为业务对象模型(注意:和业务模型不同,业务模型包括了三者)的视图来说明在完成这些业务目标的过程中需要涉及的事物,用逻辑概念表示他们,并定义他们之间的关系。在游戏里,物这部分,需要考虑:程序、美术、音乐等多方面涉及的事物。
从现实世界到业务模型,只是第一步,业务模型计算机是无法理解的,还有一段路需要走。这其中最重要的一步就是概念模型:
UML通过被称之为概念化的过程来建立适合计算机可以理解和实现的模型,这个模型称之为分析模型(Analysis Model)。分析模型向上映射原始需求,向下为计算机实现规定了一种高层次的抽象,这种抽象是一种指导,也是一种约束,计算机实现过程非常容易遵循这种知道和约束来完成可执行代码的设计工作。分析模型需要由下面三种不同的规则来定义:
除了把不同的人事物规则按照不同的设计方法进行划分,还可以在这个阶段进行一些归纳和处理,以表达软件所要求的一些信息。例如包、组件和节点,软件架构和框架也通常在这个阶段产生。下图显示了从业务化的模型到概念化的模型的转化过程。
现在我们的过程,处于这个阶段:现实世界、业务模型、概念模型。概念模型距离可以执行的代码已经十分接近了。概念模型使得我们获得了软件的蓝图,获得了所有所需要的组成内容已经建设软件所需要的所有必要细节。接下来,我们需要进入设计模型的设计。在设计模型中,概念模型的边界类转化为界面或者接口;控制类转换成计算程序或者控制程序,例如工作流、算法等;实体类转化为数据库、xml、文件持久化类。
总的来说,就是下面这个:
需要理解,UML只是一种建模语言,但是RUP是一种统一过程,使用了UML,但是RUP并不是因为UML诞生的,它有更长时间的发展。下面是RUP定义的四个阶段和九个核心的工作流,每一个工作流在不同的阶段都有不同的工作量比重。
需要知道的是:
软件项目真正的灵魂是软件开发的过程,这个过程能够保证你开发出最优秀的软件,软件过程的需要产生了UML这种过程建模语言,掌握了软件开发过程,了解了为什么要有用例、为什么要有分析模型、为什么要有设计模型,才会知道UMl怎么画,什么时候画,怎么才画的好。为什么我们需要投入这么多来实现统一过程呢?一方面为了提高软件成熟度的需要(CMM),实施RUP已经达到了CMM二级到三级的水平。对于小型公司,XP极限编程,敏捷开发才是更为有效的方法。