码迷,mamicode.com
首页 > Windows程序 > 详细

敏捷软件开发:原则、模式与实践——第13章 写给C#程序员的UML概述

时间:2015-08-28 17:06:55      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:

第13章 写给C#程序员的UML概述

  UML包含3类主要的图示。静态图(static diagram)描述了类、对象、数据结构以及它们之间的关系,藉此表现出了软件元素间那些不变的逻辑结构。动态图(dynamic diagram)展示了软件实体在运行过程中是如何变化的,其中描述了运行流程或者实体改变状态的方式。物理图(physical diagram)展示了软件实体不变的物理结构,其中描述了诸如源文件、库、二进制文件、数据文件等物理实体以及它们之间的关系。

  查看如下代码,这段程序实现了一个基于简单二叉树算法的映射(map)数据结构,熟悉代码后,查看后面的图示:

using System;
namespace TreeMap
{
    public class TreeMap
    {
        private TreeMapNode topNode = null;
        public void Add(IComparable key, object value)
        {
            if (topNode == null)
                topNode = new TreeMapNode(key, value);
            else
                topNode.Add(key, value);
        }
        public object Get(IComparable key)
        {
            return topNode == null ? null : topNode.Find(key);
        }
    }
    internal class TreeMapNode
    {
        private static readonly int LESS = 0;
        private static readonly int GREATER = 1;
        private IComparable key;
        private object value;
        private TreeMapNode[] nodes = new TreeMapNode[2];
        public TreeMapNode(IComparable key, object value)
        {
            this.key = key;
            this.value = value;
        }
        public object Find(IComparable key)
        {
            if (key.CompareTo(this.key) == 0) return value;
            return FindSubNodeForKey(SelectSubNode(key), key);
        }
        private int SelectSubNode(IComparable key)
        {
            return (key.CompareTo(this.key) < 0) ? LESS : GREATER;
        }
        private object FindSubNodeForKey(int node, IComparable key)
        {
            return nodes[node] == null ? null : nodes[node].Find(key);
        }
        public void Add(IComparable key, object value)
        {
            if (key.CompareTo(this.key) == 0)
                this.value = value;
            else
                AddSubNode(SelectSubNode(key), key, value);
        }
        private void AddSubNode(int node, IComparable key,
        object value)
        {
            if (nodes[node] == null)
                nodes[node] = new TreeMapNode(key, value);
            else
                nodes[node].Add(key, value);
        }
    }
}

 


13.1 类图

  类图展示了程序中主要的类和关系。

  • 矩形表示类,箭头表示关系。
  • 在本图中,所有的关系都是关联(association)关系。关联是简单的数据关系,其中一个对象或者或者持有另一个对象的引用,或者调用其方法。
  • 关联上的名字映射为持有该引用的变量名。
  • 一般来说,和箭头相邻的数组表示该关系所包含的实例个数。如果数字比1大,就意味着某种容器,通常是数组。
  • 类图标中可以分成多个格间。通常,最上面的格间存放类的名字。其他格间中描述函数和变量。
  • <<interface>>符号用来说明IComparable是一个接口。
  • 这里显示的大部分符号都是可选的。

技术分享

13.2 对象图

  它展示了在系统执行的某个特定时刻的一组对象和关系。你可以把它看做是一个内存快照。

技术分享



13.3 顺序图

  它描述了TreeMap的Add方法是如何实现的。

技术分享

  人形线条图表示了一个未知调用者。这个调用者调用了TreeMap对象的Add方法。如果topNode变量为null,TreeMap就创建一个新的TreeMapNode对象并把它赋给topNode。否则,TreeMap就向topNode发送Add消息。

  方括号中的布尔表达式称为监护条件(guard)。它们指示出应该选择哪条路径。终结在TreeMapNode图标上的消息箭头表示对象构造。带有小圆圈的箭头称为数据标记(data taken)。TreeMap下面的窄矩形条称为激活(activation)。它表示Add方法执行了多少时间。

13.4 协作图

技术分享  

  它描述了TreeMap.Add中topNode不为null的情况。协作图中包含了顺序图中所包含的同样的信息。不过,顺序图是为了清楚地表达出消息的顺序,而协作图则是为了清楚地表达出对象之间的关系。

  对象被称为链(link)的关系连接起来。只要一个对象可以向另外一个对象发送消息,就存在链关系。在链上传递的正是消息本身。它们表示为小一些的箭头。消息上标记有消息名称、消息顺序号以及任何使用的监护条件。

  带点的顺序号表示调用的层次结构。TreeMap.Add函数(消息1)调用TreeMapNode.Add函数(消息1.1)。因此,消息1.1是消息1所调用的函数发送的第一条消息。


13.5 状态图

  UML可以非常全面地表示有限状态机。下图展示了一个地铁旋转门的状态机:

技术分享

  它有两个状态:Locked和Unlocked。可以向这个机器发送两个事件。coin表示向旋转门投入了一枚硬币。pass表示用户已经通过了旋转门。

  图中的箭头称为迁移(transition)。其上的标记有出发迁移的事件以及该迁移执行的动作。当一个迁移被触发时,会导致系统的状态发生改变。

  翻译成自然语言描述:

  • 如果在Locked状态收到coin事件,就迁移到Unlocked状态并调用Unlock函数。
  • 如果在Unlocked状态收到pass事件,就迁移到Locked状态并调用Lock函数。
  • 如果在Unlocked状态收到coin事件,就保持在Unlocked状态并调用Thankyou函数。
  • 如果在Locked状态收到pass事件,就保持在Locked状态并调用Alarm函数。


13.6 结论

  本章中的图示对于大多数场合来说足够了。大部分程序员了解这么多UML知识就足以应对实际工作需要了。

 

 

摘自:《敏捷软件开发:原则、模式与实践(C#版)》Robert C.Martin    Micah Martin 著

转载请注明出处:

作者:JesseLZJ
出处:http://jesselzj.cnblogs.com

敏捷软件开发:原则、模式与实践——第13章 写给C#程序员的UML概述

标签:

原文地址:http://www.cnblogs.com/jesselzj/p/4766745.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!