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

第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 = ;
private static readonly int GREATER = ;
private IComparable key;
private object value;
private TreeMapNode[] nodes = new TreeMapNode[];
public TreeMapNode(IComparable key, object value)
{
this.key = key;
this.value = value;
}
public object Find(IComparable key)
{
if (key.CompareTo(this.key) == ) return value;
return FindSubNodeForKey(SelectSubNode(key), key);
}
private int SelectSubNode(IComparable key)
{
return (key.CompareTo(this.key) < ) ? 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) == )
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章 写给C#程序员的UML概述

13.2 对象图

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

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

13.3 顺序图

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

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

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

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

13.4 协作图

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

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

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

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

13.5 状态图

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

敏捷软件开发:原则、模式与实践——第13章 写给C#程序员的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

上一篇:写给iOS程序员的命令行使用秘籍


下一篇:写给后端程序员的HTTP缓存原理介绍