我试图通过使用ArgoUML在UML中建模来消化一个大型Java应用程序。在UML图表工具的属性部分,有一个有用的清单,我假设它用于帮助设计好的软件。除 3 项外,大多数清单项都有意义。
1). Could you write an invariant for this class?
2). Do all constructors establish the class invariant?
3). Do all operations maintain the class invariant?
这些问题是什么意思?我是面向对象设计的新手,所以解释会有所帮助。
提前谢谢你。
举一个简单的例子:当你对三角形建模时,你要确保角度的总和总是加起来是 180 度。
class Triangle {
number angle1, angle2, angle3;
}
这是不变的(一个应该始终为真的条件):
degrees (angle1 + angle2 + angle3) = degrees 180
现在第二个问题是有意义的:因为构造函数必须确保不要构造一个不成立的对象。
然后,第三个问题是,是否存在可能使不变量无效的操作。例如:
void setAngle1(number whatever) { angle1 = whatever; }
事实证明,上面的设计并不好。为什么?因为有多余的信息。更好的设计是这样的:
class Triangle {
number angle1, angle2; // two angles
number side; // and the connecting line
}
我们总是可以从角度 1 和角度 2 计算角度 3。我们只需要强制执行更简单的不变性,angle1 + angle2 < 180°
和side > 0