初用Rose,发现这个工具十分了得。
同时也感觉到,软件重在“设计”,一个设计精良的软件系统,实现起来很Easy
下面做个类图关系的简单描述,做为入门Rose的开篇。
UML的类图关系分为:泛化(继承)、关联、聚合/组合、依赖。
而其中关联又分为双向关联、单向关联、自身关联。
1、泛化(继承)Generalization
指的是一个类(称为子类)继承另外的一个类(称为基类)的功能,
并增加它自己的新功能的能力,继承是类与类之间最常见的关系。
类图中继承的表示方法是从子类拉出一条闭合的、单键头(或三角形)的实线指向基类
classA{};
classB:publicA{};
A和B是继承关系
2、关联(Association)
指的是模型元素之间的一种语义联系,是类之间的一种很弱的联系。关联可以有方向,可以是单向关联,
也可以是双向关联。可以给关联加上关联名来描述关联的作用。
关联两端的类也可以以某种角色参与关联,角色可以具有多重性,表示可以有多少个对象参与关联。
可以通过关联类进一步描述关联的属性、操作以及其他信息。关联类通过一条虚线与关联连接。
对于关联可以加上一些约束,以加强关联的含义。
即一个类作为另一个类方法的参数。
另外关联又分:单向关联、双向关联、自身关联三种。
Rose生成代码时一般会在类中生成对应类的指针、引用、值等。
关联在C++中呈现为:
classA{};
classB
{
voidFunction1(A*a);
}
3、聚合(Aggregation)
指的是整体与部分的关系。
通常在定义一个整体类后,再去分析这个整体类的组成结构。
而找出一些组成类,该整体类和组成类之间就形成了聚合关系。
例如一个航母编队包括海空母舰、驱护舰艇、舰载飞机及核动力攻击潜艇等。
需求描述中“包含”、“组成”、“分为…部分”等词常意味着聚合关系。
classA{};
classB
{
A*a;
};
A和B是聚合关系
比如XX市这个类
classXX市
{
劳动局*劳动局1;
供电局*供电局1;
粮食局*粮食局1;
};
4、组合()
一般是实心菱形加实线箭头表示
也表示类之间整体和部分的关系,但是组合关系中部分和整体具有统一的生存期。
一旦整体对象不存在,部分对象也将不存在。
部分对象与整体对象之间具有共生死的关系。
classA{};
classB
{
Aa;
};
A和B是组合关系
组合关系和聚合关系比起来,其强度要高一点;
组合和聚合的关系:
聚合关系是“has-a”关系,组合关系是“contains-a”关系;
聚合关系表示整体与部分的关系比较弱,而组合比较强;
聚合关系中代表部分事物的对象与代表聚合事物的对象的生存期无关,一旦删除了聚合对象不一定就删除了代表部分事物的对象。
组合中一旦删除了组合对象,同时也就删除了代表部分事物的对象。
在C++语言中,从实现的角度讲,聚合可以表示为:
classA{...}
classB{A*a;.....}
即类B包含类A的指针;
而组合可表示为:
classA{...}
classB{Aa;...}
即类B包含类A的对象。
准确的UML类图中用空心和实心菱形对聚合和组合进行区分。
关联是类之间的一种关系,例如老师教学生,老公和老婆,水壶装水等就是一种关系。
这种关系是非常明显的,在问题领域中通过分析直接就能得出。
依赖是一种弱关联,只要一个类用到另一个类,但是和另一个类的关系不是太明显的时候(可以说是“uses”了那个类),就可以把这种关系看成是依赖,依赖也可说是一种偶然的关系,而不是必然的关系,就是“我在某个方法中偶然用到了它,但在现实中我和它并没多大关系”。例如我和锤子,我和锤子本来是没关系的,但在有一次要钉钉子的时候,我用到了它,这就是一种依赖,依赖锤子完成钉钉子这件事情。
组合是一种整体-部分的关系,在问题域中这种关系很明显,直接分析就可以得出的。
例如轮胎是车的一部分,树叶是树的一部分,手脚是身体的一部分这种的关系,非常明显的整体-部分关系。
上述的几种关系(关联、聚合/组合、依赖)在代码中可能以指针、引用、值等的方式在另一个类中出现,不拘于形式,但在逻辑上他们就有以上的区别。
这里还要说明一下,所谓的这些关系只是在某个问题域才有效,离开了这个问题域,可能这些关系就不成立了,例如可能在某个问题域中,我是一个木匠,需要拿着锤子去干活,可能整个问题的描述就是我拿着锤子怎么钉桌子,钉椅子,钉柜子;既然整个问题就是描述这个,我和锤子就不仅是偶然的依赖关系了,我和锤子的关系变得非常的紧密,可能就上升为组合关系(让我突然想起武侠小说的剑不离身,剑亡人亡...)。
这个例子可能有点荒谬,但也是为了说明一个道理,就是关系和类一样,它们都是在一个问题领域中才成立的,离开了这个问题域,他们可能就不复存在了。