类(class)是对一组具有相同属性、操作、关系和语义的对象的描述。在图形上,把类画成一个矩形。
名称
每个类都必须有一个有别与其他类的名称。名称(name)是一个文字串。单独的名称叫作简单名(simple name),用类所在的包的名称作为前缀的类名叫作限定名(qualified name)。绘制的类可以仅显示它的名称。
属性
属性(attribute)是已命名的类的特性,它描述了该特性的实例可以取值的范围。类可以有任意数目的属性,也可以根本没有属性。属性描述了正被建模的事物的一些特性,这些特性为类的所有对象所共有。例如,每一面墙都有高度、宽度和厚度;也可以用这样的方式对顾客建模:每个顾客都有一个姓名、地址、电话号码和出生日期。因此,属性是对类的对象可能包含的数据种类或状态种类的抽象。在一个给定的时刻,类的一个对象将具有该类的每一个属性的特定值。在图形上,将属性在类名下面的栏中列出。可以仅显示属性的名称。
可以通过声明属性的类以及属性可能的默认初始值来进一步地详述属性。
操作
操作(operation)是一个服务的实现,该服务可以由任何类的对象来请求以影响其行为。换句话中,操作是能对一个对象所做的事情的抽象,并且它由这个类的所有对象共享。类可以有任意数目的操作,也可以根本没有操作。例如,在Java的awt包中的窗口库里,类Rectangle的所有对象都能被移动或调整大小,还可以查询它们的特性。调用对象的操作经常(但不总是)会改变该对象的数据或状态。在图形上,把操作列在类的属性栏下面的栏中。可以仅显示操作的名称。
可以通过阐明操作的特征标记来详述操作,特征标记包含所有参数的名称、类型和默认值,如果是函数,还要包括返回类型。
职责
职责(responsibility)是类的合约或责任。当创建一个类时,就声明了这个类的所有对象具有相同种类的状态和相同种类的行为。在较高的抽象层次上,这些相应的属性和操作正是要完成类的职责的特征。类Wall负责了解墙的高度、宽度和厚度;在信用卡应用系统中,类FraudAgent负责处理汇票,并决定汇票是否合法、是否值得怀疑或是否具有欺诈性;类TemperatureSensor负责测量温度,若温度达到一定度数,就要发出警报。
对类建模的一个好的起点是详述词汇表中的事物的职责。像CRC卡和基于用况的分析等技术在这里特别有用。类可以有任何数目的职责,尽管在实用中每个结构良好的类都最少有一个职责,而且最多也是可数的。当精化模型时,要把这些职责转换成能很好地完成这些职责的一组属性和操作。
在图形上,把职责列在类图符底部的单独的栏中。
提示和技巧
在用UML对类建模时要记住:对最终用户或实现者来说,各个类都应该映射到某个有形的或者概念性的抽象。一个结构良好的类,应符合如下条件:
- 为取自问题域或者解域的词汇中的事物提供明确的抽象。
- 嵌入一个小的、明确定义的职责集,并且能很好地实现它们。
- 把抽象的规约和它的实现清楚地分开。
- 简单而且可理解,并具有可适应性和可扩展性。
当用UML绘制一个类时,要遵循如下的策略:
- 仅显示在该类的语境中对于理解抽象较为重要的类的特性。
- 按属性和操作的种类进行分组,以更好地组织其长列表。
- 把相关的类显示在同一个类图中。