8.1 分析工作流概述
8.1.7 本书使用的分析方法
分析模型描述系统要封装的核心域知识。
用什么建模概念来思考和描述核心域知识,可以有很多种选择。例如,“人”用不同的建模概念描述,可以说它是一个“类”,也可以说它是一个“类型”、一个“实体”。
本书使用面向对象的建模概念来描述分析模型,从三个视角来描述:
分析类模型:描述系统中各个类以及类之间的关系。
分析状态机模型:描述某个类的各个行为的逻辑。
分析交互模型:描述某些类在实现某个用例时的协作。
而面向对象的分析模型的表达形式,也可以有多种选择,包括语音、文本、图形等。
回忆一下我们在学生时代做阅读理解题和听力题的过程,就可以体会到,相对于听觉,视觉传递信息的效率更高,而且可以传递更复杂的信息。因此,相对于语音,把模型表达成视觉信息是更好的选择,不管是文本还是图形。
提醒:如果有人特别推崇“口头交流”,排斥文档或图形,很可能是遮羞布,背后的脓包是此人没有能力剖析复杂逻辑。
相对于只有自上而下顺序的文本(包括自然语言和编程语言),能够朝四个方向扩展的平面图形(如果有三维模型就更好了)更容易让建模人员看出领域概念之间的联系。例如,图8-15和图8-16的内容,如果没有图形的帮助,直接用文本一行一行地构造和阅读模型,人脑的负担非常重。
图8-15 餐饮领域的类图
图8-16 计算器的状态机图,摘自Practical UML Statecharts in C/C++(Samek M. , 2008)
说到这里,又不可避免地要提醒,故意选择文本的形式来表达领域知识,有可能也是一种遮羞布。图8-15和8-16的内容如果用文本表达,可能会得到很多页文本——这就有了理由:因为工作量太大了,所以很多地方无法做深入的思考,可以原谅!
本书使用类图、状态机图和序列图三种UML图形来表达面向对象的分析模型。
UML类图表达分析类模型,UML状态机图表达分析状态机模型,UML序列图表达分析交互模型。
图8-17 本书的分析方法所使用的UML图形
需要说明的是,虽然我们用的是面向对象的分析方法,也就是说,用面向对象的概念来剖析核心域知识,但不意味着你的系统一定要用特定的“面向对象”编程语言、特定的存储方式或物理分布形式来实现。
也许你使用的编程语言是面向过程语言,例如C;也许你使用的编程语言是函数式语言,例如F#;也许你使用的存储系统是关系数据库系统,例如SQL Server;也许你使用的存储系统是非关系数据库系统,例如MongoDB;也许你的系统运行在同一台机器上,也许是分布在很多台机器上……
不管你的系统的实现方式和运行形态如何,从分析过渡到设计时,变化的只是分析到设计的映射套路。如果设计所使用的非核心域比较“面向对象”,那么映射套路会比较直观一些,否则,就需要一定的转换。但无论如何,如前文所说,这个套路和具体的核心域知识没有关系,我们并不需要针对每一个核心域概念逐一花费脑力去思考它。
我们之所以选择在分析工作流使用面向对象的分析方法,是因为从思考深度和表示的严谨程度来看,面向对象的分析方法以及UML表示法目前仍然是剖析和整理核心域逻辑的最佳选择。
本书在设计工作流的内容,会展示分析模型和各种实现方式的映射套路。
8.1.8 自测题
扫码或访问http://www.umlchina.com/book/quiz08_01.html完成在线测试,做到全对以获得答案。
1[多选]
关于分析和设计的区别,以下说法不恰当的有:
A) 分析着眼于“系统做什么”,设计着眼于“系统怎么做”。
B) 分析和设计分离的好处是,先全局思考整个系统的各个类以及类之间的关系,再有规律地映射到实现的平台和语言,这样就减少了反复试错的成本。
C) 有时候,在分析工作流也会考虑内存、网络带宽等概念。
D) 分析注重业务,设计注重技术。
2[单选]
掌握MVC、MVP、MVVM、六边形、洋葱型……等模式或架构,并不能解决分析的问题,原因是:
A) 它们描述的是域之间的协作。
B) 它们没有得到广泛使用。
C) 它们没有体现面向对象的思想。
D) 它们不够敏捷。
3[单选]
第一款CASE(计算机辅助软件工程)工具是:
A) Rose
B) ERwin
C) FlowChart/360
D) DesignAid
4[多选]
本章中目前为止提到的在分析时逃避思考遮羞布有以下哪些?
A) 不使用UML的类图和状态机图。
B) 谈论性能问题。
C) 抱怨免费或便宜的建模工具太弱,要求购买更贵的建模工具。
D) 引入微服务架构以简化核心域逻辑。
5[多选]
以下说法正确的有:
A) 分析模型就是用核心域术语表达内容的模型。
B) 分析模型概要地描述核心域知识,设计模型将核心域知识细化。
C) 面向对象的分析模型不妨碍使用面向过程的设计。
D) 口头表达也可以表达分析模型。
6[单选]
有一篇文章,作者在白板上画了一个类图,然后开始掰着指头数这个类图缺什么,"没考虑到持久化","没考虑到对象的创建"……然后得出结论:画这个类图不如直接编码。根据本节的知识,以下正确的说法是:
A) 作者不了解核心域和非核心域分离的重要。
B) 别急,这个图会越来越细,逐渐添加作者认为缺少的那些东西。
C) Talk is cheap. Show me the code.
D) 敏捷是建模的精髓,加上这些就不敏捷了。
7[多选]
以下系统中,适合用面向对象的分析方法建模核心域逻辑的有:
A) 电磁轨道炮武器控制系统
B) 互联网拼单购物系统
C) PC单机角色扮演游戏
D) 电梯控制系统
8[多选]
以下系统中,适合用面向对象的分析方法建模核心域逻辑的有:
A) 用SQL存储过程来实现核心域逻辑的企业应用
B) 用C语言实现核心域逻辑的嵌入式应用
C) 用JavaScript实现核心域逻辑、读取本地文件,不需要服务器的小游戏
D) 在微软Azure上运行的企业应用
9[多选]
以下系统中,适合用面向对象的分析方法建模核心域逻辑的有:
A) 火箭发射控制系统
B) 函数式语言的编译器
C) 视频剪辑软件
D) 关系数据库管理系统