“类图”在软件开发类文档中有很大的作用,可以清晰简洁地表示出所研究的类之间的关系。我在读《设计模式:可复用面向对象软件的基础》中也碰到了大量的类图,我想有必要总结一下类图中各种符号的含义,以便能更通畅阅读。不过在这本书中,类图的符号是OMT(Object Modeling Technique)
符号,而目前能查到类图的讨论最多的格式是UML(Unified Modeling Language)
,而且后者还有相当多的作图工具。我想对两个格式的类图都学习一下。
需要说明的是,OMT
和UML
类图的符号有很多,这篇只是讨论了诸如“继承”、“聚合”这种基础的内容。
在OMT
的学习中我主要参考了《设计模式:可复用面向对象软件的基础》的附录(书中有给出具体的规范是[RBP+91,Rum94],但我不知道怎么才能查到具体的说明文档)。
一个线框表示一个类,顶部是类名,其次是操作名,再下是变量:
例如,上面的类名叫ConcreteClassName
,它有两个操作。分别是Operation1
和返回类型为Type
的Operation2
。它有两个变量。分别是instanceVariable1
和类型为Type
的instanceVariable2
。
类继承表示为一个从子类到父类的三角形连线:
例如,上面表示LineShape
这个类是Shape
这个类的子类。
关于这一点,我发现书中的翻译:聚集与相识其实和主流的翻译有区别。网上能查阅到的更多的名字是组合与聚合。
事实上,书中的聚集和主流翻译组合是一个意思,他们都代表一个类中有另一个类的成员变量,在OMT中有根部有菱形的箭头表示:
例如上图就表示Drawing
类有Shape
类型的成员变量,C++代码中会是:
class Drawing
{
Shape ShapeVar;
}
而书中的相识和主流翻译聚合是一个意思。这点我觉得“相识”的翻译更能让人领会意思,就是说一个类只是“知道”另一个类,但是对于他的生命周期完全不关心。与此相对的是组合关系,被组合的类一定会和组合它的“主人”同生共死。在OMT中,根部没有菱形的箭头表示相识关系:
例如上图就表示LineShape
类相识一个Color
类型的变量,C++代码中会是:
class LineShape
{
Color* ColorVar;
}
OMT还定义了一种实心圆点,表示“多于一个”:
例如上图表示Drawing
类有多个Shape
类型的成员变量
还有一种需要表示的关系是“一个类创建了哪个类的对象”,但书中说OMT并不支持这种表示,因此书中自己用虚线表示了这种关系:
如图表示CreationTool
创建了LineShape
类型的对象
在UML
的学习中,我查了很多网上的资料,然后用StartUML这个软件画了类图作为测试。
这点和与OMT
的差别不大,区别可能只是UML
将变量放在了操作的上面:
如图类名是Class1
,他有Attribute1
成员变量和Operation1
操作。
这点和OMT
一样
如图表示Class2
是Class1
的子类。
UML
中,直接在箭头附近直接用数字来表示个数:
如图表示Class1
聚合了3
个Class2
“依赖”这个概念是OMT
所没有的,可能之前讨论的“创建关系”也算是一种“依赖关系”吧。
UML
中的依赖关系用虚线表示:
如图表示Class8
依赖Class7