第13章 術 語 大 全 (2)

 

25. analysis(分析)
分析是系統捕捉需求和問題的階段。分析着重於做什麼,設計着重於如何去做。在一個迭代過程中,各個階段不必連續地執行。這個階段的這種效果由分析層模型(特別是用例視圖和靜態視圖)來表示。對比:analysis,design,implementation和deployment。
見stages of modeling,development process。
26. analysis time(分析時間)
分析時間是軟件開發過程中分析活動執行時的時間。不要假設一個系統的所有分析都在同一時刻或先於其他活動發生,如設計和實現。對於任何獨立元素,各種活動是連續的,但是對整個系統不同的活動可以混合在一起。
見design time,modeling time。
27. ancestor(祖先)
祖先是通過一個或多個父關係路徑建立起的元素。
見generation,parent。
28. architecture(構架)
構架是一個系統的組織結構,包括系統分解成的各個部分、它們的連接性、交互機制和通知系統設計的嚮導規則。
見package。
語義
構架是有關軟件系統組織的重要決定的集合,它包括結構元素和將這些元素連接起來的接口的選擇、結構元素的大規模組織和它們的連接的拓撲結構、在元素的協作中說明的行爲、對整個系統都有效的重要的機制、指導它們的組織的構造風格。例如,決定建立一個系統,每一層包含一定數量的子系統,這些子系統以一種特殊的方式通信,而該決定即構架決定。軟件構架不僅僅涉及到結構和行爲,也涉及到使用、功能、實施、彈性、重用、可理解性、經濟和技術約束以及綜合、美學的考慮。
討論
有關係統分解的構架決定可以通過模型、子系統、包和構件說明。這些元素間的依賴關係是構造適應性和修改系統難易程度的主要指標。
構架的另一個主要部分是它準備建立在其上的機制。這些可以通過協作和模式獲得。
非結構化的決定可以用標記值說明。
29. argument(參量)
參量是對應於參數的具體的值。
見binding,參數parameter,substituablility principle。
語義
消息的運行實例有一張參量值表,其中每一個的類型都必須與信號或操作聲明中的對應參數的聲明類型相匹配。如果一個值的類或數據類型與參數的聲明類型相同或是它的後代,那麼這個值就是相容的。通過替代原理,一個後代的值可用在任何明聲祖先類型聲明的地方。一個值的實現取決於模擬器或它出現的執行環境。
在協作或狀態機中,表達式爲動作而出現。在這些表達式中,調用和消息發送需要參數說明。這些參數說明也是表達式。當在運行時計算這些表達式時,它們必須計算與它們匹配的聲明參數一致的值。
然而在模板綁定中,UML模型中的參量在建模時間出現。在這種情況下,參量表示成用某種語言(通常是約束語言或編程語言)表示的表達式。模板參量不僅僅可以包括普通的數據值和對象,也可以包括類元本身。在後一種情況下,對應的參數類型必須是類元或其他的元類型。模板參量的值必須在建模時確定,它不能用來表示運行時的參量。如果參數沒有在建模時間被限定則不要使用模板。
30. artifact(製品)
製品是被軟件開發過程所利用或通過軟件開發過程所生產的一段信息,如外部文檔或工作產物。製品可以是一個模型、描述或軟件。
31. association(關聯)
如果幾個類元的實例之間有聯繫,那麼這幾個類元之間的語義關係即關聯。
見association class,association end,association generation,binary association,n-ary association。
語義
關聯是兩個或多個特定類元之間的關係,它描述了這些類元的實例的聯繫。參與其中的類元在關聯內的位置有序。在一個關聯中同一個類可以出現在多個位置上。關聯的每個實例(鏈接)是引用對象的有序表,關聯的外延即這種鏈接的一個集合。在鏈接集合中給定的對象可以出現多次,或者在關聯的定義允許的情況下可以在同一個鏈中(在不同的位置)出現多次。關聯將一個系統組織在一起,如果沒有關聯,那只有一個無連接類的集合。
結構
關聯可以有一個名稱,但是它的大部分描述建立在關聯端點中,每個端點描述了關聯中類對象的參與。關聯端點只是關聯描述的一部分,不是可區分的語義或可用符號表示的概念。
* 名稱。關聯可以有一個名稱,在包含包的所有關聯和類中它必須是唯一的(關聯類既是一個關聯又是一個類,所以關聯和類分享同一個命名空間)。關聯不是必須要有一個名稱,它的端點的角色名稱提供了在同一個類中辨別多個關聯的另一種途徑。按照習慣,名字以類在表中出現的順序讀出:Person爲compry工作;Salesman賣Car給消費者。
* 關聯端點。關聯包含一張有多個關聯端點的有序表(也就是說這些端點是可以被區分的並且是不可替換的)。每個關聯端點定義了在關聯中給定位置的一個類(角色)的參與。同一個類可以出現在多個位置上,而位置通常是不可交換的。每個關聯端點指定了的應用於對應對象的參與特性,如在關聯中一個獨立的對象在鏈接中會出現多少次(多重性)。某些特性,如導航性只應用於二元關聯,但是多數可以應用於n元關聯。
見association ends。
實例化
鏈是關聯的實例。它包含對於每個關聯端點的槽,每個除對象表之外,槽包含對一個對象的引用,該對象是作爲對應關聯端點的類的(直接的或間接的)實例。鏈沒有身份標識。關聯外延中的鏈組成了一個集合,在這之中不會存在副本。一個對象在鏈集合中出現的次數必須與關聯的每個端點的多重性相一致,例如,關聯SoldTickets將多張票與一場演出連接起來,那麼每張票在一個鏈中只出現一次,但是每場演出可以出現多次,每次對應不同的票。
鏈在系統執行過程中可以被創造和銷燬,服從每個關聯端點可修改性的限制。在某些情況下,鏈可以從關聯端點一端的對象創建或改變而不能從另一端做同樣的事。一個鏈從一組對象引用中創建。鏈沒有自己的身份標識,所以討論改變它的值是沒有意義的。然而,它可以被銷燬,可創建一個新的鏈來代替它。一個關聯類的鏈,除了定義它的身份的一組對象外還有一個或多個屬性值,而且屬性值在保持參與對象的引用的情況下可以由操作來改變。
表示法
二元關聯用連接兩個類邊界的實線路徑表示(如圖13-22),n元關聯用菱形表示,菱形通過路徑與每個參與到其中的類連接,見後文如圖13-129 (在二元關聯中菱形省略)。路徑的多個端點可以連接到一個獨立的類。
路徑包含一個或多個相關的實線部分,通常是直線,但是也允許使用弧線和其他的曲線,尤其是在表示自關聯(即一個類出現多次的關聯)時。每個單獨的部分沒有語義含義。線的風格由用戶選擇。
見path。
路徑的端點處有描述關聯中類的參與情況的修飾符號。一些修飾符號位於路徑的端點,線和類符號之間。如果有多個符號,那麼它們被按照從線的端點到類符號的順序擺放--導航箭頭、聚合/組合菱形、限定符(如圖13-23)。
其他修飾符,如名稱標籤,被放在靠近它們所確認的事物旁。角色名稱被放置在靠近路徑端點外。
13-22.gif
圖13-22 關聯
13-23.gif
圖13-23 關聯端的修飾符的順序
13-24.gif
圖13-24 關聯名
關聯名稱
關聯的名稱放置在路徑的旁邊,但遠離關聯的一端,這樣就不會引起混淆(混淆的危險對人類而言純粹是視覺上的,在一個圖形工具內,相關的符號可以用清晰的內部超鏈接相互連接)。關聯名稱可以在多段連接中從一個部分拖到另一個部分而沒有語義衝突。關聯名稱可以用一個小的實心三角形表示表中類的順序。直觀地,名稱箭頭表示如何去讀名字。在圖13-24中,類Person和類Company之間的關聯 Works For 有一個從Person指向Company的名稱三角形,該關聯可以讀成"人爲公司工作"。請注意名稱旁的次序三角形純粹是一個符號化的裝置,它用來指明關聯端點的順序。在模型中,端點本質上是有序的,所以模型中的名字不需要次序特性。
關聯上的構造型通過將構造型名字放在小雙尖括號內表示,它放在關聯名稱前或替代關聯名稱。特性表可以放置在關聯名稱的後面或下面。
關聯類
我們將類符號用虛線連接到關聯路徑上來表示關聯類。對n元關聯來說,虛線連接到關聯菱形上。關聯中有關類的特性表示在類的符號中,而有關關聯的特性則表示在路徑上。然而,即使圖形由兩個圖構成,基本的建模結構也是單個元素。
詳association class。
異或約束
{xor}約束將兩個或多個關聯連接起來,這些關聯在某一端連接到一個獨立的類(基類)。基類的一個實例可以參與到通過約束連接的關聯中的一個。必須注意到所選擇關聯的多重性。如果任何關聯多重性包括基數0,那麼基類的一個實例可能不會有關於關聯的連接,否則,它必定有一個。
異或約束用連接兩個或多個關聯的虛線表示,所有關聯必須有一個公共類,約束字符串{xor}標識在虛線旁(如圖13-25)。遠離公共類一端的角色名必須是不同的(這僅是一種通過使用標準約束重疊實現好的約束表示法的預定義用法)。
13-25.gif
圖13-25 異或關聯
討論
關聯不需要有名字。通常角色名更方便一些,因爲它們爲導航和編碼生成提供了名字,並且避免瞭如何讀名字的問題。如果它有名字,那麼名字在它的包內必須是唯一的。如果在兩個類之間只有一個關聯,那麼類名對於確定關聯來說就足夠了。
當真實世界的概念有一個名字時,關聯名更有用一些,如Marriage 或Job。當關聯名被指定依照給定方向讀出,僅僅用角色名更好一些,這樣讀起來不會有歧義。
參看暫時連接我們可得到有關建模只在過程執行時存在的實例關係的討論。
見組成部分的有關涉及兩個關聯的泛化的例子。
標準元素
隱含(implicit),永久性(persistence),異或(xor)。
關聯(二元) association(binary)
見二元關聯(binary association)。
關聯(n維) association(n-ary)
見n元關聯(n-ary association)。
32.關聯類(association class)
關聯類既是關聯又是類。關聯類有着關聯和類的特性。它的實例是有屬性值的連接和對其他對象的引用。儘管它的符號包括關聯和類的符號,但是它的確是一個獨立的模型元素。
見關聯(association),類(class)。
語義
關聯類有着關聯和類的特性,它將多個類連接起來又有着屬性和操作。當每個鏈必須有它自己的屬性值、操作或對對象的引用時,關聯類就有用了。它可以被看作有着對每個關聯端點有着特殊類引用的類,對於實現它而言這是一條明顯和通常的途徑。每個關聯類的實例有對象引用和通過類部分說明的屬性值。
連接類A和類B的關聯類C不同於與A和B有二元關聯關係的類D,(見討論部分)。與所有的連接一樣,像C這樣的關聯類的一個連接從對象引用中得到它的身份。屬性值沒有涉及到提供身份上。所以即使它們的屬性值有區別,兩個連接不能有同樣的(a,b)對象對,因爲它們不會有同樣的身份。也就是說,給定的屬性E,不允許(a、b、e1)和(a、b、e2)都是C的實例,因爲它們分享同一個身份(a、b)。然而,對象有固有的身份,所以兩個對象可以有同樣的屬性值或對相同對象的連接。也就是說,一個關聯包括像C這樣的關聯類,是一個有序表集合並且它的對象引用中沒有副本;然而,像D這樣的隱含關係更像一個包,它可以有副本。見討論。
關聯類可以有操作,這些操作可以改變連接的屬性或者增加連接本身和移走它。因爲關聯類也是一個類,它也可以參與到關聯本身。
關聯類可以不把它自己作爲參與類中的一個(雖然有些人能夠確切地找到這種遞歸結構的意義。
13-26.gif
圖13-26關聯類
表示法
關聯類表示成一個類符號(矩形),由一條虛線與關聯路徑連接(如圖13-26)。類符號的名字和附着在關聯路經上的名字字符串是冗餘的。關聯路徑可以有通常的關聯端符號。類符號可以有屬性和操作,作爲類它參與到自己的關聯中。在虛線上沒有符號,它不是一個關係而僅僅是整體的關聯類符號的一部分。
風格指導
連接點不應該太靠近路徑的兩端,這樣就不會使它看起來像連接在路徑的端點上或連接到任何角色符號上。
請注意關聯路徑和關聯類是獨立的模型元素,所以有着獨立的名字。名字可以表示在路徑上或類符號上或在兩者上。如果關聯類只有屬性但是沒有操作或其他的關聯,那麼名字可以在關聯路徑上表示出來,並且爲了突出它的"關聯自然性"而從關聯類符號中省略。如果它有操作和其他的關聯,那麼名字會從路徑上忽略並且爲了突出"類自然性"而放在類矩形中。在兩個情況中,實際的語義都沒有區別。
討論
圖13-26表示了代表僱用關係的關聯類。公司與個人之間的僱用關係是多對多的。一個人可以有多個工作,但只有一個工作是對指定的公司的。薪水既不是公司又不是個人的屬性,因爲關聯是多對多的。它必須是關係本身的屬性。
老闆-工人的關係不僅僅是兩種人之間的關係,它是處於某種職業的人與處於另一種職業的人之間的關係,它是關聯類和它自己之間的關聯。
下面的例子表示關聯類和建模成類的具體化關係之間的區別。在圖13-27中,股票的所有者被建模成人與公司之間的關聯。關聯類屬性quantity表示了擁有股份的數量。這個關係建模成關聯類是因爲對任何person-company對只有一個入口。
如圖13-28所示,爲了建模購買股票,我們沒有用關聯類,因爲對同一個人和公司來說可以有多個購買。然而,它們必須是可區別的,因爲每次購買是不同的而且有它自己的日期和價格以及數量。這個關係必須是具體化的,即形成有着自己的身份證明的可區別的對象。一個普通的類是建模這種情況的正確的方式,因爲每次購買有着它們自己的身份證明,獨立於與它聯繫的Person和Company類。
13-27.gif
圖13-27 帶屬性的關聯類
13-28.gif
圖13-28 具體化的關聯
33.關聯端點(association end)
關聯端點是關聯的一個結構部分,它定義了在關聯中類的參與。在同一個關聯中一個類可以連接到多個端點。在關聯中的關聯端點有不同的位置而且有名字,並且通常是不可互換的。關聯端點一旦脫離它的關聯獨立存在也不再有含義。
語義
結構
關聯端點保持一個目標類元的引用。它定義了在關聯中類元的參與。關聯的實例(鏈)必須在指定位置含有給定類或它的一個後代的實例。類的後代繼承關聯的參與。
一個關聯端點有如下的特性:
聚集(aggregation)
判定相關對象是聚集還是組成,有枚舉值{none,aggregate, composite}。如果值是none,那麼關聯就叫做一個聚集或一個組成。缺省情況是none。只有二元關聯才能是聚集或組成,並且只有一端能是聚集或組成。
可修改性(changeability)
判定與對象有關的連接集合是否可修改,有枚舉值{changeable,frozen,addOnly}。缺省情況下是changeable。
接口說明(interface specifier)
對相關對象,類元中的說明類型的可選擇的限制。
多重性(multiplicity)
與一個對象相關的對象的可能的數量,通常指定爲整數範圍。
導航性(navigability)
一個布爾值,表示是否可能將一個二元關聯轉化以得到有關一個類實例的對象或對象集合。缺省是真。
定序(ordering)
判定一組不相關對象是否是有序的,枚舉值有{unordered,ordered}。爲了設計的目的,sorted值也可以被用到。
限定符(qualifier)
一組屬性用來選擇關聯聯繫起來的對象。
角色名字(rolename)
關聯斷點的名字,一個標識符字符串。這個名字確定關聯內對應類的特定角色。角色名在關聯中和在源類的直接和繼承的僞屬性中必須是唯一的。
目標範圍(target scope)
判定連接與對象或整個類是否相關,枚舉值有{instance,classifier}。缺省是instance。
可見性(visibility)
連接是否可訪問類而不能訪問關聯中相反的一端。可見性位於連接到目標類的一端。轉換的每個方向有它自己的可見性值。
表示法
關聯路徑的端點連接到對應類符號的矩形邊緣上。關聯端點特性表示成在路徑端點上或旁邊的符號,這條路徑連接到一個類元符號(如圖13-29)。下面的表是對每個特性的符號的簡要的總結。要了解詳細資料見獨立的章節。
聚集 (aggregation)
位於聚集端的一個空的菱形,對於組成來說是一個實菱形。
可修改性(changeability)
在目標端的文字屬性{frozen}或{addOnly},通常省略{changeable}。
接口說明(interface specifier)
角色名上的名字後綴,形式是:typename。
多重性(multiplicity)
靠近路徑端點的文字標記,形式是:min..max。
導航性(navigability)
路徑端點上的箭頭表示了導航的方向。如果兩個端點都沒有箭頭,就是假設關聯在兩個方向上都是可導航的。
定序 (ordering)
靠近目標端點的文字屬性{ordered},有目標類實例的有序表。
限定符(qualifier)
在路徑端點和源類之間的一個小矩形。矩形內包含了一個或多個關聯的屬性。
角色名(rolename)
靠近目標端的一個名字標籤。
目標範圍(target scope)
類範圍角色名是加下劃線的,除非它是實例範圍。
可見性(visibility)
可見性符號{+ # -}位於角色名前。
如果在一個獨立的角色上有多個符號,那麼它們以如下順序表示,從連接類的路徑的一端讀起(如圖13-23)
限定符
聚集或組成符號
導航箭頭
角色名和多重性應該放置在靠近路徑的一端,這樣它們不會與別的關聯混淆。它們可以放置在線的任何一端。把它們總是放在線的一端更好一些,但是有時明確性更重要。角色名和多重性可以放在同一個角色相對的兩邊,或者它們也可以放在一起。
13-29.gif
圖3-29
標準元素
關聯(association),全局(global),局部(local),參數(parameter),自身(self)。
34.關聯泛化(association generalization)
關聯泛化是兩個關聯之間的泛化關係。
見關聯(association),泛化(generation)。
語義
關聯之間的泛化是允許的,雖然這有點不太常見。與其他的泛化關係一樣,後代元素必須加入到父的內容中(定義規則),並且作爲父的外延(實例的集合)的子集。加入到內容中意味着加入附加的限制,一個子關聯比它的父有更多的約束。比如,在圖13-30中,如果父關聯將類Subject和Symbol連接起來,那麼子關聯可以將類Order和OrderSymbol連接起來,在這裏面Order是Subject的子,OrderSymbol是Symbol的子。作爲外延的子集意味着子關聯的每個連接是父關聯的一個連接,而反之卻不能。上面的例子遵循了這條規則,任何連接Order和OrderSymbol的連接也可以連接Subject和Symbol,但是不是所有連接Subject和Symbol的連接都可以連接Order和OrderSymbol。
表示法
泛化箭頭符號(實線、空三角形箭頭)將子泛化和父泛化連接起來。箭頭在父泛化一方。由於線段連接到其他的線段,關聯泛化符號可能造成混淆所以應該小心使用。
舉例
圖13-30表示了Subject和Symbol之間普通model-view關聯的兩個特舉例:Order和OrderSymbol之間的關聯是一個特例,另一個是Customer和CustomerSymbol之間的關聯。它們都將一個Subject類和一個Symbol類連接起來。Subject-Symbol關聯可以看作是抽象的關聯,而兩個子關聯是具體的。
這種由關聯連接的成對類層次模式相當普遍。
標準元素
被銷燬的(destroyed)。
13-30.gif
圖13-30關聯泛化
35.關聯角色(association role)
關聯角色是合作中兩個類元角色的連接,它只適用於在合作說明的特定情況下的兩個類元之間的關聯。
見關聯(association),合作(collaboration)。
語義
關聯角色是隻在由合作所描述的情況下有意義和被定義的關聯。它是作爲合作的部分關係而在其他情況下不是固有的關係。關聯角色是合作的關鍵結構部分。它們允許有關上下文關係的描述。
在合作中,類元角色表示一個類元的獨立的出現,而區別於這個類元的其他出現和這個類元本身的聲明。在基於合作的上下關係的情況下,它代表對基類元的使用的限制。同樣地,關聯角色代表了用於特殊關係中的關聯,通常是對普通關聯受限制的使用。關聯角色將兩個類元角色連接起來。當合作被實例化時,對象受限於類元角色而連接受限於關聯角色。一個對象可以加入多個角色。
關聯角色將兩個或多個類元角色或是合作內的類元連接起來。它有對基關聯的引用並且有着重複性,表示在一個合作的實例中可以有多少個連接扮演角色。在一些情況下,合作中的一些連接可以被看作是對參與的類之間普通關聯的使用。合作表示了在合作內爲了某種目的使用通用的關聯的某種方法。
在其他情況下,類元角色被合作外非法的關聯連接起來。如果一個關聯角色沒有明確的基關聯,那麼它就定義一個只在合作內合法的隱含關聯。
表示法
關聯角色與關聯的表示法相同,也就是在兩個類元角色符號間的一條實線。如圖13-31
13-31.gif
圖13-31 關聯角色
標準元素
新(new),暫時(transient)。
36.異步動作(asynchronous action)
異步動作不要求發送對象暫停去等待結果,它是一個發送。
見發送(send),同步動作(synchronous action)。
37.原子(atomic)
一個動作或操作,它們的執行必須作爲一個單元被完成,原子也不能被部分地執行或被外部事件中斷。通常,原子操作是小規模的且簡單的,例如,賦值和簡單的算術或字符串計算。一個原子計算出現在執行序列的確定點上。
見動作(action),活動(activity),運行到完成(run to completion)。
語義
整個系統可以同時執行多個動作。如果我們說動作是原子的,這並不意味着整個系統是原子的。系統可以在幾個動作之間處理硬件中斷和分時操作。一個動作在它自己的控制線程內是原子的。被激發後它必須完成執行並且不能與其他同時存在的活動動作相互作用。系統可以處理中斷和事件,但是不能影響原子動作。但是動作不能用作一個很長的處理機制。相對於對外部事件的反應時間來說,它們的持續時間應該是短暫的。否則,系統就不能實時地做出反應。
38.屬性(attribute)
屬性是類中特定類型的命名存儲槽的描述,類的每個對象獨立擁有類型的值。
語義
類元中的屬性描述類元實例可能擁有的值。類元的每個實例或它們的後代擁有包含給定類型的值的位置。所有的位置是不同的,並且互相獨立(類作用域屬性除外,將會在下面描述它)。如果屬性是可修改的,那麼當執行進行時,實例內位置所擁有的值可以被類型的不同值取代。
類元爲它的屬性組成了一個命名空間。包含在命名空間中的是僞屬性,比如離開類元的關聯角色名和包含類元的泛化判別式。
結構
屬性有下面的幾個組成部分,詳述見下:
可修改性(changeability)
判定在初始化後位置中的值是否可以改變,是枚舉值。缺省情況下是changeable。可能的值有:
changeable 對修改沒有限制。(缺省值)
addonly 附加值可以加到屬性值的集合中。但是一旦被創建,值就不能被移動或改變。(只在最大多重性大於一時有意義)
frozen 在對象被初始化後值不能被改變。沒有多餘的值可以加入到值集合中。
初始值(initial value)
初始值是說明值的表達式,在對象被初始化後被對象中的屬性所擁有。表達式是一個文字字符串,包括用來計算表達式的語言的名字。當對象被實例化時表達式通過語言的上下文計算。參看表達式可得到更多詳細資料。初始值是可選的。如果它是空的,那麼靜態模型不會說明由新的對象擁有的這個值,但是模型的其他部分會提供這個信息。
請注意到一個明確的初始化過程,比如構造函數,會替換初始值表達式。
類作用域屬性的初始值在執行開始時初始化一次。UML沒有說明不同類作用域屬性初始化的相對順序。
多重性(multiplicity)
可以同時存在的屬性值的可能數量。最通常的值"只有一個"表示了一個標量屬性。值"零或一個"表示了一個有可選擇值的屬性。在屬性值的作用域中缺少的值與其他的值是有區別的。即值的缺少與值零是不同的,它是一個空集合。其他多重性表示了潛在的多值屬性。如果多重性不是一個單一的整數,那麼由屬性所擁有的值的數量可以改變。多重性"許多"表示了一個無限制的值的集合。
名字(name)
屬性的名字,一個字符串,在類和它的祖先內必須是唯一的。它必須在類可到達的關聯角色名中也是唯一的。
所有者作用域 (owner scope)
由屬性所描述的這個值在類的每個對象中可能是不同的或是由類的所有對象所分享。前者是實例作用域屬性,後者是類作用域屬性。大多數屬性是實例作用域的;它們持有一個特定對象的狀態信息。類作用域屬性持有一個完整類的信息;有一個獨立的位置對應整個類。然而一個實例作用域屬性是對一個值的描述,這個值直到對象被實例化後才存在。一個類作用域屬性代表一個獨立抽象值的聲明,該值在系統整個生命週期存在。
目標作用域(target scope)
由屬性所持有的這個值可能是一個實例或是類本身。前者是實例作用域,它是缺省的。後者是類作用域,它不常見並且通常涉及一些元建模。
類型(type)
指定一個類或數據類型,位置中的值是它們的實例。值可能是給定類或數據類型的後代的實例。
可見性(visibility)
判定屬性是否能被其他類看見,枚舉值有public、private和protected。建模特定編程語言時附加值可以被加入。
表示法
屬性可以表示成一個字符串,它可以從語法上分析成不同的特性。缺省語法是:
《stereotype》opt visibilityopt name multiplicityopt:typeopt=initial_-valueopt{property-string}opt
可見性(Visibility)。可見性表示成一個標點符號。而在特性字符串中可見性可以表示成關鍵字。後一種形式必須用於用戶定義或基於語言的選擇中。已定義的選擇是:
+(public)公有的 能夠看見類的任何類可以看見屬性。
#(protected)受保護的 類本身或它的任何後代可以看到屬性。
-(private)私有的 只有類本身可以看到屬性。
名字(Name)。名字表示成一個標識符字符串。
類型(Type)。類型表示成一個指明類元的表達式字符串。類或數據類型的名字是合法的表達式字符串,它表明屬性的值必須是給定的類型。附加類型語法依賴於表達式的語言。每種語言有從簡單數據類型構造出新數據類型的語法。比如,C++有指針,數組和函數的語法。Ada也有子範圍的語法。表達式的語言是內部模型的一部分,但是它通常不在圖中表示出來。假設它對於整個圖是已知的或從它的語法上能明顯看出。
類型字符串可以被隱藏,但是它仍然存在於模型中。
多重性(Multiplicity)。多重性表示成一個包含於方括弧中的多重性表達式,它位於屬性名後。如果多重性是"只有一個",那麼表達式,包括方括弧,可以被省略。這表示每個對象只有一個保持給定類型值的位置。否則,多重性必須表示出來。見多重性以瞭解有關它的語法的詳細表示。例如:
colors[3]:Saturation An array of 3 saturations
points[2..*]:point An array of 2 or more points
請注意0..1的多重性提供了空值的可能性--缺少值,相對於範圍中的一個特定值。在多數數據類型域中空值不是一個值;它用一個域外的特殊值擴充了這個域。然而,對指針來說,空值通常是實現的一部分。下面的聲明允許了空值和空字符串之間的區別,有C++和其他一些語言所支持的區別。
Name[0..1]:String 若名字缺省則爲空值
初始值(Initial value)。初始值表示成一個字符串。賦值的語言通常不明確表示出來,但是它存在於模型中。如果沒有初始值,那麼字符串和相同的標誌都被省略。如果屬性多重性包括值0(可選的)並且沒有給定明確的初始值,那麼屬性始於一個空值(零複製)。
可修改性(Changeability)。可修改性表示爲一個關鍵字,如果沒有選擇給出,那麼缺省值是changeable。
標籤值(Tagged value)。零個或多個標籤值可以附屬於一個屬性。每個標籤值表示成tag = value的形式,tag是標籤的名字,value是一個文字值。標籤值包含特性關鍵字,它是一個由括號所包括的由逗號分隔的特性表。
作用域(Scope)。類作用域屬性表示成在名字和類型表達式字符串下有一條下劃線;否則這個屬性是實例作用域的。這樣表示的理由是類作用域屬性是在執行系統中的值,就像一個對象是一個實例值,所以都必須加下劃線指明。
class-scope-attribute
圖13-32表示了一些屬性的聲明。
13-32.gif
圖13-32屬性
表示選項(Presentation options)。
編程語言語法(Programming-language syntax)屬性字符串的語法可以是一種編程語言的,比如C++或Smalltalk。特定的標籤屬性可以包含在字符串內。
風格指導
屬性名字以普通的類型界面表示。
討論
類似的語法用於說明限制符、模板參數、操作參數等等。
請注意:屬性在語義上等同於一個組成關聯。然而,意圖和用途通常是不同的。對數據類型使用屬性,即對沒有身份的值使用屬性。對類使用關聯,即對有身份的值使用關聯。原因是對有身份的對象,看清兩個方向上的關係是重要的;對數據類型來說,數據類型通常附屬於對象並且不瞭解它。
標準元素
持久性(persistence)。
39.背景信息(background information)
在同一個圖中或在不同圖中的類符號的出現可以有它本身的表示選擇。例如,一個類的符號可以表示屬性和操作而同一個類的另一個符號可以隱藏它們。工具可以提供依附於每個符號或整個圖的風格表單。風格表單可以說明表示選擇,而且它們可以適用於大多數的符號,而不僅僅是類。
不是所有的建模信息都可以用圖形符號很好地表示。有些信息最好用文字或表格形式表示。比如,詳細的編程信息最好用文字表表示。UML並不假定模型中的所有信息都可以表示成圖,有一些信息只適用於表格。這篇文章並不試圖規定這種表格的格式或用於訪問它們的形式。這是因爲潛在的信息已經在UML元模型中充分描述了,而且表示表格信息也是工具的任務。然而假定隱藏連接可以在圖形和表格中都存在。
40.變成(become)
變成是用於交互作用中的一種流依賴關係,在它當中目標對象代表源對象的一種新的形式,並且隨後取代了源對象。
見狀態類(class-in-state),複製(copy),位置(location)。
語義
變成依賴關係是一種流依賴關係,它表示在交互中一個對象從另一個對象的派生。它表示了一個轉換對象的動作。在一個變成流執行後,在計算中一個新對象替代原始對象的位置。如果只用來表示一個對象值的改變那麼不必用這個關係。相反地,這個關係用來表示對象中的質變,比如狀態的改變、類的改變或位置的改變。在這種情況下,模型包括對象的兩個版本,但是變成關係表明它們的確是同一個對象不同時間的兩個版本,即它們有着同樣的身份。
交互中的變成轉換有一個順序號,用來表明相對於其他動作它什麼時候發生。
表示法
變成流表示成一個虛箭頭,它的尾部位於對象的早期版本而頭部位於較晚的版本,箭頭持有構造型關鍵字《become》。箭頭可以有一個交互中的序列號,用來表示相對於其他動作什麼時候發生。變成轉換可以出現於合作圖中,順序圖中,活動圖中。
在活動圖中,變成轉換可以表示成一個向着或來自對象流符號的虛箭頭。《become》關鍵字可以被省略。
舉例
圖13-33表示了一個命令,用來打開桌面上的一個關閉的目錄圖標,它後面是一個命令,它用來整理現在打開的目錄中的選項。目錄作爲狀態類對象表示兩次,變成轉換在兩個版本之間。
圖13-132表示了一個部署圖中一個對象在兩個節點間遷移。
13-33.gif
圖13-33 變成流
41.行爲(behavior)
一個操作或一個事件的可見的影響,包括它的結果。
42.行爲特徵(behavioral feature)
表示動態行爲的模型元素,比如操作或方法,它可以是類元的一部分。一個類元處理一個信號的聲明也是一個行爲特徵。
標準元素
創建(create),銷燬(destroy),葉(leaf)。
43.行爲視圖(behavioral view)
行爲視圖是一個模型的視圖,它強調系統中實例的行爲,包括它們的方法、合作和狀態歷史。
44.二元關聯(binary association)
兩個類間的關聯。
見關聯(association),n元關聯(n-ary association)。
語義
二元關聯是有着兩個關聯端點的關聯,它是最常見的一種關聯。因爲二元關聯的一個端點有一個唯一的另一端,所以二元關聯對說明從對象到對象的導航路徑是特別有用的。如果一個關聯可以橫越指定的方向,那麼這個關聯在指定方向上是可導航的。有一些屬性對n元關聯定義,例如多重性,但是它們對二元關聯更直觀和有用。
表示法
一個二元關聯表示成一個連接兩個類符號的實線路徑。修飾符號可符在端點端,關聯名可以放置在靠近實線處,離每一個端點有一定距離,這樣不會誤解成角色名。除了隱藏中心菱形符號,二元關聯的表示符號與n元關聯的相同。但二元關聯有不適用於n元關聯的修飾符號,例如導航性。
詳見關聯(association)。
45.綁定(bind)
在表示符號中綁定依賴關係的關鍵字。
見綁定(binding)。
46.綁定(binding)
綁定是向參數賦值從而由一個參數化元素創建一個獨立元素。綁定關係是一種依賴關係。它用來綁定模板以創建新的模型元素。
見邊界元素(bound element),模板(template)。
語義
一個參數化的定義,例如操作、信號或模板,定義了一個元素的形式。然而,一個參數化的元素不能直接使用,因爲它的參數沒有確切的值。綁定是一種依賴關係,它代表向參數賦值以創建一個新的、可用的元素。綁定表現在操作上產生調用,表現在信號上產生髮送信號,表現在模板上產生新的模型元素。頭兩個在執行時綁定以產生運行時間實體。除了作爲例子或模擬結果它們通常不在模型中設置。參量值在執行系統內定義。
然而,模板在建模時綁定以創建用於模型中的新的模型元素。比如類,除了數據值之外,比如字符串和整數,參量值可以是其他的模型元素,如類。綁定關係將值綁定到模版上,產生一個可以直接用於模型內的實際模型元素。
綁定關係有一個提供者元素(模板),一個客戶元素(新生成的綁定元素),和一張綁定到模板參量的數值表。綁定元素通過在模板體的拷貝中將每個參數值替換爲對應的參數來定義。每個參量的類元必須與它的參數的已聲明的類元或其後代相同。
綁定並不影響模板本身。每個模板可以綁定多次,每次產生一個新的綁定元素。
表示法
綁定用連到一個虛箭頭的關鍵字《bind》表示,這個虛箭頭將生成元素(在箭頭的尾部)和模板(在箭頭的頭部)連接起來。實際參量值表示成一個位於《bind》關鍵字後由圓括弧包含的由逗號分隔的正文表達式表。
另一種更簡潔的綁定表示法用名字配對避免了箭頭的使用。爲了表示綁定元素,模板的名字後是一個用尖括弧括起來的逗號分開的正文表達式表(<參量list,>)。
在每一種情況下,每個參量被表述爲在模型建立時靜態賦值的正文字符串。它不像操作或信號參量一樣動態賦值。
在圖13-34中,用箭頭的顯式形式聲明瞭一個新的類AddressList,它的名字可以用在模型或表達式中。隱含形式Varray〈Point,3〉聲明瞭一個沒有自己名字的匿名類。它可以在用隱含語法的表達式中使用。在這兩種情況下都可以聲明附加的屬性或操作。如果需要擴展那麼也可以聲明子類。
標準元素
綁定(bind)。
13-34.gif
圖13-34模板聲明和綁定
47.布爾型(Boolean)
布爾型是值爲true和false的枚舉類型。
48.布爾型表達式(Boolean expression)
賦值給布爾值的表達式,在監護條件中有用。
49.綁定元素(bound element)
通過將參量值綁定到模板參數而產生的模型元素。
見綁定(binding)、模板(template)。
語義
模板是一組可能元素的參數化描述。爲了得到實際元素,模板參量必須綁定於實際值。每個參量的實際值是由綁定出現的作用域所提供的表達式。大多數參量是類或整數。
如果作用域本身是一個模板,那麼外層模板的參數在綁定原始模板時可用作參量,得到重新參量化的效果。但是一個模版的參數名在它的主體外沒有意義。在兩個模板中的參數名不能僅僅因爲它們有相同的名字就假定它們等同,不過子過程參數僅可以依據它們的名字而對應。
綁定元素完全由它的模板說明。所以,它的內容不能擴展。例如,不允許聲明類的新屬性和操作,但是一個綁定類可以被子類化而且子類以通常方式擴展。
舉例
圖13-35表示了一個模板的再綁定。PointArray是一個有着一個屬性的模板--大小爲n。我們想從存在的模板Farray中得到它,Farray由兩個參數--元素類型T,大小k。爲了得到它,Farray模板的參數k綁定於PointArray模板的參數n。Farray模板的參數T綁定於類Point。這樣可以產生將一個參數從原始模板中移走的效果。爲了用PointArray模板生成一個Triangle類,將大小屬性n綁定於值3。爲了生成一個Quadrilateral類,將大小屬性n綁定於值4。
圖13-35也表示將模板Polygon作爲類Shape的孩子。這表示任何與模板Polygon綁定的都是Shape的子類,Triangle和Quadrilateral都是Shape的子類。
13-35.gif
圖13-35 模板再綁定
表示法
綁定元素可以用一個從模板指向綁定元素的虛箭頭表示,箭頭連有關鍵字《bind》。它也可以用正文語法TemplateName<參量list,>表示,用名字匹配確定模板。正文形式避免了表示模板或畫出指向它的箭頭。當綁定元素被用作一個屬性或操作參數的類元時,這種形式特別有用。
詳見綁定(binding)。圖13-36顯示了一個例子。
13-36.gif
圖13-36關聯中綁定模板模板的使用
在一個綁定類中通常壓縮屬性和操作分隔區,因爲它們不能在一個綁定元素中改變。
綁定元素名(使用尖括號的隱含匿名形式或使用"綁定箭頭"的顯式形式)可以用在任何一個參數化模板的元素名可用的地方。例如,綁定名字可以用在類圖上類符號中屬性類型或一部分操作特徵。圖13-36表示了一個例子。
討論
類元是參數化的明顯候選。它們的屬性的類型、操作或關聯類元是模板中的一般參數。參數化的合作是模式。從某種意義上說,操作本質上是參數化的。其他元素的參數化用途不那麼明顯,但是很可能進一步找到用途。
50.分支(branch)
分支是狀態機中的一個元素,在它當中一個獨立的觸發可能導致多個可能結果,每個結果有它自己的監護條件。
見分叉(fork),結合(join),結合狀態(junction state),合併(merge)。
語義
如果同一個事件可以依據不同的監護條件有不同的影響,那麼它們可以建模成有着相同事件觸發的分離轉換。然而,在實際情況中允許一個獨立的觸發驅動多個轉換是很方便的。在通常情況下常常是監護條件覆蓋每種可能,這樣一個事件的發生保證能觸發一個轉換。分支是轉換的一部分,它將轉換路徑分成多個部分,每一部分有單獨的監護條件。事件觸發放在轉換前面的公共部分。分支的輸出部分可以與另一個分支的輸入部分連接而組成一棵樹。通過樹的每個路徑代表一個不同的轉換。轉換中一個路徑上所有條件的結合與概念上在轉換激發之前被賦值的一個獨立條件相同。轉換在一個獨立步驟激發,而不管它作爲有分支的樹出現。樹僅僅是爲了建模的方便。
在一個活動圖內,離開一個活動狀態的分支通常是完成轉換--即它們缺少明顯的事件觸發,它們是在狀態內活動完成時隱含觸發的。如果有監護條件和分支,那麼它們覆蓋所有種可能是很重要的,因爲這樣可以保證一些轉換激發。否則,會因爲輸出轉換不再重新激發而使活動圖凍結。
表示法
分支可以表示成以不同的監護條件在多個轉換弧上重複一個事件觸發。這也可以通過完成轉換表示,就像在一個活動圖中。
然而,方便起見,轉換箭頭的頭部可以連接到一個菱形符號,這個菱形符號表示了一個分支。轉換箭頭標記上觸發事件,但是不能有動作在上面。任何動作都走到轉換的最後部分。
一個菱形符號可以有一個或多個離開它的箭頭。每個箭頭用一個監護條件標記。保留字else可以用作一個監護條件。如果其他的(明確的)監護條件爲假,那麼它的值就爲真。每個箭頭的頭部可以連接到另一個分支或狀態。連接到狀態的箭頭可以有一個相關的動作標記。
分支樹的作用與將樹擴展成對應於樹的每個分支的分離轉換弧的作用相同,它們分享同一個觸發事件但是每一個有着它們自己的監護條件的結合、動作和目標狀態。圖13-37是表示分支的兩種方法。
請注意到菱形符號也可以表示合併,與分支相反,這時兩個不同的路徑合併在一起,如圖13-38所示。在合併的情況下,有兩個或更多的輸入箭頭和一個單獨的輸出箭頭,不需要監護條件。
13-37.gif
圖13-37表示分支的兩個方法
13-38.gif
圖13-38分支和合並
51.調用(call)
用於激活一個操作。
見激活(activation),調用事件(call event),發送(send)。
語義
調用是在一個過程的執行點上激發一個操作。它將一個控制線程暫時從調用過程轉換到被調用過程。調用過程的執行在調用時被阻斷。在操作執行中調用者放棄控制並且在操作返回時重新獲得控制。被調用過程從調用者那裏得到一張參量表和對調用過程的一個隱含返回點,就是調用點的下一條命令。被調用過程返回時,提供一張返回值表。
通常,調用在調用者的地址空間中執行,但是調用的語義並不侷限於這一點。實際上,在一個分佈式系統中這是不可能的,因爲調用的接收者物理上是與調用者分開的。更重要的在於對調用過程位置和環境的隱含返回連接的建立,它使得控制重新返回到調用者。調用過程位置在正文子過程中描述成正文,在狀態機中描述成狀態。調用環境可以建模成激活。
調用使用依賴關係建模一種情況,在這個情況中一個客戶類的操作(或操作本身)調用提供者類的操作(或操作本身)。它用《call》構造型表示。
表示法
在順序圖或合作圖上,調用表示成指向目標對象或類的文字消息。
調用依賴關係表示成從調用者指向調用類或操作的含有構造型《call》的虛線箭頭。 在編程語言中,大多數的調用可以表示成文本過程的一部分。
52.調用事件(call event)
調用事件是接收一個操作的調用,它在狀態機轉換上實現爲動作。
見調用(call),信號(signal)。
語義
調用事件是實現操作的一種方法,它是過程執行的另一種方式。如果一個類將一個操作的實現說明爲一個調用事件,那麼操作的調用將被看作觸發類的狀態機中轉換的一個事件。這允許實現比單一方法過程更加分散的操作。
如果一個類用調用事件去實現一個操作,那麼它的狀態機必須有由調用事件觸發的轉換。調用事件的特徵與操作的相同:它們的名字和參數都相同。
一個操作的調用發生時,引用目標對象的狀態機,如果調用事件符合一個活動轉換(不同於當前活動狀態)上的觸發事件,那麼它就觸發該轉換。如果轉換激發,就實現了實際效果。實際效果包括任何動作序列,包括return(value)動作,其目的是將值返回給調用者。
當轉換執行結束時,調用者重新獲得控制並且可以繼續執行。如果操作需要一個返回值而調用者沒有接收到,或接收到不符合聲明類型的返回值,說明模型有問題。如果操作不需要一個返回值,說明沒有問題。請注意,如果沒有轉換被調用事件觸發,則控制立即返回到調用者。如果操作需要一個返回值,說明模型有問題。否則,調用者僅僅立即繼續執行。
如果接收者是一個主動對象,那麼當接收者的狀態機是靜止的時候,即從運行到完成的所有步驟都已實現時,調用事件被處理。
表示法
調用事件表示成狀態圖中匹配對應類上操作的事件觸發。轉換上的動作序列可以有一個return聲明,如果是這樣的話,聲明表示返回值。
舉例
圖13-39表示了一個可以被鎖住(Locked) 和解鎖(Unlocked)的賬戶。Deposit操作總是向賬戶里加錢,而不管它的狀態。如果賬戶是打開的,那麼withdraw操作取走所有的錢;如果賬戶是鎖着的,則取不走錢。Withdraw操作被作爲一個調用事件實現,它觸發每個狀態的內部轉換。當調用發生時,根據活動狀態,執行一個或其他動作序列。如果系統是鎖住的,返回零;如果系統是打開的,賬戶中的所有錢返回並且重新計數爲零。
13-39.gif
圖13-39調用事件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章