我们已经知道,不变式约束(Invariant Constraint)用来检查一个类的实例(Instance)是否处于合法状态。但一个Instance的合法状态,除了需要满足设计者明确给出的Invariant Constraints之外,还要满足更多的内容。
举一个例子,Class A和B之间存在一个关联(Association),这个关联的两个关联端(Association End)的多重性(Multiplicity)分别为1和3..*,如下图所示:
|----------| |----------|
| A | | B |
|----------| 1 3..*|----------|
| |-----------| |
| | | |
|----------| |----------|
这个Class Diagram指明,一个A的实例至少和3个B的实例有关系,一个B的实例和一个B的实例有关系(不能为0个)。否则它们就是非法的。
但一个Class A的实例刚刚被创建之时(此时系统已经调用了Class A的相关构造函数(Constructor)),很有可能还未来得及和至少3个B的实例进行关系的建立,如果此时对这个实例进行合法性检查,系统将由于此实例所处的非法状态而无法正常的运转下去。
在明确我们究竟什么时候检查这种类型的检查之前,我们先需要先明确一下我们创建一个对象是为了什么。
一个对象存在的意义无非有3个:
1、向外界提供其包含的或存储的信息;
2、作为导航路径的连接点;
3、接受外界发送的消息/外界调用其Public Operations。
OK,如果能够保证一个对象在向外界提供上述3种服务时能满足Invariant Constraint和那些Multiplicity Constraints就不会存在任何问题。其它时候对实例的状态进行的改变,由于不会影响其对外提供的上述3种服务,所以不需要进行这些检查。
单纯的改变实例状态行为包括:
1、改变一个属性的值或集合;(set方法)
2、改变Link上连接的对象或对象的集合。(link/unlink操作)
So,在这两种行为所对应的生成代码中,我们无需做任何实例状态的检查。
由此类推,一个实例被构造完成之后,我们也无需对其状态进行检查。因为,在没有要求当前实例提供任何上述3种服务之前,它处于非法状态并不存在任何问题。
警告是:设计师必须保证,在你要求一个实例提供服务之前,它的状态要满足所有Instance Scope的约束。
你可以使用这个链接引用该篇文章 http://publishblog.blogchina.com/blog/tb.b?diaryID=650126