我独不解中国人何以于旧状况那么心平气和;于较新的机运就这么疾首蹙额;于已成之局那么委曲求全;于初兴之事就这么求全责备?
----鲁迅
引子
前段时间和一个朋友在MSN上聊到UML,他一声叹息:“知道UML是好东西但是用不起来。尝试过,结果领导要求文档中要充分使用UML,事无巨细皆UML,结果本来很简单的一份设计文档加了一堆图。评审的时候团队还有牛人指出UML图中这里的菱形应该是实心的,那里的要用半个箭头… …结果开会大部分时间都在炒图怎么画。领导觉得这也没带来什么好处,同事们乐得摆脱,后来就不了了之了”
然后顺便抱怨了我一下: “你给我推荐的《UML Distilled》也不怎么样… …”
这个抱怨让我很恼火,断定他看得是中文版,果然!我毅然用货到付款的方式为他定了一本英文影印版《UML Distilled》.问题还要解决, 故有此文.
- 为什么要用UML
- 定位:怎么用UML
- UML规范=束缚?
- UML第一步
为什么要用UML?
1970年以前,软件开发人员把软件开发工作比作探险活动,但是由于系统日趋复杂,个人英雄主义的时代在软件危机的爆发中宣告终结。危机引出了工程化方法,并催生了各种图形符号工具。面向对象理论出现之后,相关设计方法层出不穷,存在多种设计格式。
多种设计格式带来交流的不便,沟通的障碍,一个统一的建模语言需求已经是迫在眉睫。所以可以这样讲,UML的意义不在于它提供的内容而在于它的规范性和统一性。为了得到更好的设计我们需要更好的沟通,更好的沟通需要基于共同的语言进行,方便沟通这是创建UML的初衷,也是应该是使用UML最佳理由。后面的论述中希望你不要忘记了我们最初是为什么而出发的.
UML还继承了图形建模语言(graphical modeling language )的优良传统:高屋建瓴的抽象能力。而普通的编程语言恰恰缺乏这种描述设计思想的能力:"The fundamental driver behind them all is that programming languages are not at a high enough level of abstraction to facilitate discussions about design."抽象化主要是为了使复杂度降低,以得到论域中较简单的概念,好让人们能够控制其过程或以综观的角度来了解许多特定的事态。抽象过程必然包含舍弃的细枝末节,是一个裁剪的过程。抽象的结果,决定于从什么角度上来抽象,抽象的角度取决于分析问题的目的。
关于视角,《UML Distilled》有一段精彩的三层视角的论述,这段文字被无数设计模式、领域建模的书引了又引,比如《Design Patterns Explained》。《视角的力量--再说OO设计原则 》一文中我曾经探讨过下面的三个问题:1.为什么我们过早的纠缠于细节?问题的本质是什么?2.救命稻草--Martin Fowler的三层视角理论3.三层视角--回头再说OO设计原则文中的最后我完整引用了作者三层视角的论述,我是把它作为走出思维泥沼的明灯来看的。这里不再赘述,详情请查看:源文档 <http://www.cnblogs.com/me-sa/archive/2008/04/15/ooview.html>在第三版中,作者对视角的观点做了修正:规约视角和实现视角之间的界限是很难划分清楚的.实践过程中发现也没有做这种界限的划分的必要.
定位:怎么使用UML?
"黑夜给了我黑色的眼睛,我却用它寻找光明."同样一件东西怎么用确是不一定的,对于UML怎么使用也要有一个定位。Martin Fowler先生给出了三种使用使用UML的方式:蓝图blueprints ,骨架 sketches,编程语言。
三种使用方式比较容易区分出来的是:作为编程语言使用.ExecutedUML对工具的要求是非常高的-需要处理代码和图的同步问题等等.这里不做展开讨论,大家可以到国家文献中心找到更多相关资料:
源文档 <http://s.wanfangdata.com.cn/paper.aspx?q=executed%20UML&n=10&f=top> UML作为编程语言,典型应用时MDA.UML是MDA的事实标准,占领了90%的市场份额.“MDA 的愿景是定义一种描述和创建系统的新的途径。MDA 使得UML 的用途走得更远,而不仅仅是美丽的图画。很多专家预言MDA 有可能会带领我们进入软件开发的另一个黄金时代"。
Model-driven architecture (MDA) is a software design approach for the development of software systems. It provides a set of guidelines for the structuring of specifications, which are expressed as models. Model-driven architecture is a kind of domain engineering, and supports model-driven engineering of software systems. It was launched by the Object Management Group (OMG) in 2001.
源文档 <http://en.wikipedia.org/wiki/Model-driven_architecture>
Executable UML,often abbreviated to xtUML or xUML , is the evolution of the Shlaer-Mellor method[3] to UML. Executable UML graphically specifies a system using a profile of the UML. The models are testable, and can be compiled into a less abstract programming language to target a specific implementation.Executable UML supports MDA through specification of platform-independent models, and the compilation of the platform-independent models into platform-specific models.
源文档 <http://en.wikipedia.org/wiki/Executable_UML>
难以区分的是蓝图blueprints 和骨架 sketches,从中文说文解字的角度我们无法获得一个满意的答案.按照Martin Fowler先生的论述我将二者的区别通过表格的形式列了出来,通过比较还是能看出各中端倪的:
Mode |
Essence |
Forward engineering |
Reverse engineering |
Tools |
Practice |
Sketch |
selectivity |
communicate ideas and alternatives
|
explain how some part of a system works |
lightweight drawing tools |
To help communicate some aspects of a system. Do it quickly and collaboratively, so a common medium is a whiteboard. |
Blueprint |
completeness |
detailed design for a programmer to code up |
convey detailed information about the code |
CASE Tools (much more sophisticated ) |
Reducing programming to a simple and fairly mechanical activity |
从上面的比较中可以看出sketches勾勒重点,蓝图blueprints注重完整性,无微不至.前者是一种探索性的explorative,后者是定义性的definitive。对于后者,一旦蓝图确定,编码工作基本上就没有什么创造性了.
UML规范=束缚?
谈到UML就不难以避开UML规范的话题.多年来学习编程语言的习惯,语言规格说明是必经之路,金科玉律一般.但是UML规范怎么在实践中怎么就成为了束缚了呢?
- UML 规范和c#语言规范不同的是:混乱的c#代码可能直接无法通过编译,但是不符合的UML规范的应用却没有那样显示的错误提示
- UML从1.0到2.0版本之间就有差异,在新版本中很多规范都是指导性的。”指导性“反而让我们难以抉择。
- 有时候你按照规范来做了,但是却大家却不习惯
大师们是怎么给我们建议的呢?
- 习惯用法优于规范
- 为了更好的表达你的意图,时刻准备着违反规范
- 只要合适,可以引入非UML图表,不要犹豫
Okay,甩掉包袱,我们可以轻装上阵了.
UML第一步,怎么开始?从哪里开始?
怎么走出UML应用的第一步呢?像我的朋友遇到的情况先把UML规格说明熟读么?然后发誓把UML各种图表能用的全用上么?
请注意这里有如下事实:
- 你已经忘记了目的地,使用UML的目的是更好的沟通,而不是充分使用UML的各种图
- 即使是UML的发明者们也不能熟练使用UML所有的图,人们需要的往往是一个很小的集合
- 人们买来电器之后第一件事是全面学习使用手册么?不是,基本规则会了就先用起来,不会的时候再去找,这个就是行动思维
我们就释然了,没有必要使用所有的图,更没有必要熟悉所有的UML规格说明,不应成为负担。归根究底,成为负担的是对我们没用的东西,铭记奥卡姆剃刀原则Occam's Razor:如无必要,勿增实体,大胆的舍弃对自己没有的东西!
从哪里开始?Martin先生给出的建议是从类图和序列图开始,这两种图是基本的,常用的,最有用的图形。掌握了这两种图之后,可以尝试其它图,如果新的图没有给你带来什么帮助,大胆的舍弃它!
然后呢?Ok,我们行动吧!
参考书目: