再看包含、扩展和泛化、继承

来源:互联网 发布:声音大师软件版本 编辑:程序博客网 时间:2024/06/01 08:45

    我们知道包含和扩展是用例图中所特有的关系,而泛化和继承则不仅用于用例图,同时也适用于其他图,如类图。这两对概念相信对于学习面向对象中的我们来说是很容易混淆的,很多时候自己都不知道包含和扩展箭头到底该指向哪里,是虚线还是实线,泛化到底跟继承什么关系?经常为此大家争

得面红耳赤,下面我就来捋一捋(本篇博客想要表达的意思已经用红色标出,如果有什么不妥之处欢迎批评指教~)。

(1)   包含(include)关系

    当可以从两个或两个以上的用例图中提取公共行为时,应该使用包含关系来表示它们。其中这个提取出来的公共用例成为抽象用例,而把原始用例成为基本用例或基础用例。例如,图1中的“登记外借信息”和“查询外借信息”两个用例都需要登陆,为此,可以定义一个抽象用例“用户登录”。用例“登记外借信息”和“查询外借信息”与用例“用户登录”之间的关系就是包含关系。其中<<include>>是包含关系的构造型,箭头指向抽象用例。

 

    当多个用例需用使用同一段事件流时,抽象成为公共用例,可以避免在多个用例中重复地描述这段事件流,也可以防止这段事件流在不同用例中的描述出现不一致。当需要修改这段公共的需求时,也只要修改一个用例,避免同时修改多个用例而产生的不一致性和重复性工作。另外,当某个用例的事件流过于复杂时,为了简化用例的描述,也可以将某一段事件流抽象成为一个被包含的用例。

(2)   扩展(extend)关系

    如果一个用例明显的混合了两种或两种以上的不同场景,即根据情况可能发生多种分支,则可以将这个用例分为一个基本用例和一个或多个扩展用例,这样使描述可能更加清晰。如上图中的图书管理员进行“查询书籍信息”操作时,如果发现书籍信息有误,他可以使用“修改书籍信息用例来完成错误的修改。所以用例“查询书籍信息”和“修改书籍信息”之间的关系就是扩展关系。其中<<extend>>是扩展关系的构造型,箭头指向基本用例。

(3)   泛化和继承

    当多个用例共同拥有一种类似的结构和行为时,可以将它们的共性抽象成为父用例,其他的用例作为泛化关系中的子用例。在用例的泛化关系中,子用例是父用例的一种特殊形式,子用例继承了父用例所有的结构、行为和关系。例如下图中:用户注册有多种方式,可以是“现场注册”也可以是“网上注册”。所以“用户注册”用例就是“现场注册”和“网上注册”用例的泛化。其中三角箭头指向父用例。


而继承关系是泛化关系的反关系,也就是说子类是从父类继承的,而父类则是子类的泛化。

    从UML事物关系的本质上来看,包含关系和扩展关系都属于依赖关系(所以呢,都是虚线啦)。对包含关系而言,抽象用例中的事件流是一定会插入到基本用例中取得,并且插入点只有一个。扩展用例的事件流往往可以抽象为基本用例的备选事件流,在扩展关系中,可以根据一定的条件来决定是否将扩展用例的事件流插入到基本用例的事件流中,并且插入点可以有多个。在实际应用中,很少使用泛化关系,子用例的特殊行为都可以作为父用例中的备选事件流而存在。

    在实际工作中,要谨慎选用这些关系。从上面的介绍可以看出,包含、扩展和泛化关系都会增加用例的个数,从而增加用例模型的复杂度。另外,一般都是在用例模型完成之后才对它进行调整,在用例模型建立之初不必急于抽象用例之间的关系。

 

7 0