中科永聯高級技術培訓中心(www.itisedu.com)
擴展關係是從擴展用例到基本用例的關係,它說明為擴展用例定義的行為如何插入到為基本用例定義的行為中。它是以隱含形式插入的,也就是說,擴展用例並不在基本用例中顯示。
擴展關係將擴展用例與基本用例連線了起來。通過在基本用例中引用擴展點,可以定義在基本用例的哪些位置插入擴展用例(有關擴展點的討論,請參見指南:用例)。擴展用例通常是抽象的,但並不必須如此。
您可以出於以下幾個目的使用擴展用例:
表明用例的某一部分是可選(或可能可選)的系統行為。這樣,您就可以將模型中的可選行為和必選行為分開。
表明只在特定條件(有時是例外條件)下才執行分支流,如觸發警報。
表明可能有一組行為段,其中的一個或多個段可以在基本用例中的擴展點處插入。所插入的行為段(以及插入的順序)將取決於在執行基本用例時與主角進行的互動。
擴展是有條件的,它是否執行取決於在執行基本用例時所發生的事件。基本用例並不控制執行擴展的條件:這些條件在擴展關係中進行說明。擴展用例可以訪問和修改基本用例的屬性。但基本用例看不到擴展用例,也無法訪問它們的屬性。
擴展用例以隱含的方式修改基本用例。也可以說,基本用例定義了可以在其中添加擴展用例的模組化框架,但基本用例看不見特定的擴展用例。
基本用例自身應是完整的,即基本用例應該是可理解且有意義的,而不必引用任何擴展用例。但基本用例並不獨立於擴展用例,因為如果無法遵循擴展用例,就不能執行基本用例。
示例:
用例“召開電話會議”和“顯示呼叫方身份”是基本用例“打電話”的兩個擴展用例。
在電話系統中,為用戶提供的主要服務通過用例“打電話”來表示。可選服務的示例包括:
能讓第三方加入通話(召開電話會議)。
允許接收方看到呼叫方的身份(顯示呼叫方身份)。
我們可以將這些可選服務所需的行為表示為基本用例“打電話”的擴展用例。這是擴展關係的一種正確套用:由於“打電話”本身就具有意義,您無需閱讀擴展用例的說明就可理解基本用例的主要目的,並且擴展用例具有可選字元。
如果基本用例和“基本加擴展”用例都必須是可以直接實例化的,或者如果您希望通過添加來修改基本用例中的行為,則應使用用例泛化關係(請參見指南:用例泛化關係)。
擴展用例可以包含一個或多個插入段,每個插入段都可以有內置的備選路徑。這些插入段以遞增方式修改基本用例的行為。擴展用例中的每個插入段可以插入到基本用例中的不同位置。這意味著擴展關係包括一系列對擴展點的引用,引用的數量與擴展用例中插入段的數量相等。每個擴展點都必須在基本用例中定義。
一個基本用例包含若干擴展關係,這意味著一個用例實例在其生命期內可以遵循多個擴展用例。一個擴展用例可以擴展到幾個基本用例中,但這並不意味著這些基本用例之間存在依賴關係。同一個擴展用例和同一個基本用例之間甚至可以有多個擴展關係,前提是擴展用例必須在基本用例的不同位置插入。這意味著不同的擴展關係需要引用基本用例中的不同擴展點。擴展用例自身可以是擴展、包含或泛化關係中的基本用例。例如,擴展用例能夠以嵌套方式擴展其他的擴展用例。
一、執行擴展
當執行基本用例的用例實例達到基本用例中定義擴展點的位置時,將對相應擴展關係的條件進行評估。如果條件成立,或者如果沒有條件,用例實例將遵循擴展用例(或者擴展用例中與擴展點相對應的插入段)。如果擴展關係的條件不成立,就不執行擴展。
就象所有用例一樣,擴展用例可以有基本事件流和備選事件流(有關事件流結構的討論,請參見指南:用例)。用例實例通過擴展到底會採取哪條路徑,這不僅取決於在執行之前發生的事件(用例實例的狀態),而且還取決於執行擴展時在與主角的互動中發生的事件。用例實例一旦執行了擴展,它就會在基本用例的中斷點處繼續執行基本用例。
遵循一個基本用例及其擴展用例的用例實例。
一個擴展用例可以有多個插入段,每個插入段都與自己在基本用例中的擴展點相關。在這種情況下,用例實例將繼續執行基本用例,並持續到擴展關係中指定的下一個擴展點為止。在此點上,它將執行擴展用例的下一個插入段。這會重複進行,直到執行完最後一個插入段為止。請注意,只在第一個擴展點對擴展關係的條件進行檢查;如果條件成立,用例實例就必須執行所有插入段。
遵循一個基本用例和一個擴展用例(後者具有兩個插入段)的用例實例。
擴展關係的多重性將約束整個擴展用例可以重複發生的次數。請注意,所重複(並受多重性限制)的是整個擴展用例,而不僅僅是一個插入段。
二、記錄擴展關係
按照基本用例的屬性來說明擴展的條件。另外,您也可以選擇省略該條件,在這種情況下,擴展將總會被執行。
每一擴展關係都有一系列對基本用例中擴展點(一個或多個)的引用。擴展點是按名稱引用的。如果擴展用例具有多個插入段,您就需要指定哪個段與哪個擴展點相對應。另外,您還需要說明形成各個插入段的擴展用例步驟或分支流。
示例:
在電話系統中,可以由抽象的用例“顯示呼叫方身份”來擴展用例“打電話”。這是一項可選服務,通常稱為“呼叫方 ID”,接收方可能已請求該服務,也可能還未請求。可能會如下說明從“顯示呼叫方身份”到“打電話”的擴展關係:
條件:接收方必須已經預定“呼叫方 ID”服務。
擴展點:顯示身份 - 插入整個用例。
您可以向擴展關係賦予多重性,如果省略多重性,則假定多重性為一。
三、使用示例
請考慮下面的一個簡單電話系統:
抽象用例“召開電話會議”是用例“打電話”的擴展用例。
在這一模型(對普通電話系統的簡單表示)中,基本呼叫服務在用例“打電話”中說明。對基本事件流的分步概述如下:
1 呼叫方拿起聽筒。
2 系統發出撥號音。
3 呼叫方撥打一位數字。
4 系統結束撥號音。
5 呼叫方輸入電話號碼的其餘數字。
6 系統對數字進行分析,確定接收方的網路地址。
7 系統對數字進行分析,確定接收方在網路中所處的位置。
8 然後,系統確定是否可以與接收方建立虛擬通路。
9 如果可以建立虛擬通路,系統就使接收方的電話振鈴,並在呼叫方的電話上發出振鈴音。
10 當接收方接聽電話時,系統就停止呼叫方電話上的振鈴音,並使接收方的電話停止振鈴,這樣便建立了虛擬通路。
11 系統開始進行話費記錄,記錄呼叫的開始時間、呼叫的結束點以及呼叫方的客戶信息。
12 通話繼續一段時間。當呼叫方或接收方斷開與呼叫的連線時,系統就會記錄呼叫的結束時間,並釋放支持該虛擬通路所需的全部資源。該用例隨即結束。
如果要在此系統中添加一項功能,以允許呼叫方或接收方將第三方連入呼叫中(通常稱為“電話會議”),我們就需要向事件流添加行為。一種可選方法,也是我們應首先考慮的方法是,將差異部分直接放入“打電話”中。我們可以使用備選事件流建立這些差異部分的模型,如指南:用例中所述。這種解決方案適用於最簡單的添加,因為在這些情況下,所添加的功能不會使用例的原義變得混亂或模糊。另一種可選方法是將差異部分分散到名為“召開電話會議”的抽象擴展用例中,該用例擴展了基本用例。
© 1987 - 2001 Rational Software Corporation。著作權所有。