很多系统经常需要设置一些参数,有人会把参数建模成图8-71左侧的类图,把超时时间、锁定设置、频带等作为参数的属性。属性其实就是关联(此处是组合)的一种变体,8-71左侧和右侧是等同的。
图8-71 泛化被误作关联 例2
图8-71的意思是一个参数个体由若干个具体参数个体组成,这不符合领域内涵。更符合领域内涵的是“具体参数是参数的一种”或者“参数的集合包含各具体参数的集合”,也就是说,泛化关系更合适。还有一种做法是把具体的参数全部抽象为“名称”和“值”两个属性。如图8-72。
图8-72泛化被误作关联 例2 更正
如果按图8-71的方式建模,参数类只有一个对象,但这个对象有很多个属性。当需要为系统设置一种新的参数时,就需要修改类结构,增加新的属性。如果按图8-72的方式建模,只需要增加新的参数对象即可,类结构不需要改变。
一些1对0..1的关联,有可能是泛化关系。例如,有人认为1台电器可以是1台洗衣机,也可以不是;1台电器可以是1台电视机,也可以不是;1台电器可以是1台空调,也可以不是,于是画出图8-73。
图8-73的意思是一台电器可能由一台洗衣机、一台电视机、一台空调组装而成,这是错误的,应该是电器的集合包含洗衣机、电视机和空调的集合,即泛化关系。如图8-74。
图8-74 泛化被误作关联 例3 更正
关联被误作泛化的情况:
几个类拥有相同的部分时,有人可能会把相同的部分变成超类,和这几个类形成泛化关系。如图8-75,经理、组长和组员都有账户,于是把账户提升为超类,意思是“经理是账户的一种”或“账户的集合包含经理的集合”,这是错误的。
图8-75 关联被误作泛化 例1
经理和账户的正确关系应该是关联(组合),即使有泛化关系,也应该抽象出更合适的领域概念,例如“人员”,如图8-76。
图8-76 关联被误作泛化 例1 更正
图8-77是Meilir Page-Jones在他的书中举的一个极端的例子。
图8-77关联被误作泛化 例2