P.4.3 统一建模语言
图P-4中的用例图是更强大表示法的一部分,这个表示法称为统一建模语言(Unified Modeling Language,UML)。设计人员使用UML来说明软件系统中必需的类及它们的关系。UML能给出复杂系统的整体视图,比用自然语言或程序设计语言描述更有效。例如,英语可能有二义性,而Java代码提供更多的细节。给出明确的类之间的交互图,是UML的强项之一。
除了用例图之外,UML还能提供类图,类图将每个类的描述放在类似于CRC卡的方框中。方框内包含类名、它的属性(attribute)(数据域)和操作(operation)(方法)。例如,图P-7显示了类CourseSchedule的方框。一般地,方框中省略了构造方法、get方法和set方法等公共操作。
随着设计的进展,当你描述一个类时你可以提供更多的细节。表示域或方法的可见性时,可以在其名字前加上一个符号,+用于公有的,-用于私有的,而#用于保护的。还可以在域、参数或返回值后加上一个冒号(:),然后写上它的数据类型。因此,在图P-7中可以有如下的数据域
而方法如下
在UML中表示接口非常类似于表示类的方式,只是要在名字前加上<>。接口Measurable的表示如图P-8所示。
自测题10 附录C中给出的类Name的类图是什么样的?
在类图中,线连接了类的方框,表示类之间的关系,包括继承层次。例如,图P-9中的类图表示类Undergrad
Student和GradStudent都继承自Student类。空心箭头指向父类。在UML中,父类Student称为UndergradStudent
和GradStudent的泛化(generalization)。如果类实现了一个接口,则从类到接口画一条有空心箭头的虚线。
关联(association)是两个不同类的对象之间的关系。一般地,关联是称为协作的CRC卡。例如,类Student、CourseSchedule和Course之间存在的关系。图P-10表示UML如何用箭头表示这些关系。例如,类CourseSchedule
和Course之间的箭头,表示类CourseSchedule的对象和类Course的对象之间的关系。这个箭头指向Course,表示职责。所以,CourseSchedule对象应该能告诉我们它包含的课程,但Course对象不能告诉我们它属于哪个课程表。UML称这种表示为可导航性(navigability)。
这种特殊的关联称为单向的(unidirectional),因为它的箭头指向一个方向。两端都有箭头的线表示的关联称为双向的(bidirectional)。例如,Student对象能找到它的课程表,而CourseSchedule对象能找到它所属的学生。可以假定不带箭头的线表示的关联的可导航性,在设计的当前阶段尚未确定。
每个箭头的末端都是数字。在CourseSchedule和Course之间的箭头的前端,你看见标注为0..10。这个符号表示每个CourseSchedule对象与0~10门课程关联。这个箭头的另一端是星号。它的含义与记号0..∞是一样的。每个Course对象可以与许多课程表相关联——或者一个都不关联。类图还表示一个Student对象和一个CourseSchedule对象之间的关系。箭头两端的这个记号称为关联的基数(cardinality)或多样性(multiplicity)。
自测题11 将图P-9和图P-10合成为一个类图。然后添加类AllCourses,它表示本学期开设的所有课程。你需要添加的新关联有哪些?