java課件omt新04關(guān)系建模_第1頁
java課件omt新04關(guān)系建模_第2頁
java課件omt新04關(guān)系建模_第3頁
java課件omt新04關(guān)系建模_第4頁
java課件omt新04關(guān)系建模_第5頁
已閱讀5頁,還剩46頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第四章關(guān)系建模關(guān)聯(lián)泛化依賴關(guān)系建模方法設(shè)計原則關(guān)系概述關(guān)系:描述元素之間的關(guān)系;而關(guān)系本身也是元素。主要有三種關(guān)系:關(guān)聯(lián)association泛化generalization依賴dependence關(guān)聯(lián)概述關(guān)聯(lián)表示類間靜態(tài)的結(jié)構(gòu)關(guān)系。關(guān)聯(lián)是一種關(guān)系,同時也是一種類元。關(guān)聯(lián)的一個實例被稱為一個鏈(link),一個鏈是一個元組(tuple)。一個元組有兩個以上的值,每個端(end)對應(yīng)一個值,每個值都是關(guān)聯(lián)端類型的一個實例。元組的多個端的組合是不重復的。關(guān)聯(lián)確定了類型的實例之間的語義關(guān)系。一個關(guān)聯(lián)至少有兩個端,每個端連接到一個類型。一個關(guān)聯(lián)的多個端可連接到同一個類型上。在一個端上,如果一個實例存在的話,要求被關(guān)聯(lián)的另一端的零個或多個實例也必須存在。關(guān)聯(lián)是一種非定向的關(guān)系,盡管關(guān)聯(lián)可說明導向性。鏈與關(guān)聯(lián)關(guān)聯(lián)關(guān)系二元binary關(guān)聯(lián)、n元(n-ary)關(guān)聯(lián)語法:實線連接加說明命名:名稱及方向,區(qū)分多個關(guān)聯(lián)的性質(zhì)(關(guān)聯(lián)的角色)。角色role:關(guān)聯(lián)中的一方對于另一方的職責的識別和命名多重性multiplicity:對象之間定量的結(jié)構(gòu)關(guān)系。關(guān)聯(lián)的多重性傳統(tǒng)的多重性有3種形式:“1對1”、“1對多”、“多對多”。其中,“多對多”包含了“1對多”作為其特殊情形,而“1對多”包含了“1對1”作為特例。關(guān)聯(lián)端的多重性可缺省,缺省情況下為“*”,即0個到多個,而且是不重復的。用術(shù)語可表示為一個Set集合。如何確定一個關(guān)聯(lián)的多重性?對于二元關(guān)聯(lián)<A,B>來說,先確定一端類元A的任意一個實例,然后斷定所關(guān)聯(lián)的另一端B可能有多少實例,表示為B端的多重性。盡可能確切描述,避免“多”的情形。多重性聚集(1)關(guān)聯(lián)種類有3種:非聚集:無菱形共享聚集:空心菱形,各部分對象的生命期獨立于整體復合聚集:實心菱形,各部分對象的生命期受限于整體聚集aggregation:一種特殊的關(guān)聯(lián),表示部分和整體關(guān)系,即has-a或has-many關(guān)系復合composite:整體對象負責其各部分對象的生存和存儲區(qū)分兩種聚集形式聚集(2)復合composite:一種“強”聚集aggregation形式,區(qū)分復合對象和部分對象;一個部分對象在特定時刻只能被包含在一個復合對象中;且該復合對象“獨占”各部分。當整體對象撤銷時,其各部分對象也撤銷。有三種不同方式來表示復合關(guān)系。關(guān)聯(lián)與性質(zhì)關(guān)聯(lián)導向性從一端能方便到達另一端可導向不可導向非確定自關(guān)聯(lián)關(guān)聯(lián)類(1)一個關(guān)聯(lián)類(AssociationClass)是表示關(guān)聯(lián)的一個類,它不僅連接一組類元,而且可定義關(guān)聯(lián)自身的一組性質(zhì)和操作。表示一個關(guān)聯(lián)類:將該類與關(guān)聯(lián)用虛線連接,而且使類名與關(guān)聯(lián)的名字相同。關(guān)聯(lián)類(2)把一個“多對多”關(guān)聯(lián)類轉(zhuǎn)換為一個普通類。兩者語義大致相同,但并不完全相同。關(guān)聯(lián)類的本質(zhì)仍是二元組,有這樣一個限制作用,同一個人加入同一個團體只能有1次,所以加入時間只能有1個值。而后者則沒有這樣的限制,同一個人可多次加入同一個團體,這導致可能有多個不同的加入時間。限定關(guān)聯(lián)一個限定符包含了一個或多個屬性,限定符的一個實例包含每個屬性的一個值,稱為限定符實例。給定一個對象(如一個Consortium對象)和一個限定符實例(一個SeqNo),在關(guān)聯(lián)的另一端的對象數(shù)量就受到限制(如Person),其多重性通常為“0..1”。多元關(guān)聯(lián)3元關(guān)聯(lián)和一個關(guān)聯(lián)類三元關(guān)聯(lián)的一個實例是一個三元組。多重性如何確定?限定兩方都唯一時,檢查第三方關(guān)聯(lián)端的修飾符{subsets<性質(zhì)名>}說明該端是指定性質(zhì)的一個子集。{redefines<端名>}說明該端是指定端的重定義/<端名>說明該端是一個派生的關(guān)聯(lián)端,往往與{union}相關(guān)。{union}說明該端是其多個子集合構(gòu)成的一個派生并集。{ordered}該端的多個元素是一個有序集合。{bag}該端表示一個集聚,其中同一個元素可出現(xiàn)多次。{sequence}或{seq}該端表示一個序列,即一個有序的bag。缺省情況下一個關(guān)聯(lián)端的集聚類型是一個集合{set}。泛化概述較一般的元素(超類)和較特殊的元素(子類)之間的關(guān)系。語法:實線空心箭頭從子類到超類語義:子類is-a-kind-of超類。子類對象可替代超類對象;子類繼承超類特征且可增加新特征;子類操作的基調(diào)與超類相同時,子類可改寫(override)超類的實現(xiàn)。根類/基類----葉子類單繼承---多繼承泛化的反義詞是特化specialization泛化的表示特征的繼承與擴展泛化的用途概念表述:要表述一個概念,往往要用“是一種什么”來說明。

特征重用:子類的對象繼承其超類的性質(zhì)和操作,但子類并不重復描述這些特征。子類中僅描述擴展的新特征,而超類中的特征能被其所有子類共享和重用。

抽象設(shè)計:基于泛化關(guān)系的多態(tài)性是抽象設(shè)計的基礎(chǔ)。抽象設(shè)計與具體設(shè)計對立,在高層的抽象的級別上建立行為特征和行為規(guī)范,為低層的具體的設(shè)計提供一個統(tǒng)一的框架。主要是兩方面的多態(tài)性:引用類型的多態(tài)性和操作調(diào)用的多態(tài)性。關(guān)系環(huán)在兩個類之間是否可同時存在泛化和關(guān)聯(lián)兩種關(guān)系?關(guān)系環(huán)的例子泛化集一個泛化集包含一組泛化關(guān)系,針對同一個一般性類元,提供了一種分類方式,得到了一組子類型劃分泛化集的屬性一個泛化集有兩個重要屬性:isDisjoint和isCoveringoverlapping&disjoint:相交&不相交,缺省相交plete&complete;不完全&完全,缺省不完全泛化集的例子單繼承和多繼承如果一個子類只有一個直接的超類,這就是一個單繼承。反之,如果一個子類具有多個直接的超類,就是一個多繼承,也稱為多重繼承。C++語言允許類之間有多重繼承,即一個子類可有多個直接的超類。Java語言不允許類的多重繼承,但支持接口的多重繼承。UML支持類的多重繼承。如何將多繼承轉(zhuǎn)變?yōu)閱卫^承?依賴概述兩個命名元素之間的一種定向關(guān)系;一個是依賴元素作為client,另一個是獨立元素作為supplier;依賴元素取決于獨立元素的規(guī)范或?qū)崿F(xiàn);若獨立元素改變,則依賴元素也需隨之改變使用一種常見的依賴關(guān)系,表示client元素為其完整的實現(xiàn)或操作而需要supplier元素提供部分實現(xiàn)或操作。最常見的形式是類A的某個操作的形參類型是類B,那么A依賴B。使用關(guān)系通常采用構(gòu)造型?use?來表示使用的標準構(gòu)造型?call?表示一個操作調(diào)用另一個操作。在表示時,這種關(guān)系往往擴大到包含操作的類:一個“源”操作調(diào)用一個“目標”操作,表示為一個“源”類中的一個操作調(diào)用了“目標”類中的某個操作。?create?說明client類元創(chuàng)建supplier類元的實例。?instantiate?說明在client中的某個操作創(chuàng)建supplier類元的實例。?responsibility?說明一個元素對其他元素提供某種約定或義務(wù)。?send?表示一個源操作發(fā)送一個信號,源是一個操作,目標是一個信號。實現(xiàn)概述一種特殊的抽象關(guān)系,supplier端是一組建模元素作為規(guī)范,而client端表示規(guī)范的一種實現(xiàn)。實現(xiàn)主要用于對逐步細化、優(yōu)化、轉(zhuǎn)換、模板、模型合成、框架復合等進行建模。注意,實現(xiàn)的含義并沒有嚴格定義,而只是隱含著某建模語境更細化或更詳細的描述。如何表示實現(xiàn)關(guān)系?一般不用構(gòu)造型,而采用虛線和三角箭頭,從實現(xiàn)元素指向被實現(xiàn)的規(guī)范元素。類型類和實現(xiàn)類UML模型中,被實現(xiàn)的規(guī)范不一定都是接口,一個類也可描述規(guī)范。?type?類被稱為“類型類”,指定某一領(lǐng)域的一組對象,也包括作用于這些對象上的一組操作,也可定義屬性和關(guān)聯(lián),但未定義這些對象的物理實現(xiàn)。?implementationClass?類被稱為“實現(xiàn)類”,以某種編程語言實現(xiàn),如C++、Java。對于一個類元(一般是類型類),如果一個實現(xiàn)類提供了該類元定義的所有操作,而且具有類元操作所規(guī)范的相同行為,該類就實現(xiàn)了這個類元。一個實現(xiàn)類可實現(xiàn)多個不同的類型。類型類與實現(xiàn)類對依賴的討論假設(shè)類A是類B的泛化,兩者之間是否可能還有依賴關(guān)系?假設(shè)類A與類B之間存在關(guān)聯(lián)關(guān)系,兩者之間是否可能還有依賴關(guān)系?關(guān)系建模方法確定泛化關(guān)系最重要,因為它是建立概念的基礎(chǔ)。區(qū)分泛化和特化的不同目的。泛化的目的是提取抽象,自下而上建立一般性的概念;特化的目的是具體化,自上而下建立特殊性的概念。對泛化建模在一組類中,分析兩個和兩個以上的類的共同職責、性質(zhì)和操作;抽象為一個更一般的類,并確定泛化關(guān)系;確定一般類的性質(zhì)和操作。對于特化關(guān)系,一般按照以下步驟進行分析和建模:在已有的一組類中尋找最具體的一個類作為其一般類;建立該類的一個子類;確定子類特有的性質(zhì)和操作;確定需要重定義的性質(zhì)和操作。對關(guān)聯(lián)建模數(shù)據(jù)驅(qū)動:如果兩個類的對象之間有導航,則建立關(guān)聯(lián)。行為驅(qū)動:如果一個類需要與其它類交互,而且這種關(guān)系在交互之前就存在,則建立關(guān)聯(lián)。說明關(guān)聯(lián)的名字、關(guān)聯(lián)端的角色名字、以及多重性。若關(guān)聯(lián)的一端有明顯的整體結(jié)構(gòu),而另一端是其組成部分,則建立聚集關(guān)系。進一步確定關(guān)聯(lián)端的導向性、關(guān)聯(lián)類、限定符,以及其他修飾符。對依賴建模類A中的某操作有一個形參類型為類B,那么A依賴B。注意:依賴和泛化都是有方向的,而關(guān)聯(lián)不同。關(guān)系建模提示僅當被建模的關(guān)系不是關(guān)聯(lián)或泛化關(guān)系時,才考慮依賴關(guān)系。僅當表示“is-a-kind-of”或者“isa”關(guān)系時,才使用泛化關(guān)系。如果兩個類之間已存在泛化或關(guān)聯(lián)關(guān)系,隱含著存在依賴關(guān)系,而且不需要表示。避免可能的多重繼承,一般可用聚集來替代避免泛化的循環(huán)。因為泛化關(guān)系是有向無環(huán)圖。描述對象間的結(jié)構(gòu)關(guān)系應(yīng)以關(guān)聯(lián)為主。不良設(shè)計的7種現(xiàn)象僵硬:很難加入新功能,新加入的模塊會波及其他,而且范圍越來越大,最后不得不放棄。脆弱:與僵硬共存,修改某個地方卻導致不相關(guān)的其他地方發(fā)生故障,而且難以預料。低復用:發(fā)現(xiàn)某個模塊希望能被復用,進一步卻發(fā)現(xiàn)要依賴一大堆沒用的或不明確的東西,以至于很難把可復用部分隔離開來,最后還得放棄復用。高粘度:對設(shè)計的更改違背了原始設(shè)計的意圖和框架,僅考慮眼前利益,只做權(quán)宜之計,缺乏長遠打算,最終導致設(shè)計方案難以經(jīng)受長久考驗而失敗。無端復雜性:即過度設(shè)計。設(shè)計人員試圖預測將來可能的變化,從而設(shè)計了過多的當前無用的元素,這些偶然性的元素卻導致不必要的復雜性,使軟件難以維護。無端復制:團隊中多人出于自己的目的復制了相同的代碼,而后各自修改一部分,使大量代碼重復但略有差別,當在一個地方發(fā)現(xiàn)bug而其它地方也存在相同bug時,卻難以集中修復?;逎杭措y以理解,不能明確表達其意圖。開始的設(shè)計往往清晰易懂,但隨著工程進行,不斷添加新功能,越來越難以理解,使軟件難以維護。面向?qū)ο笤O(shè)計的5個原則SOLIDSRP:TheSingleResponsibilityPrinciple,單一職責原則。一個類應(yīng)僅有一個改變的理由。OCP:TheOpen/ClosedPrinciple,開閉原則。不應(yīng)修改已有的類,而應(yīng)擴展一個類。LSP:TheLiskovSubstitutionPrinciple,里氏替換原則。子類對象能隨時隨地替換其超類。ISP:TheInterfaceSegregationPrinciple,接口分離原則。一個客戶程序只需關(guān)注自己所需要的接口。DIP:TheDependencyInversionPrinciple,依賴倒置原則。依賴抽象而不依賴細節(jié)。單一職責原則SRP“一個設(shè)計元素只做一件事”。當你要改變一個類時,只能有一個理由開/閉原則OCP“模塊應(yīng)對擴展開放,對更改關(guān)閉”“對擴展開放”。這意味著模塊的行為可擴展。當需求改變時,我們可對模塊進行擴展,使其具有滿足那些改變的新行為,使軟件具有適應(yīng)性和靈活性?!皩Ω年P(guān)閉”。對模塊行為進行擴展時,不應(yīng)改動已有模塊,使軟件具有一定的穩(wěn)定性和延續(xù)性。總之,當我們需要擴展新功能時,應(yīng)編寫新的代碼,而不應(yīng)更改已有的代碼。開/閉原則OCP(2)對于OCP原則,抽象是關(guān)鍵。對可變性進行封裝的原則(PrincipleofEncapsulationofVariation,簡稱EVP)。其核心思想是“找到系統(tǒng)中的可變因素,將其封裝起來”。EVP有兩個要點:一種可變性不應(yīng)散落在代碼的很多角落,而應(yīng)封裝到一個對象中。一種可變性與另一種可變性不能混雜在一起。里氏替換原則LSPLSP專門針對泛化關(guān)系設(shè)計的合理性?!芭缮愅ㄟ^其基類的接口必須可用,而用戶無需知其差別”。子類型的對象必須能隨時隨地替換其基類型接口分離原則ISP為客戶程序提供盡可能“小”的單獨的接口。依賴倒置原則DIP細節(jié)應(yīng)依賴抽象,而抽象不應(yīng)依賴細節(jié)小結(jié)(1)關(guān)系建模是結(jié)構(gòu)建模中的難點和重點。UML模型中的基本關(guān)系包括關(guān)聯(lián)、泛化和依賴。一個關(guān)聯(lián)是一組鏈(link)的抽象,每一個鏈都是一個二元組或多元組,其中每一個值都是特定類型的一個實例。關(guān)聯(lián)的命名表示了作為類元的抽象,關(guān)聯(lián)端的名字表示了關(guān)聯(lián)中各端所扮演的不同角色。關(guān)聯(lián)的多重性表示了對關(guān)聯(lián)端的定量約束。聚集是表示整體和部分概念

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論