官术网_书友最值得收藏!

5.2.4 用例之間的關系

為了減少模型維護的工作量,保證用例模型的可維護性和一致性,可以在用例之間抽象出包含(Include)、擴展(Extend)和泛化(Generalization)這幾種關系。這幾種關系都是從現有的用例中抽取出公共信息,再通過不同的方法來重用這部分的公共信息。

1.包含

包含關系是指用例可以簡單地包含其他用例具有的行為,并把它所包含的其他用例的行為作為自身行為的一部分。在UML中,包含關系是通過帶箭頭的虛線段加<<include>>字樣來表示,箭頭由基礎用例(Base)指向被包含用例(Inclusion),如圖5-13所示。包含關系代表著基礎用例會用到被包含用例,就是將被包含用例的事件流插入到基礎用例的事件流中。

需要注意的是,包含(Include)關系是UML 1.3中的表述,在UML 1.1中,同等語義的關系被表述為使用(Uses),如圖5-14所示。

圖5-13 包含關系

圖5-14 使用關系

在處理包含關系時,具體的做法就是把幾個用例的公共部分單獨地抽象出來成為一個新的用例。主要有兩種情況需要用到包含關系:

  • 多個用例用到同一段的行為,可以把這段公共的行為單獨抽象成為一個用例,然后讓其他用例來包含這一用例。
  • 某一個用例的功能過多、事件流過于復雜時,就可以把某一段事件流抽象成為一個被包含的用例,以達到簡化描述的目的。

下面來看一個具體的例子,有一個資源網站,維護人員要對網站的資源進行維護,包括添加資源、修改資源和刪除資源。其中,在添加資源和修改資源后,都要對新添加的資源和修改的資源進行預覽,以檢查添加和修改操作完成是否正確。用例圖如圖5-15所示。

圖5-15 包含關系示例

這個例子就是把添加資源和修改資源都會用到的一段行為抽象出來,成為一個新的用例—預覽資源。而原有的添加資源和修改資源這兩個用例都會包含這個新抽象出來的資源。如果以后需要對資源預覽進行修改,則不會影響到添加資源和修改資源這兩個用例。并且由于是一個用例,就不會發生同一段行為在不同用例中描述不一致的情況。通過這個例子可以看出包含關系的兩個優點:

  • 提高了用例模型的可維護性,當需要對公共需求進行修改時,只需要修改一個用例而不必修改所有與之有關的用例。
  • 不但可以避免在多個用例中重復地描述同一段行為,還可以避免在多個用例中對同一段行為的描述不一致。
2.擴展

在一定條件下,把新的行為加入到已有的用例中,獲得的新用例叫作擴展用例(Extension),原有的用例叫作基礎用例(Base),從擴展用例到基礎用例的關系就是擴展關系。一個基礎用例可以擁有一個或者多個擴展用例,這些擴展用例可以一起使用。在UML中,擴展關系是通過帶箭頭的虛線段加<<extend>>字樣來表示,箭頭指向基礎用例,如圖5-16所示。

圖5-16 擴展關系

擴展關系和包含關系有很大的不同:

  • 在擴展關系中,基礎用例提供了一個或者多個插入點,擴展用例為這些插入點提供了需要插入的行為。而在包含關系中,插入點只能有一個。
  • 基礎用例的執行并不一定會涉及擴展用例,擴展用例只有在滿足一定條件下才會被執行。而在包含關系中,當基礎用例執行后,被包含用例是一定會被執行的。
  • 即使沒有擴展用例,擴展關系中的基礎用例本身就是完整的。而對于包含關系而言,基礎用例在沒有被包含用例的情況下就是不完整的存在。

讓我們來看一個具體的例子,如圖5-17所示為圖書館管理系統用例圖的部分內容。在本用例中,基礎用例是“還書”,擴展用例是“繳納罰金”。在一切順利的情況下,只需要執行“還書”用例即可。但是,如果借書超期或者書有破損,借書用戶就要繳納一定的罰金。這時就不能執行用例的常規動作,如果去修改“還書”用例,勢必增加系統的復雜性。這時就可以在基礎用例“還書”中增加插入點,這樣當出現超期或破損的情況時,就執行擴展用例“繳納罰金”。

擴展關系往往被用來處理異常或者構建靈活的系統框架。使用擴展關系可以降低系統的復雜度,有利于系統的擴展,提高系統的性能。擴展關系還可以用于處理基礎用例中那些不易描述的問題,使系統顯得更加清晰和易于理解。

圖5-17 擴展關系示例

3.泛化

用例的泛化指的是一個父用例可以被特化成多個子用例(從一般到特殊),而父用例和子用例之間的關系就是泛化關系。在用例的泛化關系中,子用例繼承了父用例所有的結構、行為和關系,子用例是父用例的一種特殊形式。此外,子用例還可以添加、覆蓋、改變繼承的行為。在UML中,用例的泛化關系通過一個三角箭頭從子用例指向父用例來表示,如圖5-18所示。

圖5-18 泛化關系

當我們發現系統中有兩個或者多個用例在結構、行為和目的方面存在共性時,就可以使用泛化關系。這時,可以用一個新的(通常也是抽象的)用例來描述這些公共部分,這個新的用例就是父用例。如圖5-19所示,用例圖為飛機訂票系統預定機票有兩種方式,一種是通過電話預定,一種是通過網上預定。在這里,電話訂票和網上訂票都是訂票的一種特殊方式,因此“訂票”為父用例,“電話訂票”和“網上訂票”為子用例。

圖5-19 泛化關系示例

雖然用例泛化關系和包含關系都可以用來復用多個用例中的公共行為,但是它們還是有很大區別的。在用例的泛化關系中,所有的子用例都有相似的目的和結構,注意它們是整體上的相似。而用例的包含關系中,基礎用例在目的上可以完全不同,但是它們都有一段相似的行為,它們的相似是部分相似而不是整體相似。用例的泛化關系類似于面向對象中的繼承,它把多個子用例中的共性抽象成一個父用例,子用例在繼承父用例的基礎上可以進行修改。但是,子用例和子用例之間又是相互獨立的,任何一個子用例的執行不受其他子用例的影響。而用例的包含關系是把多個基礎用例中的共性抽象為一個被包含用例,可以說被包含用例就是基礎用例中的一部分,基礎用例的執行必然引起被包含用例的執行。

主站蜘蛛池模板: 石棉县| 甘肃省| 盐山县| 永济市| 翼城县| 会昌县| 广元市| 陇南市| 邢台市| 青田县| 福安市| 长白| 辽源市| 南汇区| 芮城县| 永州市| 安阳市| 乌拉特前旗| 扬州市| 中超| 九江市| 红原县| 周宁县| 和林格尔县| 丹阳市| 宝应县| 鹰潭市| 平果县| 绍兴县| 临江市| 江安县| 咸阳市| 东宁县| 婺源县| 丹阳市| 永康市| 祁阳县| 中阳县| 衡水市| 琼结县| 辉县市|