用例图描述了系统的外部接口、系统与参与者的交互行为;类图则描述系统的运行机制与内部协作关系。
分析类图的步骤:
一、识别类及其属性
从用例文档中抽取名词,分析这些名词,从中识别出哪些名词是类、哪些名词是类的属性。
分析中需要注意甄别:去除冗余的同义词;去除系统责任之外的名次;明晰模糊名词;排除行为性名词。
二、审查属性
(1)属性要在系统责任之内
(2)某一个类的属性应该只描述这个类的对象的特征
(3)同一个类的属性之间不能出现交叠
(4)对于具有复杂结构的属性可考虑建立新的类,再与原类形成关联
三、确定类之间的关系
1. 泛化
类之间的关系包括泛化(——|>)、关联(——)和依赖(------à)三种。
泛化指的就是继承关系,它是从父类(超类)的角度来讲的。
泛化的特征:
(1)is-a原则:子类是一种超类。所有子类都必须是超类的成员。
(2)100%原则:超类的定义(包括方法和属性)都不必须100%符合与所有子类。
泛化的缺点:
(1)超类的改变会影响到子类;(2)多重继承会引起命名的冲突。
怎样识别泛化?
(1)根据领域知识:如,生物>动物>哺乳动物>猫科动物>虎
(2)自上而下
含义:现在已经定义了一个类,分析发现这个类的对象有的具备一部分属性,而有些对象又具备另一些属性而没有这部分属性。这时可分解只属于部分对象的属性和操作形成子类。自上而下就是指由父类分解得到子类。
(3)自下而上
含义:与自上而下相反,自下而上指从子类中提取共有的属性和操作形成父类。
(4)考虑领域范围内的复用
如现钞取款机类,为了方便复用,可从中抽取出取款机类,再让现钞取款机类继承取款机类。
审查泛化
(1)是否同处一个领域
例如,温度、质量、高度、压力等量都由实数表示,但是不能把它们设计成实数的子类。
这是一种典型的泛化误用,“见人就叫老爸”!这样的后果:两个领域的类高度耦合,父类的子类无数,子类里的属性和操作无数,隐藏着巨大的危险;如果需要再用另外的操作时,还得再认一个老爸。
(2)子类之间的差异是否可以超类的属性值的不同来加以区别
这可以避免定义过多的子类而是问题复杂化。例如,人作为父类,再定义了中国人、美国人,其实这种差别可以通过在人这个类里添加一个国籍属性就可以实现了。
(3)如果子类没有自己特有的属性和操作,则取消这个子类的定义(子类上移);如果超类只有一个子类,则取消掉超类(超类下移)。
2. 类之间的关联
关联的含义:通过属性来表示一个对象对另一个对象的静态依赖关系。
首先,关联是对象间的;另外,关联是一种静态的关系,而不是通过操作。
关联的三种表现形式:
连接:—— 最弱的关联,表示两个类的对象之间有导航关系,即。
聚合:A◇——B 表示对象A包含一个对象B。
组合:◆—— 强语义耦合,如果整体消失则部分也消失。
聚合与组合比较:
(还没有找到合适的例子来解释)
审查聚合或组合
(1)作为部分的对象的属性有多少。比如汽车,单独定义一个轮胎类,汽车◇——轮胎。这里轮胎类里的属性过少,反而使设计不够清晰。应把轮胎合并到汽车类中。
(2)业务上是否有真正的聚合关系?