UML,是我在整套课程中比较期盼的内容。虽说是对UML的期盼,更是对CMM标准化项目开发的期盼。软件工程的概念是参照建筑工程等流程提出来的,与建筑工程相同,软件工程需要可行性分析、需求分析、概要设计、详细设计...。建筑需要图纸,软件也需要图纸,设计软件图纸的工具就是UML(统一建模语言)。
到传智播客学习,了解和运用软件工程也是我的重要目标之一。因为我受够了没有经过软件工程标准化开发,而直接编码所带来的痛苦。今日的课程内容比较简单,上课的氛围比较轻松。有机会听徐老师谈一谈国内的软件公司现状。CMM是印度人总结出来的被国际公认并普遍使用的软件工程规范,最高等级应该是CMM5。但十分遗憾的是中国的真正意义上的CMM5等级的这种软件企业并不多,为什么?要搞一个CMM5的认证来,与我们社会中想搞一个学位证书的概念差不多。可想这种卑劣的文化!残害着自己的民族。在这个社会里一切都不会超过人情世故。
我对这种标准化的工程流程十分关注,国内在这方面做的比较好的是大连。但大连是中国最大的软件外包产业,几乎全在为日本工作。所以这种CMM5的高层(设计层)都是由日本人来完成的,中国的“打字员”只需要按照日本人设计的详细文档,把代码敲到电脑里并测试通过就可以了。我们知道编码只是软件开发中的一小部分而已,非常惭愧!
不在其位莫思其事!
老徐说给我们提供UML的课程是为了让大家在以后的工作中能看懂UML图。UML的画图工具很简单,难在你用丰富的经验画出优美的软件框架和详细设计来。
一、软件工程
简要学习一下软件工程,软件工程是由软件危机引起的。软件危机就引起了瀑布模型,从瀑布模型又升级出来RUP来。
一幅美丽的用来形容软件工程问题的漫画:
1.瀑布模型
模型的特点是:
1). 各阶段间具有顺序性和依赖性: 后一阶段工作必须在前一阶段工作完成后才能进行。
2). 质量保证机制的依赖性。即每一步都必须循序渐进,及早消除故障隐患,保证本阶段的工作的质量,从而达到保证整体软件质量的目的。
3). 推迟实现原则。前一阶段工作做的越细, 越扎实,后一阶段工作进行的就越顺利,强调”宁慢求好”。因此,各阶段工作总是一拖再拖,致使整个工期推迟实现。显然瀑布模型不能满足呈爆炸状增长的社会应用需求。
2. 统一软件开发过程:RUP(Rational Unified Process,RUP)
一个通用的软件流程框架, 以架构为中心, 用例驱动的迭代化开发流程。 RUP 是从几千个软件项目的实践经验中总结出来的, 对于实际的项目具有很强的指导意义。RUP 用二维坐标来描述。 横轴通过时间来组织, 是过程展开的生命周期特征, 体现开发过程的动态结构;纵轴以内容来组织, 体现开发过程的静态结构。
有关瀑布模型和RUP的资料网上有很多,在次就不多做总结了。
三、UML
UML(United Modeling Language,统一建模语言):是一种基于面向对象的可视化建模语言。
UML采用了一组形象化的图形(如类图)符号作为建模语言,使用这些符号可以形象地描述系统的各个方面。
UML通过建立图形之间的各种关系(如类与类之间的关系)来描述模型。
UML中有二类图(共10种):
1).静态模型图:描述系统的静态结构
类图、对象图、包图、组件图、部署图
2).动态模型图:描述系统行为的各个方面
用例图、时序图、协作图、状态图、活动图。
其中蓝色为重点图例,其他的图例比较少用。
在画图之前我们有必要复习一下类的四种关系:
u 关联关系(association)
u 依赖关系(dependency)
u 泛化关系(generalization)
u 实现关系(realization)
我们在hibernate中有学习到这四种关系,原本我以为那只是在hibernate中使用。没想到在UML中也有,其实这四种关系应该是软件工程中的规范了。那hiberante也是使用了这种规范进行相关开发的,这样可以促进hibernate路线的正确性,这太好了!
我们使用的是IBM的RationalRoseUML设计工具,使用工具具体图画的操作就不说明了。
1.用例图
用例图(Use Case Diagram): 也称为用户模型图, 是从软件需求分析到最终实现的第一步, 它是从客户的角度来描述系统功能。
用例图包含 3 个基本组件:
1) 参与者(Actor): 与系统打交道的人或其他系统即使用该系统的人或事物。在UML中参与者用人形图标表示。
2) 用例(Use Case): 代表系统的某项完整的功能。在UML中使用一个椭圆来表示。
3) 关系: 定义用例之间的关系:
a) 泛化关系:表示同一业务目的(父用例)的不同技术实现(各个子用例)。 在UML中,用例泛化用一个三角箭头从子用例指向父用例。以下是某购物网站为用户提供不同的支付方式。
b) 包含关系:一个用例可以包含其他用例具有的行为, 并把它包含的用例行为作为自身行为的一部分。 在 UML 中包含关系用虚线箭头加 “<<include>>”, 箭头指向被包含的用例。
c) 扩展关系:如果在完成某个功能的时候偶尔会执行另外一个功能, 则用扩展关系表示。在 UML 中扩展关系用虚线箭头加 “<<extend>>”, 箭头指向被扩展的用例。
蓝线部分为:泛化关系。红线部分为:包含关系。绿线部分为:泛化关系。
2.类图
类图是面向对象系统建模中最常用的图,是定义其他图的基础。
类图主要是用来显示系统中的类, 接口以及它们之间的关系。
类图包含的主要元素有类, 接口和关系。 其中关系有关联关系, 泛化关系, 依赖关系和实现关系。 在类图中也可以包含注释和约束。
这里的关系十分重要,我们来一一看一下。
1). 泛化关系(继承关系):用来表示类与类, 接口与接口之间的继承关系. 泛化关系有时也称为”is a kind of”关系。
2). 实现关系:用来表示类与接口之间的实现关系。
3).依赖关系:比如我们上班需要交通工具,交通工具可以是公交车、私家车、电动车或自行车,步行也可以。这就是一依赖关系,使用某一个对象或对象的方法来完成一种功能。但与它不存在固定对应关系。
4).关联关系:对于两个相对独立的系统,当一个系统的实例与另一个系统的一些特定实例存在固定的对应关系时,这两个系统之间为关联关系。
多对多双向关联,可以自动生成代码哦:
关联关系中有一个难点,上面的图是多对多双向关联。我也可以映射出一对多和多对一的意向关联。但一对多关系中还有聚合关系和组成关系。
聚合关系:是更强形式的关联。强调部分和整体逻辑结构,但不强调生命周期。对应的属性具有get/set方法。例如计算机包含键盘和鼠标,但如果计算机不在了键盘和鼠标可以存。我们也可以为计算机换键盘和鼠标:
UML中组成关系:是更强形式的聚合,不仅强调部分和整体,而且还强调生命周期。仅有get方法。比如人有头和手,如果主体不在了,那么部分肯定也不存在了。也不能更换。
5).导航性:
导航性表示可从源类的任何对象到目标类的一个或多个对象遍历。 即:给定源类的一个对象, 可以得到目标类的所有对象。 可以在关联关系上加上箭头表示导航方向。
只在一个方向上可以导航的关联称为单向关联,用一个带箭头的方向表示; 在两个方向上都可以导航的关联称为双向关联, 用一条没有箭头的实线表示。
3. 时序图
时序图用于描述对象之间的传递消息的时间顺序, 即用例中的行为顺序。
当执行一个用例时, 时序图中的每条消息对应了一个类操作或者引起转换的触发事件。
在 UML 中, 时序图表示为一个二维的关系图, 其中, 纵轴是时间轴, 时间延竖线向下延伸。 横轴代表在协作中各个独立的对象。 当对象存在时, 生命线用一条虚线表示, 消息用从一个对象的生命线到另一个对象的生命线的箭头表示。 箭头以时间的顺序在图中上下排列。
时序图中的基本概念:
对象:时序图中对象使用矩形表示,并且对象名称下有下划线。将对象置于时序图的顶部说明在交互开始时对象就已经存在了。如果对象的位置不在顶部,表示对象是在交互的过程中被创建的。
生命线:生命线是一条垂直的虚线。表示时序图中的对象在一段生命周期内的存在。每个对象底部中心的位置都带有生命线。
消息:两个对象之间的单路通信。从发送方指向接收方。在时序图中很少使用返回消息。
激活:时序图可以描述对象的激活和钝化。激活表示该对象被占用以完成某个任务。钝化指对象处于空闲状态,等待消息。在 UML 中,对象的激活时将对象的生命线拓宽为矩形来表示的。矩形称为计划条或控制期。对象就是在激活条的顶部被激活的。对象在完成自己的工作后被钝化。
对象的创建和销毁:在时序图中, 对象的默认位置是在图的顶部。这说明对象在交互开始之前就已经存在了。如果对象是在交互过程中创建的,那么就应该将对象放到中间部分。如果要撤销一个对象,在其生命线终止点处放置“ X”符号。
5.活动图
活动图就是流程图,但在UML工具中可以加入泳道:
6.状态图
通过建立对象的生存周期模型来描述对象随时间变化的动态行为。比如hibernate中持久化对象的三种状态:临时状态、持久化状态、游离状态。
状态图的基本概念:
状态:用圆角矩形表示。状态名称表示状态的名字,通常用字符串表示。一个状态的名称在状态图所在的上下文中应该是唯一的。
转换:用带箭头的直线表示。一端连着源状态,一端连着目标状态。
初始状态:每个状态图都有一个初始状态。此状态代表状态图的起始位置。初始状态只能作为转换的源,不能作为转换的目标,并且在状态图中只能有一个。初始状态用一个实心圆表示。
终止状态:模型元素的最后状态,是一个状态图的终止点。终止状态在一个状态图中可以有多个。
7.协作图、对象图、包图
不画了,用处不大且非常简单。
8.组件图
组件图用来建立系统中各组件之间的关系,各组件通过功能组织在一起。
Javabean,ejb,jsp都是组件。在UML中,组件使用在左侧有两个小矩形的大矩形来表示。
组件图可以用来设计系统的整体构架:
9.部署图
部署图用来帮助开发者了解软件中的各个组件驻留在什么硬件位置,以及这些硬件之间的交互关系。
节点:用来表示一种硬件,可以是打印机,计算机等。节点的标记符号是一个三维框,在框的左上方包含了节点的名称。
通信关联:节点通过通信关联建立彼此的关系,采用从节点到节点绘制实线来表示关联。
一下子搞出来这么多东西,这么一看UML贯穿软件设计的各个阶段。让人感觉很好!
一定要学好软件工程,努力在工作中总结经验!