【UML九种图系列】之如何利用三层来绘制类图、时序图?

 

UML并发视图:实体之间行为的交互,是动态。分为:时序图、协作图、状态图、活动图

一、时序图简述:

时序图(Sequence Diagram):描述对象之间的交互行为,按照时间顺序排列。

元素:

角色(Actor):人/系统

对象(Object):

生命线(Lifeline):对象存在的时间

控制焦点(FocusofControl):表示时间段的符号

消息(Message):

同步消息(SynchronousMessage):等待结果。

异步消息(AsynchronousMessage):不等待结果。

返回消息(ReturnMessage):从过程调用返回

自关联消息(Self-Message):统一的对象中方法的自身调用/相互调用。

二、如何绘制时序图?

    时序图是如何绘制的呢?它和类图之间是什么关系呢?时序图的绘制和三层架构之间又是如何联系的呢?下面的内容将解答您所有的疑惑: 

用一个纯三层的例子描述时序图是如何实现系统登陆的:

1、首先,绘制类图:

U层作用:输入+显示+简单判断,如:frmLogin类

B层作用业务逻辑(理解什么是也要业务,对于时序图的绘制是很重要的!)是本系统中所特有的功能。如:LoginBLL类

D层作用:针对数据库中表的数据进行增删改查。如:UserDAL类、UserJobRecordDAL类。


2、其次,绘制时序图:(注:A向B的传递消息=A调用B的方法)

PS:图中传递的消息,解析如下:

frmLogin类属于U层,解析如下:

isEmpty:判断是否为空

isRightful:判断输入的合法性(是否含有非法字符)

LoginBLL类属于B层,解析如下:

Login(UserName,Password):登陆,并把用户输入的UserName,Password传递进去。

QueryUserByUserName(UserName):把U层传递的UserName传递至D层,以获取该系统用户的信息(密码、状态)。

isEmpty:判断获取的信息是否为空。若为空,则数据库中不存在该用户名,则登陆失败。

isPasswordRight:判断用户名和密码是都匹配。

isOnDuty:判断该用户是否处于上机状态,若已经处于上机状态,则不允许二次登陆。 

UserDAL类、UserJobRecordDAL类属于D层,解析如下:

QueryUserByUserName(UserName):按照用户名查询,User表中含有UserName的信息。

ModifyUser(UserState):若登陆成功,则修改User表中,该UserName 的状态一项为“正在值班”,

AddUserJobRecord:并在UserJobRecord表中添加一条关于该UserName 的上机记录。

 

三、如何确定三层中应该放什么类呢?

1、Entity:数据库中有N个表,则Entity层中就有N个类,和数据库中的表一一对应。

2、D层:D层是对数据库的增删改查,则D层中有N个类,分别对应N个表均有增删改查的操作。当然您也可以增加如静态数据、枚举类型……的实体类。

3、U层:主要放窗体类,有M个窗体,U层中就有M个类

图示如下:

那么,B层中的类,该如何划分呢?有两种划分方式:

1、B层中的类,可以由该系统的功能/用例推导出。如:登陆Login用例是用户的一项功能。因此,可以在B层中写LoginBLL类。这样划分的特点是,有多少个用例,B层中就有多少个类。类的划分粒度比较细,该类的方法比较少,功能职责单一。但是数目比较多。

2、另一种方法是,由D层推导出,即D层有多少个类,B层就有多少个类,也就是说B层中的类和D层中的类是一一对应的关系。这种划分方式的特点在于:B层中的类数目比较少,相对而言方法就比较多,违背了单一职责的原则。

上如两种方式各有优缺点,仅供参考,如有建议欢迎指出。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注