71. 使用案例「一定」會被啟動,適用包含關係(Apply 《include》 When You Know Exactly When to Invoke the Use Case)
72. 使用案例「可能」會被啟動,適用擴充關係(Apply 《extend》 When a Use Case May Be Invoked Across Several Use Case Steps)
--------------------
我要先澄清的是,原著作者在書中將包含關係和擴充關係視為一種結合關係,將它們稱為「包含結合」(include association)和「擴充結合」(extend association),這其實是有誤的。
請看到圖44,這是UML規格書中的母模式(metamodel),圖中很清楚看到,結合關係是一種「關係」(Relationship),而包含關係和擴充關係則是一種「具向關係」(DirectedRelationship)。

圖44: 母模式
看不太懂圖44,沒關係,打個比方,請看到圖45,相似的分類架構。根據圖45,我們會說機車和汽車是一種「車」,但是不會說它們是一種「船」,雖然機車、汽車和船三者都是一種交通工具,但顯然地,機車、汽車跟船是不同的。

圖45: 機車、汽車跟船不同
澄清完之後,再回到這兩條指南,我沒有按字面中譯,而是參照原文書中的說明,點出它們的重點。包含關係和擴充關係兩者最大的不同在於,包含關係中的被包用例(included use case)是「一定」會被執行,但是擴充關係中的擴充用例(extending use case)則是「可能」會被執行。
簡單來說,數個使用案例中,都含有一段相同且一定會被執行的小流程時,可將小流程獨立成另一個小的使用案例,方便數個使用案例共用。例如自動櫃員機的範例,無論是執行查詢餘額或者提款的過程中,都有一段檢驗晶片金融卡的流程,所以我們可以將這條相同的小流程獨立出來。
請看到圖46,原始的大流程稱為「基礎用例」(base use case),獨立出來的共用小流程稱為「被包用例」(included use case),兩者之間使用標示《include》字眼的帶箭頭虛線,由基礎用例連接指向被包用例。

圖46: 包含關係
請接著看到圖47的流程示意圖,因為包含關係中的被包用例一定會被執行,所以看起來很像是基礎用例在執行期間一定會呼叫執行被包用例,形成一條完整的流程。

圖47: 一條流程
如果,這一條共用的小流程會因為狀況的不同而「可能」被執行,那就不能使用包含關係,而得改用擴充關係。同樣看到自動櫃員機的範例,在執行提款的過程中,可以自行選擇列印收據與否,但無論是否有列印收據都不會影響提款流程。
在這種情況下,可以使用標示《extend》字眼的帶箭頭虛線,由列印收據的小流程連接指向提款這個大流程。請看到圖48,原始的大流程同樣稱為「基礎用例」(base use case),獨立出來的共用小流程稱為「擴充用例」(extending use case)。特別注意到,包含關係與擴充關係的箭頭方向剛好相反,前者由基礎用例指向被包用例,後者由擴充用例指向基礎用例。

圖48: 擴充關係
最後,我們來看圖49的流程示意圖,擴充關係中的擴充用例可能會被執行,也可能不會被執行,當不執行擴充用例時,基礎用例還是一條完整的流程。如果執行了擴充用例,看起來就像是買大送小,執行一條完整的大流程之外,還會附加執行另一條小流程。這麼一來,採用擴充關係將形成兩條不同的流程:一條流程為單純的提款,另一條流程為提款外加列印收據。

圖49: 兩條流程
<上一篇><下一篇>

0 回應:
張貼意見