軟件需求分析與設(shè)計(jì)- GR:基于職責(zé)的設(shè)計(jì)_第1頁(yè)
軟件需求分析與設(shè)計(jì)- GR:基于職責(zé)的設(shè)計(jì)_第2頁(yè)
軟件需求分析與設(shè)計(jì)- GR:基于職責(zé)的設(shè)計(jì)_第3頁(yè)
軟件需求分析與設(shè)計(jì)- GR:基于職責(zé)的設(shè)計(jì)_第4頁(yè)
軟件需求分析與設(shè)計(jì)- GR:基于職責(zé)的設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩76頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、軟件需求分析與設(shè)計(jì) GRASP:基于職責(zé)的設(shè)計(jì)軟件分析與設(shè)計(jì)GRASP:基于職責(zé)的設(shè)計(jì)主要內(nèi)容學(xué)習(xí)5個(gè)GRASP原那么或模式創(chuàng)立者信息專家低耦合控制器高內(nèi)聚9/22/20222軟件分析與設(shè)計(jì)對(duì)象設(shè)計(jì)起始場(chǎng)景第一個(gè)為期兩天的需求討論會(huì)已經(jīng)完成總架構(gòu)師和業(yè)務(wù)人員已同意在第一個(gè)為期三周的時(shí)間定量迭代中實(shí)現(xiàn)和測(cè)試某些處理銷售用例的場(chǎng)景已經(jīng)詳細(xì)分析了架構(gòu)上最重要的業(yè)務(wù)價(jià)值最高的20個(gè)用例中的3個(gè)用例,其中包括處理銷售用例其他制品已經(jīng)啟動(dòng),包括補(bǔ)充規(guī)格說明,術(shù)語(yǔ)表和領(lǐng)域模型編程實(shí)驗(yàn)已經(jīng)解決“演示阻塞”的技術(shù)問題,如在觸摸屏上Java Swing UI是否起作用總架構(gòu)師已經(jīng)利用UML包圖提出了大型邏輯架構(gòu)的

2、構(gòu)想9/22/20223軟件分析與設(shè)計(jì)輸入場(chǎng)景與對(duì)象設(shè)計(jì)關(guān)系用例文本定義最終必須得到軟件對(duì)象的支持的可視行為。在UP中,這種OO設(shè)計(jì)也被順利成章地成為用例實(shí)現(xiàn)補(bǔ)充規(guī)格說明定義了非功能性的目標(biāo),例如國(guó)際化,我們的對(duì)象必須滿足這些目標(biāo)系統(tǒng)順序圖確定系統(tǒng)操作消息,它是合作對(duì)象交互圖中的開始消息詞匯表明確來自UI層的參數(shù)或數(shù)據(jù)、傳遞到數(shù)據(jù)庫(kù)的數(shù)據(jù)的細(xì)節(jié),以及詳細(xì)的特定項(xiàng)邏輯或驗(yàn)證需求,如合法的格式和對(duì)產(chǎn)品UPC(通用產(chǎn)品代碼的)的有效性驗(yàn)證操作契約用來補(bǔ)充用例文本,以明確在系統(tǒng)操作中軟件對(duì)象必須完成什么任務(wù)。后置條件定義了系統(tǒng)操作的詳細(xì)結(jié)果領(lǐng)域模型描述了軟件架構(gòu)的領(lǐng)域?qū)榆浖I(lǐng)域?qū)ο蟮拿Q和屬性9/22

3、/20224軟件需求分析與設(shè)計(jì)對(duì)象設(shè)計(jì)輸出在開始編碼之前針對(duì)設(shè)計(jì)中的難點(diǎn)創(chuàng)立UML交互圖,類圖和包圖UI的草圖和原型數(shù)據(jù)庫(kù)模型報(bào)表的草圖和原型9/22/20225制品關(guān)系Operation: enterItem()Post-conditions:- . . .Operation ContractsSaledate. . .SalesLineItemquantity1.*1. . . . .Domain ModelUse-Case ModelDesign Model: RegisterenterItem(itemID, quantity): ProductCatalogd = getProduc

4、tDescription(itemID)addLineItem( d, quantity ): SaleRequire-mentsBusiness ModelingDesignSample UP Artifact Relationships: SystementerItem(id, quantity)Use Case TextSystem Sequence DiagramsmakeNewSale()system eventsCashierProcess Sale: Cashieruse case namessystem operationsUse Case DiagramSupplementa

5、rySpecificationGlossarystarting events to design for, and detailed post-condition to satisfyProcess Sale1. Customer arrives .2. .3. Cashier enters item identifier.inspiration for names of some software domain objectsfunctional requirements that must be realized by the objectsideas for the post-condi

6、tionsRegister.makeNewSale()enterItem(.).ProductCatalog.getProductDescription(.).1*non-functional requirementsdomain rulesitem details, formats, validation9/22/20226軟件分析與設(shè)計(jì)職責(zé)驅(qū)動(dòng)方式把軟件對(duì)象想象成為具有某種職責(zé)的人,它要與其他協(xié)作以完成職責(zé)職責(zé)定義為“類元的契約和責(zé)任行為職責(zé)自身執(zhí)行一些行為,如創(chuàng)立對(duì)象或計(jì)算初始化其他對(duì)象中的動(dòng)作控制和協(xié)調(diào)其他對(duì)象中的活動(dòng)認(rèn)知職責(zé)對(duì)私有封裝數(shù)據(jù)的認(rèn)識(shí)對(duì)相關(guān)對(duì)象的認(rèn)知對(duì)其能夠?qū)С龌蛴?jì)算的事物

7、的認(rèn)知對(duì)于軟件領(lǐng)域?qū)ο髞碚f,由于領(lǐng)域模型描述了領(lǐng)域?qū)ο蟮膶傩院完P(guān)聯(lián),因此其通常產(chǎn)生與認(rèn)知“相關(guān)的職責(zé)9/22/20227職責(zé)與方法是相關(guān)的當(dāng)我們?cè)诶L制UML交互圖時(shí),就是決定職責(zé)的分配: SalemakePayment(cashTendered): Paymentcreate(cashTendered)abstract, implies Sale objects have a responsibility to create Payments9/22/20228軟件分析與設(shè)計(jì)GRASPGRASP通用職責(zé)分配軟件模式General Responsibility Assignment Softwa

8、re Pattern創(chuàng)立者Creator控制器Cotroller純虛構(gòu)Pure Fabrication信息專家Information Expert高內(nèi)聚High Cohesion間接性Indirection低耦合Low Coupling多態(tài)性Polymorphism防止變異Protected Variations9/22/20229軟件分析與設(shè)計(jì)什么是模式模式是對(duì)問題和解決方案的已命名描述,它可以用于新的語(yǔ)境模式為在變化環(huán)境中如何運(yùn)用和權(quán)衡其解決方案給出建議好的模式是成對(duì)的問題/解決方案,并且具有廣為人知的名稱模式名稱信息專家問題給對(duì)象分配職責(zé)的原則是什么解決方案給類分配一種職責(zé),使其具有完成

9、該職責(zé)所需要的信息9/22/202210設(shè)計(jì)模式創(chuàng)立者名稱創(chuàng)建者(Creator)問題誰(shuí)創(chuàng)建了A解決了方案如果下列條件之一為真時(shí)(越多越好),將創(chuàng)建類A實(shí)例的職責(zé)分配給類B:B”包含”或組成聚集了AB記錄AB緊密地使用AB具有A的初始化數(shù)據(jù),并且在創(chuàng)建A時(shí)會(huì)將這些數(shù)據(jù)傳遞A,對(duì)A的創(chuàng)建而言,B是專家如果有一個(gè)一上的選項(xiàng)適用,通常首選聚集或者包含A的類B9/22/202211局部領(lǐng)域模型SaletimeSalesLineItemquantityProductDescriptiondescriptionpriceitemIDDescribed-by*Contains1.*119/22/202212

10、創(chuàng)立SalesLineItem: Register: SalemakeLineItem(quantity): SalesLineItemcreate(quantity)9/22/202213設(shè)計(jì)模式創(chuàng)立者討論創(chuàng)立者模式指導(dǎo)我們分配那些與創(chuàng)立對(duì)象有關(guān)的職責(zé)組合聚集局部,容器容納內(nèi)容,記錄者進(jìn)行記錄,所有這些都是類圖中之間極為常見的關(guān)系組合對(duì)象是創(chuàng)立其組成局部的良好候選者禁忌對(duì)象的創(chuàng)立常常具有復(fù)雜性,最好的方法可能是把創(chuàng)立職責(zé)委派給成為具體工廠或抽象工廠的輔助類9/22/202214設(shè)計(jì)模式創(chuàng)立者優(yōu)點(diǎn)支持低耦合相關(guān)模式低耦合具體工廠和抽象工廠整體局部9/22/202215設(shè)計(jì)模式信息專家名稱信息專

11、家(Information Expert)問題給對(duì)象分配職責(zé)基本原則是什么解決了方案把職責(zé)分配給具有完成該職責(zé)所需信息的那個(gè)類9/22/202216Sale的關(guān)聯(lián)SaletimeSalesLineItemquantityProductDescriptiondescriptionpriceitemIDDescribed-by*Contains1.*119/22/202217局部交互圖和類圖Saletime.getTotal():Salet = getTotalNew method9/22/202218計(jì)算Sale的總額Saletime.getTotal()SalesLineItemquantit

12、ygetSubtotal()New method1 *: st = getSubtotal: Salet = getTotallineItems i : SalesLineItemthis notation will imply we are iterating over all elements of a collection9/22/202219計(jì)算Sale的總額Saletime.getTotal()SalesLineItemquantitygetSubtotal()ProductDescriptiondescriptionpriceitemIDgetPrice()New method:P

13、roductDescription1.1: p := getPrice() 1 *: st = getSubtotal: Salet = getTotallineItems i :SalesLineItem9/22/202220知道銷售總額的職責(zé)設(shè)計(jì)類職責(zé)Sale知道銷售的總額SalesLineItem知道商品的小計(jì)ProductionDescription知道產(chǎn)品的價(jià)格9/22/202221設(shè)計(jì)模式專家模式討論信息專家經(jīng)常用于職責(zé)分配,這是對(duì)象設(shè)計(jì)中不斷使用的根本指導(dǎo)原那么完成職責(zé)往往需要分布在不同對(duì)象類的信息專家模式通常導(dǎo)致這樣一種設(shè)計(jì),軟件對(duì)象所做的操作通常作用于他們真實(shí)世界中所代表的非

14、生命體的那些操作信息專家模式是對(duì)真實(shí)世界的模擬禁忌誰(shuí)應(yīng)當(dāng)負(fù)責(zé)把Sale存入數(shù)據(jù)庫(kù)呢?支持主要的關(guān)注別離可以改變?cè)O(shè)計(jì)中的耦合和內(nèi)聚9/22/202222設(shè)計(jì)模式專家模式優(yōu)點(diǎn)信息的封裝得以維持,支持低耦合,進(jìn)而形成更為健壯的、可維護(hù)的系統(tǒng)行為分布在那些具有所需信息的類之間,因此提倡定義內(nèi)聚性更強(qiáng)的“輕量級(jí)的類相關(guān)模式低耦合高內(nèi)聚9/22/202223設(shè)計(jì)模式低耦合名稱低耦合(Low Coupling)問題怎樣降低依賴性,減少因變化而帶來的影響,提高重用性解決方案分配職責(zé)以使(不必要的)耦合保持在較低的水平。用該原則對(duì)可選方案進(jìn)行評(píng)估耦合是對(duì)某元素與其他元素之間的連接,感知和依賴程度的度量。具有低耦

15、合的元素不會(huì)過多的依賴于其他的元素9/22/202224Register創(chuàng)立Payment: Registerp : Payment:SalemakePayment() 1: create() 2: addPayment(p) 9/22/202225Sale創(chuàng)立Payment: Register:Sale:PaymentmakePayment() 1: makePayment() 1.1. create() 9/22/202226設(shè)計(jì)模式低耦合討論低耦合是設(shè)計(jì)中必須牢記的原那么耦合類型TypeX具有應(yīng)用TypeY的實(shí)例或TypeX自身的屬性TypeX對(duì)象調(diào)用TypeY對(duì)象的效勞TypeX具有以

16、任何形式引用TypeY的實(shí)例或TypeX自身的方法TypeX是TypeY的直接或間接子類TypeY是接口,而TypeX是此接口的實(shí)現(xiàn)9/22/202227設(shè)計(jì)模式低耦合討論低耦合提倡職責(zé)分配要防止產(chǎn)生具有負(fù)面影響的高耦合低耦合不能脫離專家和高內(nèi)聚等其他模式孤立的考慮,而應(yīng)作為影響職責(zé)分配的設(shè)計(jì)原那么之一子類和超類之間有很強(qiáng)的耦合性對(duì)象之間的適度耦合對(duì)于創(chuàng)立面向?qū)ο笙到y(tǒng)來說是正常和必要的應(yīng)該在降低耦合和封裝事物之間進(jìn)行選擇9/22/202228設(shè)計(jì)模式低耦合禁忌高耦合對(duì)于穩(wěn)定和普遍使用的元素而言并不是問題J2ee于Java類庫(kù)優(yōu)點(diǎn)不受其他構(gòu)件變化的影響易于單獨(dú)理解便于復(fù)用相關(guān)模式防止變異9/22

17、/202229專家支持低耦合信息專家的動(dòng)機(jī)該原那么可以指導(dǎo)我們作出支持低耦合的選擇。專家讓我們尋找這樣的對(duì)象,該對(duì)象具有職責(zé)所需的大局部信息,并把職責(zé)分配給該對(duì)象如果把職責(zé)分配到其他地方,總體耦合會(huì)比較高,存在更多的信息或?qū)ο蟊仨毐荒承┦挛锼蚕?/22/202230設(shè)計(jì)模式控制器名稱控制器(Controller)問題在UI層之上首先接收和協(xié)調(diào)(“控制”)系統(tǒng)操作的對(duì)象是什么解決方案把責(zé)任分配給能代表下列選擇之一的對(duì)象:代表全部“系統(tǒng)”、”根對(duì)象”、運(yùn)行軟件的設(shè)備或主要的子系統(tǒng),這些是外觀控制器的所有變體代表用例場(chǎng)景,在該場(chǎng)景中發(fā)生系統(tǒng)事件對(duì)于同一用例的所有場(chǎng)景使用相同的控制器類會(huì)話是參與者進(jìn)

18、行交談的實(shí)例控制器是UI層上的第一個(gè)對(duì)象,它負(fù)責(zé)接收和處理系統(tǒng)操作消息9/22/202231NextGen應(yīng)用中的假設(shè)干系統(tǒng)操作SystemendSale()enterItem()makeNewSale()makePayment(). . .9/22/202232哪個(gè)對(duì)象應(yīng)該是enterItem的控制器Which class of object should be responsible for receiving this system event message?It is sometimes called the controller or coordinator. It does no

19、t normally do the work, but delegates it to other objects.The controller is a kind of facade onto the domain layer from the interface layer.actionPerformed( actionEvent ): ?: Cashier:SaleJFramepresses buttonenterItem(itemID, qty)UI LayerDomain Layersystem operation message9/22/202233控制器的選擇代表整個(gè)“系統(tǒng)、“根

20、對(duì)象、裝置或子系統(tǒng)Register, POSSytem代表用例場(chǎng)景中所有系統(tǒng)事件的接收者或處理者ProcessSaleHandler, ProcessSaleSession:RegisterenterItem(id, quantity) :ProcessSaleHandlerenterItem(id, quantity) 9/22/202234系統(tǒng)操作的分配Register.endSale()enterItem()makeNewSale()makePayment()makeNewReturn()enterReturnItem(). . .SystemendSale()enterItem()ma

21、keNewSale()makePayment()makeNewReturn()enterReturnItem(). . .system operations discovered during system behavior analysisallocation of system operations during design, using one facade controllerProcessSaleHandler.endSale()enterItem()makeNewSale()makePayment()SystemendSale()enterItem()makeNewSale()m

22、akePayment()enterReturnItem()makeNewReturn(). . .allocation of system operations during design, using several use case controllersHandleReturnsHandler.enterReturnItem()makeNewReturn(). . .9/22/202235設(shè)計(jì)模式控制器UI層不應(yīng)當(dāng)包含邏輯、所以UI層對(duì)象必須把工作請(qǐng)求委派給其他層系統(tǒng)外部輸入事件,通常涉及人工操作,必須為這些事件選擇一個(gè)處理者正常情況下,控制器應(yīng)當(dāng)把需要完成的工作委派給其他的對(duì)象??刂破?/p>

23、只是協(xié)調(diào)或控制這些活動(dòng),本身并不完成大量工作第一類控制器表示整個(gè)系統(tǒng)、裝置和子系統(tǒng)的外觀控制器如果您選擇用例控制器,那么對(duì)于每一個(gè)用例,應(yīng)該使用不同的控制器當(dāng)把職責(zé)分配給外觀控制器會(huì)導(dǎo)致內(nèi)聚或高耦合的設(shè)計(jì)時(shí),通常是當(dāng)外觀控制器的職責(zé)過多而變的“臃腫時(shí),就需要考慮使用用例控制器UI對(duì)象和UI 層不應(yīng)具有實(shí)現(xiàn)系統(tǒng)事件的職責(zé)9/22/202236控制器在Web UI和效勞器端的應(yīng)用GRASP控制器是領(lǐng)域模層的一局部,它控制或協(xié)調(diào)工作請(qǐng)求的處理,根本不知道所用的UI技術(shù)可以用控制器模式在純領(lǐng)域模型選擇適宜的接收者對(duì)效勞器端系統(tǒng)操作的適當(dāng)處理在很大程度上受所選擇的效勞器技術(shù)與架構(gòu)的影響對(duì)于與效勞器交互的

24、富客戶端UI控制器模式仍然使用客戶端把請(qǐng)求轉(zhuǎn)發(fā)給本地的客戶端控制器,控制器將全部或局部請(qǐng)求處理發(fā)送到遠(yuǎn)程的效勞器優(yōu)點(diǎn)增加了可復(fù)用和接口的可插拔的潛力獲得了推測(cè)用例狀態(tài)時(shí)機(jī)9/22/202237使用Java Swing的實(shí)現(xiàn):富客戶端UIPackage public class ProcessSaleJframe extends private Register register; public ProcessSaleJFrame(Register _register)register = _register;private JButton BTN_ENTER_ITEM;private JBut

25、ton getBTN_ENTER_ITEM()if(BTN_ENTER_ITEM !=null)retuen BTN_ENTER_ITEM; BTN_ENTER_ITEM = new JButton();BTN_ENTER_ITEM.setText(“Enter Item);9/22/202238使用Java Swing的實(shí)現(xiàn):富客戶端UIBTN_ENTER_ITEM.addactionLister(new ActionListener()public void actionPerformed(ActionEvent e)ItemID id = Transformer.toItemID(get

26、Txt_ID().getText();int qty = Transformer.toInt(getTXT_QTY().getText();register.enterItem(id,qty););return BTN_ENTER_ITEM;9/22/202239使用Java Struts實(shí)現(xiàn):客戶端瀏覽器和WebUIpackage ;public class enterItemAction extern Actionpublic ActionFormward excute(ActionMapping mapping, Actionform form, HttpServletRequest r

27、equest, HttpServletResponse response) throw ExceptionRepository repository = (Repository )getServlet().getServletContext().getAttribute(Constats.REPOSITORY_KEY);Register register = repository.getRegister();String txtID = (SaleForm)form).getItemID();String txtQty = (SaleForm)form).getQuantity();ItemI

28、D id = Transformer.toItemID(txtId);int qty = Tansformer.toInt(txtQty);register.enterItem(id,qty); 9/22/202240臃腫的控制器問題設(shè)計(jì)不良的控制器類內(nèi)聚性低,即沒有重點(diǎn),并且要處理過多領(lǐng)域的職責(zé),成為臃腫控制器只有一個(gè)控制器來接收系統(tǒng)中的全部的系統(tǒng)事件,而且有很多系統(tǒng)事件為了處理系統(tǒng)事件,由控制器完成諸多必要的任務(wù),而不是把工作委派出去控制器有許多屬性,并且它維護(hù)關(guān)于系統(tǒng)或領(lǐng)域的重要信息9/22/202241解決臃腫的控制器方法增加控制器,系統(tǒng)不是只有一個(gè)控制器,應(yīng)使用用例控制器,而不是外觀

29、控制器MakeReservationHandlerManageSchedulesHandlerManageFareHandler設(shè)計(jì)控制器,使它把完成每個(gè)系統(tǒng)操作的職責(zé)委派給其他對(duì)象 9/22/202242UI層到領(lǐng)域?qū)又g所期望的耦合actionPerformed( actionEvent ):Register: Cashier:SaleJFramepresses button1: enterItem(itemID, qty):Sale1.1: makeLineItem(itemID, qty)UI LayerDomain Layersystem operation messagecontr

30、oller9/22/202243接口層到領(lǐng)域?qū)铀黄谕鸟詈螩ashier:SaleJFrameactionPerformed( actionEvent ):Sale1: makeLineItem(itemID, qty)UI LayerDomain LayerIt is undesirable for an interfacelayer object such as a window to get involved in deciding how to handle domain processes.Business logic is embedded in the presentation

31、 layer, which is not useful.SaleJFrame should not send this message.presses button9/22/202244設(shè)計(jì)模式控制器相關(guān)模式命令Command在消息處理系統(tǒng)中,可以用命令對(duì)象來表示和處理每個(gè)消息外觀faade)-外觀控制器是一種外觀層Layer把領(lǐng)域邏輯置于領(lǐng)域?qū)佣皇潜硎緦蛹兲摌?gòu)Pure Fabrication軟件類是由設(shè)計(jì)者任意創(chuàng)立的,而不是源于領(lǐng)域模型9/22/202245比照不同設(shè)計(jì)的內(nèi)聚程度內(nèi)聚是軟件設(shè)計(jì)中的一種根本品質(zhì),內(nèi)聚可以非正式地用于度量軟件元素操作在功能上的相關(guān)程度所有的交互都會(huì)產(chǎn)生不良高耦

32、合。不良內(nèi)聚和不良耦合通常是齊頭并進(jìn)的,左側(cè)方案比右側(cè)方案的內(nèi)聚性較差高內(nèi)聚9/22/202246設(shè)計(jì)模式高內(nèi)聚名稱高內(nèi)聚(High Cohesion)問題怎樣使對(duì)象保持內(nèi)聚,可理解和可管理,同時(shí)具有支持低耦合的附加作用解決方案職責(zé)分配應(yīng)保持高內(nèi)聚,以此來評(píng)估備選方案內(nèi)聚性較低的類要做許多互不相關(guān)的工作或需要完成大量的工作,導(dǎo)致的問題難以理解難以復(fù)用難以維護(hù)脆弱,經(jīng)常會(huì)受到變化的影響9/22/202247Register創(chuàng)立Payment: Register: SaleaddPayment( p )p : Paymentcreate()makePayment()9/22/202248Sale創(chuàng)

33、立Payment: Register: SalemakePayment() : Paymentcreate()makePayment()9/22/202249設(shè)計(jì)模式高內(nèi)聚在實(shí)踐中,內(nèi)聚程度不能脫離其他職責(zé)及其他原那么單獨(dú)地考慮內(nèi)聚程度的場(chǎng)景非常低內(nèi)聚,由一個(gè)類單獨(dú)負(fù)責(zé)完成不同的功能領(lǐng)域中的大量事物低內(nèi)聚,由一個(gè)類單獨(dú)負(fù)責(zé)一個(gè)功能性領(lǐng)域內(nèi)的復(fù)雜任務(wù)高內(nèi)聚,由一個(gè)類負(fù)責(zé)某個(gè)功能領(lǐng)域中的相應(yīng)職責(zé),并與其他類協(xié)作完成任務(wù)適度內(nèi)聚,由幾個(gè)類負(fù)責(zé)幾個(gè)不同領(lǐng)域中的輕量級(jí)和單獨(dú)的職責(zé),這些領(lǐng)域在邏輯上與類的概念相關(guān),但彼此之間并不相關(guān)高內(nèi)聚的類優(yōu)勢(shì)明顯,因?yàn)樗子诰S護(hù),理解和復(fù)用9/22/202250設(shè)計(jì)模

34、式高內(nèi)聚模塊化是將系統(tǒng)分解成一組內(nèi)聚的、松散耦合的模塊的特性,通過創(chuàng)立具有高內(nèi)聚的方法和類來促進(jìn)模塊化設(shè)計(jì)不良內(nèi)聚通常會(huì)導(dǎo)致不良耦合,反之亦然在少數(shù)情況下可以接收低內(nèi)聚將一組職責(zé)或代碼放入一個(gè)類或構(gòu)件中,以使某個(gè)人能方便地對(duì)其進(jìn)行維護(hù)創(chuàng)立數(shù)量較少并且規(guī)模較大的低內(nèi)聚效勞對(duì)象,以便為大量操作提供接口9/22/202251設(shè)計(jì)模式高內(nèi)聚優(yōu)點(diǎn)能夠更加輕松,清楚地理解設(shè)計(jì)簡(jiǎn)化了維護(hù)和改進(jìn)工作通常支持低耦合由于內(nèi)聚的類可以用于某個(gè)特定的目的,因此細(xì)粒度、相關(guān)性強(qiáng)的功能的重要性增強(qiáng)9/22/202252設(shè)計(jì)實(shí)例用例實(shí)現(xiàn)描述某個(gè)用例基于協(xié)作對(duì)象如何在設(shè)計(jì)模型中實(shí)現(xiàn)設(shè)計(jì)者能夠描述用例的一個(gè)或多個(gè)場(chǎng)景的設(shè)計(jì),其

35、中的每個(gè)設(shè)計(jì)都稱為用例實(shí)現(xiàn)9/22/202253制品關(guān)系強(qiáng)調(diào)用例的實(shí)現(xiàn)Operation: enterItem()Post-conditions:- . . .Operation ContractsSaledate. . .SalesLineItemquantity1.*1. . . . .Domain ModelUse-Case ModelDesign Model: RegisterenterItem(itemID, quantity): ProductCatalogd = getProductDescription(itemID)addLineItem( d, quantity ): Sa

36、leRequire-mentsBusiness ModelingDesignSample UP Artifact Relationships: SystementerItem(id, quantity)Use Case TextSystem Sequence DiagramsmakeNewSale()system eventsCashierProcess Sale: Cashieruse case namessystem operationsUse Case DiagramSupplementarySpecificationGlossarystarting events to design f

37、or, and detailed post-condition to satisfyProcess Sale1. Customer arrives .2. .3. Cashier enters item identifier.inspiration for names of some software domain objectsfunctional requirements that must be realized by the objectsideas for the post-conditionsRegister.makeNewSale()enterItem(.).ProductCat

38、alog.getProductDescription(.).1*non-functional requirementsdomain rulesitem details, formats, validation9/22/202254通訊圖和系統(tǒng)操作的處理:RegisterenterItem:RegisterendSale:RegistermakePayment1: ?1: ?1: ?:RegistermakeNewSale1: ?makeNewSale, etc., are the system operations from the SSDeach major interaction diag

39、ram starts with a system operation going into a domain layer controller object, such as RegisterDOMAIN LAYERUI LAYERWindow objects or GUI widget objectsorWeb control objects. . .9/22/202255順序圖和系統(tǒng)操作的處理: Register: SalemakeNewSalecreate: RegisterenterItem(.): ProductCatalogdesc = getProductDesc( itemID

40、 ). . .UI LAYERWindow objects or GUI widget objectsorWeb control objects. . .DOMAIN LAYER將SSD中系統(tǒng)操作作為領(lǐng)域?qū)涌刂茖?duì)象的起始消息9/22/202256滿足契約后置條件的局部交互圖1: makeLineItem(.)enterItem(id, qty)1.1: create(.):Register:Sale:SalesLineItem依據(jù)對(duì)相關(guān)用例文本的思考,完成后置條件的狀態(tài)變更,并設(shè)計(jì)消息的交互以滿足需求9/22/202257Nextgen迭代的用例實(shí)現(xiàn)初始和“啟動(dòng)用例啟動(dòng)用例實(shí)現(xiàn)是設(shè)計(jì)語(yǔ)境,在該

41、語(yǔ)境中要考慮創(chuàng)立大局部的“根或生命期長(zhǎng)的對(duì)象如何設(shè)計(jì)makeNewSale選擇控制器Store, Register, POSSystemProcessSaleHander, processSaleSession創(chuàng)立新的Sale9/22/202258應(yīng)用GRASP控制模式:RegistermakeNewSale:Salecreate9/22/202259Sale和集合的創(chuàng)立:RegistermakeNewSale:SalecreateRegister creates a Sale by CreatorcreatelineItems :Listby Creator, Sale creates an

42、 empty collection (such as a List) which will eventually hold SalesLineItem instancesby Creator and Controllerthis execution specification is implied to be within the constructor of the Sale instance9/22/202260Nextgen迭代的用例實(shí)現(xiàn)如何設(shè)計(jì)enterItem選擇控制類Register是否要顯示商品工程的描述和價(jià)格忽略有關(guān)顯示的設(shè)計(jì)創(chuàng)立新的SaleLineItementerItem契

43、約的后置條件說明需要?jiǎng)?chuàng)立、初始化以及建立與SaleLineItem的關(guān)聯(lián)通過在Sale的商品條目的集合中參加SalesLineItem的新實(shí)例,就可以在Sale與新創(chuàng)立的SalesLineItem實(shí)例間建立其關(guān)系9/22/202261Nextgen迭代的用例實(shí)現(xiàn)如何設(shè)計(jì)enterItem尋找productDescriptionProductCatalog是實(shí)現(xiàn)查找ProductDescription職責(zé)的最正確候選者ProductCatalog的可見性Register可以向ProductCatalog發(fā)送getProductDescription這樣的消息9/22/202262EnterIte

44、m交互圖、動(dòng)態(tài)視圖2: makeLineItem(desc, qty)enterItem(id, qty)1: desc = getProductDesc(id)2.1: create(desc, qty)1.1: desc = get(id):Register:Sale:ProductCatalogsl: SalesLineItemlineItems : List: Map2.2: add(sl)by Expertby Controllerby Creatoradd the newly created SalesLineItem instance to the List9/22/202263

45、和enterItem設(shè)計(jì)有關(guān)的局部DCD,靜態(tài)視圖SalesLineItemquantity : Integer.ProductCatalog.getProductDesc(.)ProductDescriptiondescription : Textprice : MoneyitemID: ItemID.1.*1.*Register.enterItem(.).SaleisComplete : Booleantime : DateTimemakeLineItem(.).111catalogcurrentSaledescriptionsMaplineItemsordereddescription9

46、/22/202264Nextgen迭代的用例實(shí)現(xiàn)如何設(shè)計(jì)EndSale選擇控制類register設(shè)置Sale.isComplete計(jì)算銷售總額設(shè)計(jì)Sale.gettotal9/22/202265完成商品工程的輸入:RegisterendSale(s :Sale1: becomeCompleteby Expertby Controller9/22/202266Sale.getTotal交互圖:Saletot = getTotal1 * i = 1.n: st = getSubtotal:ProductDescription1.1: pr = getPricelineItems i : Sales

47、LineItemby Expertby ExpertUML: note the selector notation to select elements from the lineItems collection9/22/202267在注解符號(hào)中展示方法:Saletot = getTotal1 * i = 1.n: st = getSubtotal:ProductDescription1.1: pr = getPricelineItems i :SalesLineItemmethodpublic void getTotal() int tot = 0; for each SalesLineIt

48、em, sli tot = tot + sli.getSubtotal(); return tot9/22/202268Nextgen迭代的用例實(shí)現(xiàn)makePayment創(chuàng)立Payment創(chuàng)立了Payment的實(shí)例p記錄Sale的日志計(jì)算余額9/22/202269Register.makePayment的交互圖1: makePayment(cashTendered)1.1: create(cashTendered):Register:Sale:PaymentmakePayment(cashTendered) by Controllerby Creator and Low Coupling9/2

49、2/202270誰(shuí)應(yīng)該負(fù)責(zé)獲知已完成的銷售Store.addSale(s : Sale).SalesLedger.addSale(s : Sale).Store is responsible for knowing and adding completed Sales.Acceptable in early development cycles if the Store has few responsibilities.SalesLedger is responsible for knowing and adding completed Sales.Suitable when the desi

50、gn grows and the Store becomes uncohesive.Sale.Sale.Logs-completed5Logs-completed5*119/22/202271在日志中記錄已完成的銷售1: makePayment(cashTendered)1.1: create(cashTendered):Registers :Sale:PaymentmakePayment(cashTendered) :Store2: addSale(s)completedSales: List2.1: add(s)by Expertnote that the Sale instance is

51、 nameds so that it can be referenced as a parameter in messages 2 and 2.19/22/202272Sale.getBalance的交互圖s :Salepmt: Payment1: amt = getAmountbal = getBalance2: t = getTotal bal = pmt.amount -s.total 9/22/202273反映了更多設(shè)計(jì)決策的更為完整的DCDSalesLineItemquantity : IntegergetSubtotal()ProductCatalog.getProductDesc

52、(.)ProductDescriptiondescription : Textprice : MoneyitemID: ItemID.Storeaddress : Addressname : TextaddCompleteSale(.)Paymentamount : Money.1.*1.*Register.endSale()enterItem(.)makeNewSale()makePayment(.)SaleisComplete : Booleantime : DateTimebecomeComplete()makeLineItem(.)makePayment(.)getTotal()111

53、111*catalogcatalogregistercurrentSaledescriptionsMaplineItemsorderedpaymentcompletedSalesordereddescription9/22/202274Nextgen迭代的用例實(shí)現(xiàn)如何將UI 連接到領(lǐng)域?qū)訌膽?yīng)用的起始方法中調(diào)用的初始化對(duì)象,同時(shí)創(chuàng)立UI對(duì)象和領(lǐng)域?qū)ο螅⑶覍㈩I(lǐng)域?qū)ο髠鬟f給UIUI對(duì)象從眾所周知的源提取領(lǐng)域?qū)ο缶唧w設(shè)計(jì)從register中增加一個(gè)getTotal方法當(dāng)UI層需要知道銷售總額時(shí),UI層請(qǐng)求一個(gè)當(dāng)前Sale對(duì)象的引用,然后直接發(fā)送相應(yīng)的消息給Sale9/22/202275連接UI層和領(lǐng)

54、域?qū)?RegisterCashier:ProcessSaleJFrameactionPerformed( actionEvent )1: enterItem(id, qty)system eventUILayerDomainLayerpresses button9/22/202276連接UI層和領(lǐng)域?qū)?RegisterCashier:ProcessSaleJFrameactionPerformed( actionEvent ) 1: enterItem(id, qty)2 no sale : s = getSale : SaleUILayerDomainLayers : Sale3: t =

55、getTotalpresses button9/22/202277Nextgen迭代的用例實(shí)現(xiàn)初始化和“啟動(dòng)用例何時(shí)創(chuàng)立初始化設(shè)計(jì)最后完成初始化設(shè)計(jì)如何完成應(yīng)用的啟動(dòng)啟動(dòng)用例中的StartUP系統(tǒng)操作抽象地表示應(yīng)用開始時(shí)執(zhí)行的初始化階段。對(duì)于所有的情形,常見的設(shè)計(jì)約定時(shí)創(chuàng)立一個(gè)初始領(lǐng)域?qū)ο蠡蛞唤M對(duì)等的初始領(lǐng)域?qū)ο笠坏﹦?chuàng)立了初始領(lǐng)域?qū)ο?,該?duì)象將負(fù)責(zé)創(chuàng)立其直接的子領(lǐng)域?qū)ο筮x擇初始領(lǐng)域?qū)ο筮x擇位于或接近于領(lǐng)域?qū)ο蟀蚓酆蠈又械母愖鳛槌跏碱I(lǐng)域?qū)ο髎tore.create9/22/202278初始領(lǐng)域?qū)ο蠹捌浜罄^領(lǐng)域?qū)ο蟮膭?chuàng)立:Store:Registerpc:ProductCatalogcreate2: create(pc) 1: create1.2: loadProdSpecs() descriptions:Map1.1: create1.2.2*: put(i

溫馨提示

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

評(píng)論

0/150

提交評(píng)論