周珍娟
面向对象软件设计中,产生大量的类、接口、组件、包等模型元素,以及用例图、类图、活动图、序列图、状态图等UML图。一些面向对象软件项目的模型元素和UML图多达几十至几百个,导致其UML设计模型难以组织,且相应的设计文档难以编制,不可避免地遇到如何建立软件设计模型描述框架的技术问题。UML标准(1.5版)[1]中对模型组织做了初步的规定。文献[2]给出了组织UML系统模型的五种视图、动态与静态两方面、层次性等观念。文献[3]给出了包括接口、接口语义、功能、内部关系等描述的构件描述框架。文献[4]给出了设计文档模板的实现方法,一些软件工具(如:Rose工具[5]、SoDA工具)提供了示例性的UML设计模型和设计文档模板。
多年来,笔者在多个软件项目中,使用UML语言和Rose工具进行面向对象设计,使用SoDA工具生成设计文档。随着设计细化产生了多达上百个的模型元素和UML图,遇到了以上所述的模型描述框架问题,并得到了较好的解决,还推广应用到多个软件开发单位。本文利用UML扩充机制提出了逻辑用例包、运行设计包、逻辑CSC、逻辑接口数据包等模型扩充描述要素,基于“4+1”视图体系结构和用例驱动方法建立了包含用例实现、软件进程、软件结构、外部/内部接口的设计模型描述框架,并利用该设计模型描述框架在Rose和SoDA工具上建立了UML设计模型模板和设计文档模板,实现了建模模板化和文档生成自动化。
“4+1”视图体系结构[8]包括逻辑视图、进程视图、开发视图、物理视图和用例视图。用例视图描述了软件需要的功能,并协调其他视图,保持设计的一致性,利用该视图可以建立软件用例实现模型。逻辑视图描述了组成软件的若干类及其关系,利用该视图可以建立软件结构模型和接口设计模型。进程视图描述了系统至进程和任务的分解以及这些并发元素之间的通信和同步,利用该视图可以建立软件进程模型。开发视图描述了在开发环境中软件的静态组织结构,利用该视图可以建立软件组件模型。物理视图描述了物理网络的配置,软件至硬件的映射,通过软件设计建立软件部署模型。这些模型共同构成软件设计模型。笔者用BNF范式来表示软件设计模型描述框架。
<软件设计模型>∷=<软件用例实现设计子模型>+<软件结构设计子模型>+<软件组件设计子模型>+<接口设计子模型>+<软件进程设计子模型>+<软件部署设计子模型>
其中,前四个模型一般均要用于软件设计建模,软件用例实现设计模型通过用例驱动方法与其他模型衔接,软件进程设计模型只用于多进程设计建模,软件部署设计模型只用于分布式软件设计建模。以下针对各设计模型,进一步给出其描述框架。
在软件设计过程中,每个用例均有相应的实现,可以用用例图表示相关用例和角色之间的关系,用序列图表示实现该用例的若干参与对象及其时序消息关系,用类图表示实现用例的这些参与对象所属类的相互关系,用活动图表示实现该用例的若干活动之间的关系,用状态图表示实现该用例的若干状态之间的转换关系。由此,得到用例实现的基本构成。
如果用例实现较多(一般多于5~7个),可以根据情况将用例实现分包,形成用例实现包。如果用例实现包还是比较多,可以根据情况将用例实现包继续分包,形成逻辑用例实现包。如果逻辑用例实现包仍然比较多,还可以进一步分包,形成高层的逻辑用例实现包。
这样就由用例实现、用例实现包、逻辑用例实现包逐层构成了软件用例实现设计模型,其BNF范式描述形式如下:
<软件用例实现设计子模型>∷={<逻辑用例实现包>|<用例实现包>}|{<用例实现>}+<用例图>+[<活动图>]
<逻辑用例实现包>∷={<逻辑用例实现包>|<用例实现包>}+<用例图>+[<活动图>]
<用例实现包>∷={<用例实现>}+<用例图>+[<活动图>]
<用例实现>∷=<用例图>+<序列图>+[<类图>]+[<活动图>]+[<状态图>]
软件结构设计模型以类和类之间关系为基础描述软件组成和结构。若干类组成具有语意的类包,如果类包对应于某个组件,就为CSC。若干类包可以组成具有语意的逻辑类包,多个逻辑类包和类包可以组成具有语意的、更大的逻辑类包,若干CSC可以组成具有语意的逻辑CSC。对于较复杂的软件可以先分逻辑层,再按类包、逻辑类包组织类。
这样就由类、类包、CSC、逻辑类包、逻辑CSC、逻辑层构成了软件结构设计模型,其BNF范式描述形式如下:
<软件结构设计子模型>∷={<逻辑层>}|{<逻辑CSC>|<逻辑类包>|<类包>}+<类图>
<逻辑层>∷={<逻辑CSC>|<逻辑类包>|<类包>}+<类图>
<逻辑CSC>∷= {
<逻辑类包>∷={<类包>}+<类图>
<类包>∷={<类>}+{<类图>}
软件组件设计子模型描述软件组件及其关系。每个组件实行相应的若干类,若干组件构成有语意的组件包,若干组件包和已构成的逻辑组件包可以构成新的、有语意的逻辑组件包。
这样就由组件、组件包、逻辑组件包构成了软件组件模型,其BNF范式描述形式如下:
<软件组件设计子模型>∷={<逻辑组件包>|<组件包>}|{<组件>}+<组件图>
<逻辑组件包>∷={<逻辑组件包>|<组件包>}+<组件图>
<组件包>∷={<组件>}+<组件图>
<组件>∷={<实现组件的类>}
接口设计子模型描述软件的外部接口和内部接口,细分为外部接口设计模型和内部接口设计模型。外部接口设计模型由接口类、接口设计包构成的外部接口设计架构以及由接口数据、接口数据包、逻辑接口数据包构成的外部接口数据架构两大部分组成。内部接口设计模型由接口类、接口设计包、CSC接口设计包构成的内部接口设计架构以及由接口数据、接口数据包、逻辑接口数据包构成的内部接口数据架构两大部分组成。接口设计模型的BNF范式描述形式如下:
<接口设计子模型>∷=<外部接口设计子模型>+<内部接口设计子模型>
<外部接口设计子模型>∷=<外部接口设计架构>+<外部接口数据架构>
<外部接口设计架构>∷={<接口设计包>}+<类图>
<接口设计包>∷={<接口类>}+{<类图>}
<外部接口数据架构>∷={<逻辑接口数据包>|<接口数据包>}+<类图>
<逻辑接口数据包>∷={<逻辑接口数据包>|<接口数据包>}+<类图>
<接口数据包>∷={<接口数据>}+{<类图>}
<内部接口设计模型>∷=<内部接口设计架构>+<内部接口数据架构>
<内部接口设计架构>∷={<接口设计包>|
<内部接口数据架构>∷={<逻辑接口数据包>|<接口数据包>}+<类图>
软件进程设计模型描述进程及其之间的通信关系,分为一个进程结构包、一个进程间通信包和若干进程包。其BNF范式描述形式如下:
<软件进程设计子模型>∷=<进程结构包>+<进程间通信包>+{<进程包>}
<进程结构包>∷={<类图>}+{<序列图>}+{<状态图>}
<进程间通信包>∷={<类图>}+{<序列图>}
<进程包>∷={<类图>}+{<序列图>}+{<状态图>}
软件部署设计子模型描述软件运行平台和软件在该平台上的部署,可以有若干处理机、若干设备和一个可视化的部署图。其BNF范式描述形式如下:
<软件部署设计子模型>∷={<部署的处理机>}+{<部署的设备>}+<部署图>
<部署的处理机>∷={<部署的进程及优先级>}
在以上的UML设计模型描述框架中,提出了若干新的描述元素,这些元素可以利用UML的构造型扩充机制构造出来。
笔者在多个软件项目的软件设计过程中,应用上面的UML软件设计描述框架,在Rose工具上建立了设计模型模板,在SoDA工具上建立了配套的设计文档生成模板,实现了建模框架化和文档生成自动化。
由UML软件设计描述框架可以建立层次化的设计模型模板,如:由逻辑层、逻辑CSC、CSC、逻辑类包、类包组成的层次化软件结构设计模型模板,参见图1。
图1 由UML软件设计描述框架到软件结构模型模板示例
根据UML软件设计模型描述框架,可以在SoDA工具上建立与设计模型模板配套的设计文档自动生成模板,通过SoDA工具可以将逻辑CSC/CSC/逻辑类包/类包/类的说明、类图、活动图、状态图等自动抽取为设计文档内容。图2给出了设计文档自动生成模板的一段实例,表i对应CSC/类包的类及其说明,图j对应逻辑CSC/CSC/逻辑类包/类包的类图。
笔者在建立UML软件设计模型描述框架的基础上,利用软件设计模型模板可以比较方便地进行软件设计和组织软件设计模型,利用设计文档生成模板可以比较方便地由软件设计模型自动生成设计文档,实现了建模模板化和文档生成自动化,并保证了文档与模型的一致性。
图2 设计文档自动生成模板实例
本文提出了基于“4+1”视图的UML设计模型描述框架,给出其在设计模型模板和设计文档模板方面的应用,说明结合Rose和SoDA能实现建模框架化、建模与文档编制一体化、文档生成自动化,能提高面向对象设计建模和文档编制效率。本文的UML设计模型框架虽然具有通用性,但领域性还不强。因此,下一步工作重点是结合不同领域特点开展UML设计模型框架研究。
[1] Object Management Group,UML1.5[EB/OL].[2003-03-01].http://www.omg.org/spec/UML/1.5/PDF.
[2] 麻志毅. UML系统模型的组织[J].计算机工程,2002,28 (4):287-289.
[3] 张涌,王渊峰,钱乐秋. 一个集成式的软件构件描述框架[J].计算机学报,2002(5):502-507.
[4] 崔红军,曹淑青,邵培南. 文档模板的设计与实现[J].计算机工程,2000(12):84-86.
[5] 王智学.Rose对象建模方法与技术[M].北京:机械工业出版社,2003.