这几天在复习软件工程UML,真的是一门很奇怪的科目。
复习的时候在网上搜索资料才意识到这门课是以JAVA为基础的,问题是都没学过JAVA。之前写过JAVA的程序,不过也只是依葫芦画瓢。现在看来,JAVA在面向对象这一块贴合的非常紧密。UML更体现了JAVA在工程方面的优势。(虽然我一直都还没理解透面向对象,虽然UML被人说是没有用的东西。。。)
UML=Tings+Relationships+Diagrams,简单来说是一种建模语言,特别之处是它有各种各样的图,体现了对一个工程,一个模型的不同视角。
1. Use Case Diagrams
用例图:从用户的角度完整的描述了系统的功能。
上图就是一个简单的用例图,用例是所有的圆圈。passenger 也是描述的一部分,passenger,准确来说是actor的一个实例,actor是与用例进行联系的外界影响,在这里不能算是用例。
如何描述一个用例图呢,或者说一个用例应该具有哪些属性呢。
以PurchaseTicket为例
描述它应该要有
1.Name:Purchase ticket
2. Participating actor: Passenger
3. Entry condition:
乘客站在了购票机面前
乘客有钱
4.exit condition
乘客拿到票了
5.flow of events
乘客选择目的地
购票机现实票价
乘客投入钱
购票机找零
购票机吐出车票
6.sepecial requirements : none
描述一个用例真是要用好多废话,其实这部分也不重要,重要的是用例图怎么画,他们之间的关系是怎样的。
关系,没错,关系是UML中的关键,无论是用例图还是接下来的活动图,顺序图,还是类,关系都是不可缺少的。
extend关系
在上面的用例图中,可以看到 extend这样的关系:extend 用来扩展用例。
对于购票机来说,应该要考虑到用户不按照flow of events来操作该怎么办。对于这些exceptional的情况,用extend来扩展用例是比较方便的表示。
购票机应该要有应对超时,无操作,取消等特殊情况。购票机在设计的时候原本就只是让你规规矩矩用的,但是在实际使用中,当然会有这样的特殊情况,
但是这些特殊处理按道理来讲也不应该归到购票机里面去,所以就在外部对购票机进行扩充。这样的特殊操作在其他用例中也常常用来扩充。
include 关系:
如果划分细点,把购票机划分为单程票和多程票两个购票用例,那么就会发现他们都有一个共同的功能,那就是收钱。
这个时候就可以用到include 关系,两个用例都包含collectmoney这个用例。
inheritance 关系
继承关系。c++中也会常常用到。子类继承父类,子类有父类全部的特性(属性值,操作),同时又可以进行扩充,一代更比一代强嘛。平衡树就是二叉树的子类,堆也是二叉树的子类。
在做数据结构作业的时候,写了二叉树,后来写平衡树的时候,就直接继承的之前写过的二叉树的类,然后进行扩充。
在用例中也有这样的关系。
如上图,订票是父类,电话订票和网上订票都可以看做是对订票的补充,是子类。注意表示继承,是用线条带一个三角。
还有一些关系是在其他种类的UML中用的比较多,先直接介绍其他的UML图吧
2.类图:
展示系统结构。
用一个包含三个格子的矩形表示。从上到下分别是名字,属性,操作。
关系:
一对多,多对多,继承,聚合关系:
线条上的1和*表示一个和多个的关系:一个作者可能有多个出版物,一个出版物也可能有多个作者。
线条加三角表示继承:书和期刊都是继承的出版物。
菱形表示聚合:多个文章聚合为一个期刊。
聚合通常和组成容易混淆
组成是实心的菱形,组成比聚合关系更强。其实很容易分辨。比如一个公司由人聚合而成。公司没了 ,人还在,所以是聚合。一个公司也可以说是由各个部门组成,公司没了,部门也就没了,这就是组成。
对于类的具体实现叫做实例。
比如对于书这个类的实例 软件工程 表示如下
注意格式,冒号前是实例名字冒号后是类的名字。
3.交互图
UML的交互图有两种,一种是顺序图,一种是协作图。协作图不讲,因为上课讲的少。
一个交互图能把一个事件流完整的展示出来,同时也能展示各个实例,对象之间的交互。
上图是设定手表时间的交互图。
四个对象。从上到下的看,就能看出整个事件流。
这个图我觉得是最难画的,如果就让你直接画一个设定手表时间的交互图。你能想到最顶上一行有哪几个对象吗?
这个是有分类的。一个交互图是需要实体,边界,控制对象的。
实体表示需要长期跟踪记录的对象。
边界是用户最先能接触到的对象。
控制对象是内部控制其他对象的对象。
这个例子其实不完整,只能看到实体(时间)和边界对象(输入,显示),应该加入一个控制对象,用来接收输入传递,控制显示。
交互图细讲真是要讲很多,我还没学好呢,以后有时间再补充。
4. 状态图
大概就是状态机,侧重于系统会处于那几个状态,以及状态之间的转化条件
细节:起点是实心黑点,终点是同心圆黑点。
5.活动图
同样是展示一个具体事件,与交互图不同,并不关注交互的对象,关注的是活动本身。比如订购披萨的例子。想一想用交互图写一个订购披萨的例子真的很麻烦。用活动图就很方便了
分为两个泳道,不同泳道是由不同的对象执行的,加粗横线表示同步,需要上面的活动全部完成后才能通过同步线。
活动图也可以加入分支处理多种情况,比如在披萨图中加入意外处理情况
啊。。。真是麻烦。。。
6.包图:
用来聚合管理用例。
妈的写完这个之后感觉自己简直是个傻逼,写的又乱又不详细。明天要考试了 。
还是这个博客写的好http://blog.csdn.net/jiuqiyuliang/article/details/8552956/