UML顺序图
- 1、 UML
- 2、 UML顺序图
- 2.1 顺序图组成
- 对象
- 生命线
- 消息
- 2.2 顺序图和用例
- 登录用例
- 2.3 顺序图建模
- 顺序图建模参考策略
- 建立顺序图的步骤
- 建立顺序图的示例
- 3、面对对象的设计原则
- 3.1 特点
- 3.2 层次
- 3.3 注意点
- 类设计需要强内聚,弱耦合
- 可重用性
- 框架
1、 UML
统一建模语言(Unified Modeling Language)
- UML由3个元素组成:UML的基本构造块、支配这些构造块如何放置在一起的规则和运用于整个语言的一些公共机制。
- UML的词汇表包含3种构造块:事物、关系和图。事物是对模型中最具有代表性的成分的抽象;关系把事物结合在一起;图聚集了相关的事物。
- 事务:结构事务、行为事务、分组事务和注释事务。
- 关系:依赖、关联、泛化和实现。
2、 UML顺序图
强调消息时间顺序的交互图。顺序图描述了对象之间传送消息的时间顺序,用来表示用例中的行为顺序。
顺序图将交互关系表示为一个二维图,即在图形上,顺序图是一张表,其中显示的对象沿横轴排列,从左到右分布在图的顶部;而信息则沿纵轴按时间顺序排序。创建顺序图时,以能够使图尽量简洁为依据布局。
购买小车的顺序图:
2.1 顺序图组成
对象
顺序图中对象的符号和对象图中对象所用的符号一样。
将对象置于顾序图的顶部意味着在交互开始的时候对象就已经存在了,如果对象的位置不在顶部,那么表示对象是在交互的过程中被创建的。
参与者和对象按照从左到右的顺序排列。
一般最多两个参与者,他们分列两端,启动这个用例的参与者往往排在最左边;接受消息的参与者则律在最右端;
对象从左到右按照重要性排列或按照消息先后顺序排列。
-
对象命名方式
-
对象创建的两种情况
- 顺序图中的对象的默认位置是在图的顶部,如果对象在这个位置上,那么说明在发送消息时,该对象就已经存在了;
- 如果对象是在执行的过程中创建的,那么它的位置应该处在图的中间部分。
-
对象创建两种方法
-
对象撤销的两种情况
- 在处理新创建的对象,或顺序图中的其他对象时,都可以发送“destroy”消息来撤销对象。
- 要想说明某个对象被撤销,需要在被撤销对象的生命线末端放一个“x”符号进行标识。
生命线
每个对象都有自己的生命线,用来表示在该用例中一个对象在一段时间内的存在;
生命线使用垂直的虚线表示;
如果对象生命期结束,则用注销符号表示;
对象默认的位置在图顶部,表示对象在交互之前已经存在;
如果是在交互过程中由另外的对象所创建则位于图的中间某处;
激活表示该对象被占用以完成某个任务,去激活指的则是对象处于空闲状态、在等待消息;
在UML中,为了表示对象是激活的,可以将该对象的生命线拓宽成为矩形。其中的矩形称为激活条(期)或控制期,对象就是在激活条的顶部被激活的,对象在完成自己的工作后被去激活。
消息
面向对象方法中,消息是对象间交互信息的主要方式,
1. 在任何一个软件系说中,对象都不是孤立存在的,它们之间通过消息进行通信。
2. 消息是用来说明顺序图中不同活动对象之同的通信,因此,消息可以激发某个提作,创建或销某个对象。
结构化程序设计中,模块间传递信息的方式主要是过程(或函数)调用。对象A向对象B发送消息,可以简单地理解为对象A调用对象B的一个提作(operatcn)。
在顺序图中,消息是由从一个对象的生命线指向另一个对象的生命线的直线箭头来表示的,箭头上面还可以表明要发送的消息名及序号。顺序图中消息编号可显示,也可不显示。协作图中必须显示。
顺序图中,尽力保持消息的顺序是从左到右排列的。在各对象之间,消息的次序由它们在重直轴上的相对位置决定,
一个顺序图的消息流开始于左上方,消息2的的置比消息1低,这意味着消息2的股序比消息1要迟。因为西方的阅读习惯量从左到右。
在UML中,消息使用箭头来表示,箭头的类型表示了消息的类型。进行顺序图建模时,所用到的消息主要包括以下几种类型:
-
简单消息(Simple Message)
-
同步消息(Synchronous iMessage)
同步消息最常见的情况是调用,即消息发送者对象在它的一个操作执行时调用接收者对象的一个操作,此时消息名称通常就是被调用的操作名称。
当消息被处理完后,可以回送一个简单消息,或者是隐含的返回。
-
异步消息(Asynchronous Message)
异步消息表示发送消息的对象不用等待回应的返回消息,即可开始另一个活动。
异步消息在某种程度上规定了发送方和接收方的责任,即发送方只负责将消息发送到接收方,至于接收方如何响应,发送方则不需要知道。对接收方来说,在接收到消息后它既可以对消息进行处理,也可以什么都不做。
-
反身消息(Message to Self)
顺序图建模过程中,一个对象也可以将一个消息发送给它自己,这就是反身消息。- 如果一条消息只能作为反身消息,那么说明该操作只能由对象自身的行为触发。
- 这表明该操作可以被设置为private属性,只有属于同一个类的对象才能够调用它。
- 在这种情况下,应该对顺序图进行彻底的检查以确定该操作不需要被其他对象直接调用。
-
返回消息(Retur Message)
返回消息是顺序图的一个可选择部分,它表示控制流从过程调用的返回。
返回消息一般可以缺省,隐含表示每一个调用都有一个配对的调用返回。
是否使用返回消息依赖于建模的具体/抽象程度。如果需要较好的具体化,返回消息是有用的;否则,主动消息就足够了。
2.2 顺序图和用例
顺序图的主要用途之一是用来为某个用例的泛化功能提供其所缺乏的解释,即把用例表达的要求转化为更进一步的精细表达。
用例常常被细化为一个或多个顺序图。
顺序图除了在设计新系统方面的用途之外,它还能用来记录一个存在于系统的对象现在如何交互。
登录用例
2.3 顺序图建模
对系统动态行为建模的过程中,当强调按时间展开信息的传送时,一般使用顺序图建模技术。
一个单独的顺序图只能显示一个控制流。一般情况下,一个完整的控制流是非常复杂的,要描述它需要创建很多交互图(包括顺序图和协作图),一些图是主要的,另一些图用来描述可选择的路径和一些例外,再用一个包对它们进行统一的管理。
顺序图建模参考策略
建立顺序图的步骤
建立顺序图的示例
3、面对对象的设计原则
3.1 特点
- 面向对象设计强调定义软件对象,并且使这些软件对象相互协作来满足用户需求。
- 面向对象分析和设计的界限是模糊的,从面向对象分析到面向对象设计是一个逐渐扩充模型的过程。分析的结果通过细化直接生成设计结果,在设计过程中逐步加深对需求的理解,从而进一步完求分析的结果。
- 分析和设计活动是一个反复选代的过程。
- 面向对象方法学在概念和表示方法上的一致性,保证了各个开发阶段之间的平滑性。
3.2 层次
四个层次:
3.3 注意点
面向对象设计与结构化设计的过程和方法完全不同,要设计出高质量的软件系统,记住:
- 对接口进行设计
- 发现变化并且封装它
- 先考虑聚合然后考虑继承
类设计需要强内聚,弱耦合
交互耦合:如果对象之间的耦合是通过消息连接来实现的,则这种调合就是交互耦合。在设计时应该尽量减少对象之间发送的消息数和消息中的参数个数,降低消息连接的复杂程度,
继承耦合:继承耦合是一般化类与特殊化类之间的一种关联形式,设计时应该适当使用这种耦合。在设计时要特别认真分析一般化类与特殊化类之间继承关系,如果抽象层次不合理,可能会适成对特殊化类的修改影响到一般化类,使得系统的稳定性降低,另外,在设计时特殊化类应该尽可能多地继承和使用一般化类的属性和服务,充分利用继承的优势。
- 单一责任原则:让一个类只做一种类型责任;
- 开关原则:可扩展和修改的;
- 里氏替换原则:可以用子类来替换父类;
- 依赖倒置原则:高层模块不能依赖底层模块;
- 接口分离原则:依赖于抽象,不要依赖于具体,同时在抽象级别不应该有对于细节的依赖。
可重用性
软件重用是从设计阶段开始的,所有的设计工作都是为了使系统完成预期的任务,为了提高工作效率、减少错误、降低成本,就要充分考虑软件元素的重用性。重用性有两个方面的含义:
1. 尽量使用已有的类,包括开发环境提供的类库和已有的相似的类;
2. 如果确实需要创建新类,则在设计这些新类时考虑将来的可重用性。
设计一个可重用的软件比设计一个普通软件的代价要高,但是随着这些软件被重用次数的增加,分摊到它的设计和实现成本就会降低。
框架
框架是一组可用于不同应用的类的集合。框架中的类通常是一些抽象类并且相互有联系,可以通过继承的方式使用这些类。例如,Java应用程序接口(API)就是一个成功的框架包,为众多的应用提供服务,但一个应用程序通常只需要其中的部分服务,可以采用继承或聚合的方式将应用包与框架包关联在一起来获得需要的服务。
一般不会直接去修改框架的类,而是通过继承或聚合为应用创建合适的GUI类。