删一 发表于 2025-5-29 20:31:31

聚焦UML实践第一步

 
     
           我独不解中国人何以于旧状况那么心平气和;于较新的机运就这么疾首蹙额;于已成之局那么委曲求全;于初兴之事就这么求全责备?
                                                                                                                                                                                 ----鲁迅
    引子
           前段时间和一个朋友在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设计原则文中的最后我完整引用了作者三层视角的论述,我是把它作为走出思维泥沼的明灯来看的。这里不再赘述,详情请查看:源文档 在第三版中,作者对视角的观点做了修正:规约视角和实现视角之间的界限是很难划分清楚的.实践过程中发现也没有做这种界限的划分的必要.
     
    定位:怎么使用UML?
            "黑夜给了我黑色的眼睛,我却用它寻找光明."同样一件东西怎么用确是不一定的,对于UML怎么使用也要有一个定位。Martin Fowler先生给出了三种使用使用UML的方式:蓝图blueprints ,骨架 sketches,编程语言。
            三种使用方式比较容易区分出来的是:作为编程语言使用.ExecutedUML对工具的要求是非常高的-需要处理代码和图的同步问题等等.这里不做展开讨论,大家可以到国家文献中心找到更多相关资料:
    源文档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.
    源文档
     
    Executable UML,often abbreviated to xtUML or xUML , is the evolution of the Shlaer-Mellor method 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. 
    源文档
     
           难以区分的是蓝图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,我们行动吧!
        
     
     
参考书目:
 http://otho.douban.com/mpic/s1511300.jpghttp://otho.douban.com/mpic/s2699459.jpghttp://otho.douban.com/mpic/s1659082.jpghttp://otho.douban.com/mpic/s1441580.jpg


 


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 聚焦UML实践第一步