UML-Unified Modeling Language 统一建模语言,又称标准建模语言。是用来对软件密集系统进行可视化建模的一种语言。
《UML精粹》一书中把这三个级别称为概念级、规格说明级和实现级。
概念级的图示和源代码之间没有很强的关联。它们更多是和人的语言相关的。概念级的图示可以作为一种速记方法,用于描绘存在于人类问题领域中的概念和抽象。因此,它们不必遵循强的语义规则,其含义可以是模糊的,通过解释来确定。
规格说明级的图示与源代码之间有很强的关联。实际上,规格说明级图示的目的就是要能够转换成源代码。
实现级图示是要描绘已有的源代码。
其中,规格说明级和实现级这两个级别的图示必须得遵循某些规则和语义。这样的图示非常明确并且有着大量的规范。
模型需要具备两个特点,即可测试可评估。如果模型不具备这两个特点,那它便没有存在的意义。为什么要建模型?那你可以联想一下航天工程师为何不直接造飞机,然后试飞呢?结构工程师为何不是直接建大桥,然后看看它是否能够不倒?答案很简单,飞机和桥梁比模型造价高多了。当模型比构建的真实实体便宜很多时,我们就会用模型来研究设计。这个观点在软件的建模上同样适用。
接下来我们思考两个问题UML图是可测试可评估的么?与代码相比它更加便宜么?事实上我们无法给出一个明确的答案,或者说无法像航天工程师以及结构工程师那样在绝大多数场景下都能给出肯定的答案,这是因为软件建模的性价与具体的应用场景相关。
我们来看UML是否具备模型的特点,即可测试可评估。很遗憾,测试在UML图方面,并没有严格的标准,同时模型的评估最终仍然是主观的。那么性价比呢,客观的说大多数情况UML图的绘制比编写代码代价要小一点,但是并没有小多少。事实上,经常出现更改源代码比更改图示更加容易的情况。
说了这么多,你们是不是认为我在陈述一个伪命题,或者说UML图就是个鸡肋。这么说对了一半,因为UML确实很容易被误用,当硬性规定“必须图示一切”,这样的规则还不如没有规则。大量项目时间和精力会被浪费在绘制没人会看的图示上面,这时候UML图就是一个鸡肋。但如果用在与团队同步大型系统的结构时,脉络图就是一个非常适合的选择。所以恰当而有效的使用UML图是非常重要。
那么我们什么时候应该使用UML图呢?我们把这个问题更加细化一点,写代码之前是否需要做好详细设计?我们都知道在建筑行业,一个建筑师的设计图可以拿个及时甚至上百人来建造房子。在做设计图时,不需要挖地基、浇灌混凝土或者安装窗户。总之,设计的代价比直接建造的代价低很多。丢弃一个错误的设计,比拆除有问题的建筑代价也低很多。但是这样的性价比,在软件领域却不明显,绘制UML图比写代码代价更低根本不明显,事实上,许多项目团队在图示上花的时间已经远远超过了写代码。丢弃图示比丢弃代码成本更低,同样不明显。因此,我们并不鼓励在写代码之前画一份详细的UML图示。
那么我们到底什么时候才应该使用UML图呢?大师马丁总结了一下的情形
可以画图的情况如下:
不要画图的情况如下:
下面将给出UML主要的几个具体应用场景:
使用UML在软件开发者间交流设计构想是非常方便的。一小组开发者站在一块白板前可以完成许多工作。如果你有一些想法需要和他人进行交流,UML是非常有用的。UML有助于交流清晰的设计想法。我们很容易就可以想象出一组开发人员站在一块白板前讨论着一幅类似图示的场景。事实上,图示非常清晰地表达了代码结构。另一方面,在交流算法细节方面,UML并不是非常合适。
架构图可以使得开发人员快速找到类与类之间的依赖关系,并提供一份关于整个系统结构的参考。这样的架构图是很有用的教学工具,任何团队成员都要能够立即在白板上画出这样一幅图来。
要编写需要保存的设计文档,最佳时机是在项目结束时,并把它作为团队的最后一项工作。这种文档会精确地反映出设计的状态,对团队非常有用。不过,仍有一些问题需要注意。UML图必须得经过仔细考虑。我们不需要厚达几千页的顺序图!我们想要的是那些描述系统关键要点的少量重要图示。充斥着大量混乱不堪、纠缠在一起的令人迷惑的线条和框框的UML图,是无法理解的。
UML CASE工具可能非常有用,但也可能是昂贵的垃圾收集器。在决定购买并部署UML CASE工具时,一定要非常小心。
不要试图一次就把软件系统整体架构用UML绘制出来,从最简单的行为开始,绘制一幅有关具体问题的简单顺序图或者协作图,然后根据需求不断的补充和扩展。
在使用图示时非常重要的一点是要能够想象出代码。我们把图示作为代码的速记,而不是替代。如果在画图时不能想象出它所表示的代码,那么就是在构建空中楼阁。停止绘图,想一想该如何把它翻译成代码。千万不要为了画图而画图。必须时刻确保自己知道正在表达什么代码。
UML是一个工具,不是最终结果。作为一个工具,它可以帮助思考和交流设计。如果少量使用,它会带给你巨大的好处。如果过度使用,它会浪费你大量的时间。使用UML时,少即是好。
《敏捷开发》—— 罗伯特.C.马丁