版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
將模型映射到代碼第一頁,共三十八頁,2022年,8月28日導(dǎo)言如果設(shè)計模式的選擇和類接口規(guī)格說明工作做的足夠仔細(xì),那么現(xiàn)存大部分設(shè)計問題可以解決,但是將模型映射到代碼時會產(chǎn)生很多問題(違反契約,隨意添加參數(shù),交付壓力等),本章介紹一些將模型映射到代碼的方法,提高系統(tǒng)質(zhì)量第二頁,共三十八頁,2022年,8月28日對象設(shè)計活動圖第三頁,共三十八頁,2022年,8月28日映射概述優(yōu)化類模型減少關(guān)聯(lián)重數(shù)加快查詢速度,增加冗余關(guān)聯(lián)提高有效性將關(guān)聯(lián)映射到集合上將關(guān)聯(lián)映射到源代碼上將契約映射到異常上描述違反契約的操作行為將類模型映射到存儲模式上選擇存儲策略,將類模型映射到存儲模式上第四頁,共三十八頁,2022年,8月28日映射的概念轉(zhuǎn)換的類型模型轉(zhuǎn)換:優(yōu)化原始模型,如將單一屬性轉(zhuǎn)化為類(將地址字符串轉(zhuǎn)化為包含街道,郵編,城市,國家等屬性的類)重構(gòu):類似模型轉(zhuǎn)換,代碼級別的轉(zhuǎn)換第五頁,共三十八頁,2022年,8月28日映射的概念正向工程:產(chǎn)生與對象模型對應(yīng)的源代碼模板逆向工程:產(chǎn)生與源代碼對應(yīng)的對象模型,主要在系統(tǒng)設(shè)計方案丟失時使用第六頁,共三十八頁,2022年,8月28日模型轉(zhuǎn)換模型轉(zhuǎn)換作用于某一模型上,以產(chǎn)生另一模型,其目的是簡化或優(yōu)化原有模型,轉(zhuǎn)換可能增加,刪除,修改類,方法,以及屬性。需同步更新對象設(shè)計模型。第七頁,共三十八頁,2022年,8月28日重構(gòu)重構(gòu)是對源代碼的轉(zhuǎn)換,在不影響系統(tǒng)行為的前提下,提高代碼的可讀性和可修改性重構(gòu)好處容易閱讀所有邏輯都只在唯一地點指定新的改動不會危及現(xiàn)有的行為簡單的表達(dá)條件邏輯第八頁,共三十八頁,2022年,8月28日重構(gòu)征兆三次法則:如果你重復(fù)拷貝某段代碼超過3次,考慮重構(gòu)數(shù)量法則:如果某個方法的實現(xiàn)超過20行,考慮重構(gòu)重構(gòu)時機在添加新功能時進(jìn)行重構(gòu).在修改bug時進(jìn)行重構(gòu)在代碼復(fù)審時進(jìn)行重構(gòu).什么時候不易進(jìn)行重構(gòu)現(xiàn)有的程序無法運行,此時應(yīng)該是重寫程序,不是重構(gòu)程序到了最后的交付期限第九頁,共三十八頁,2022年,8月28日重構(gòu)與設(shè)計重構(gòu)與設(shè)計是互補的,程序應(yīng)該是先設(shè)計,后編碼。設(shè)計上的不足可以用重構(gòu)來彌補,但不應(yīng)該因為有重構(gòu)而忽視設(shè)計。如果能很容易的通過重構(gòu)來適應(yīng)需求的變化,那么就不必過度的設(shè)計,當(dāng)需求改變時再重構(gòu)代碼。第十頁,共三十八頁,2022年,8月28日第一次重構(gòu)后publicclassUser{protectStringemail;}publicclassStudentextendsUser{//....}publicclassTeacherextendsUser{//....}
第一次重構(gòu)前publicclassStudent{privateStringemail;//....}publicclassTeacher{privateStringemail;//....}第十一頁,共三十八頁,2022年,8月28日
第二次重構(gòu)前publicclassUser{protectStringemail;}publicclassStudentextendsUser{publicStudent(Stringemail){this.email=email; }}
第二次重構(gòu)后publicclassUser{privateStringemail;publicUser(Stringemail){this.email=email; }}publicclassStudentextendsUser{publicStudent(Stringemail){super(email); }}第十二頁,共三十八頁,2022年,8月28日正向工程與逆向工程正向工程:保持對象設(shè)計模型與源代碼的高度一致,減少在實現(xiàn)期間引入的錯誤數(shù)。如將UML模型每個屬性映射到Java類中某個私有字段以及get和set方法上將UML模型每個方法映射到Java類中某個方法上逆向工程:根據(jù)源代碼產(chǎn)生對象模型,是正向工程的逆過程為每一個代碼類構(gòu)建一個UML類并增加屬性和方法。因為正向工程會丟失信息(例如關(guān)聯(lián)通過Java集合實現(xiàn)),所以構(gòu)建出的對象模型與原對象模型不一定一致第十三頁,共三十八頁,2022年,8月28日轉(zhuǎn)換原則每一次轉(zhuǎn)換都面臨著風(fēng)險,所以必須遵守一些原則每個轉(zhuǎn)換對應(yīng)唯一的判定準(zhǔn)則:以改進(jìn)系統(tǒng)響應(yīng)時間為目標(biāo)使系統(tǒng)易于擴(kuò)展不能同時考慮多個目標(biāo)每個轉(zhuǎn)換必須是局部的一次盡量改變少量方法和類盡量在一個子系統(tǒng)內(nèi)進(jìn)行修改第十四頁,共三十八頁,2022年,8月28日轉(zhuǎn)換原則每一個轉(zhuǎn)換必須與其他更改活動相隔離改變性能的時候不應(yīng)該增加新的功能增加新的功能時不需要考慮性能每個轉(zhuǎn)換之后必須進(jìn)行確認(rèn)對象模型轉(zhuǎn)換:更新順序圖并檢查相關(guān)用例重構(gòu):運行對應(yīng)類的測試用例增加了新的功能:構(gòu)造新的測試用例第十五頁,共三十八頁,2022年,8月28日映射活動-優(yōu)化對象設(shè)計模型優(yōu)化訪問路徑:對多重關(guān)聯(lián)的重復(fù)遍歷,對關(guān)聯(lián)多的一端的遍歷,以及錯誤放置的屬性,這些都是導(dǎo)致系統(tǒng)效率低下的原因。第十六頁,共三十八頁,2022年,8月28日映射活動-優(yōu)化對象設(shè)計模型關(guān)聯(lián)的重復(fù)遍歷標(biāo)識經(jīng)常被調(diào)用的操作,并在順序圖的幫助下檢查這些多重關(guān)聯(lián)遍歷是否必須。第十七頁,共三十八頁,2022年,8月28日瀏覽器頁面的滾動流暢度一直是衡量瀏覽器是否好用的一個重要指標(biāo)。一個頁面通常由Html,Css,Img,Js等組成,在內(nèi)存中通過Dom樹來表示。<html><header/><body><text>helloworld</text></body></html>第十八頁,共三十八頁,2022年,8月28日瀏覽頁面時,鼠標(biāo)滾輪每滾動一下,頁面重新繪制了n次,這樣才能體現(xiàn)流暢的滾動效果。每一次重新繪制,都需要對Dom樹進(jìn)行一次遍歷,重新計算每個元素的位置,重新布局,這樣嚴(yán)重影響了效率。解決辦法1,如果只是滾動的話,其實元素之間的相對位置并沒有發(fā)生改變,只需要記錄元素相對位置,再加上橫縱坐標(biāo)的平移,重新繪制即可得到正確的視圖。解決辦法2,將頁面完整渲染后保存成圖像,滾動僅僅是圖像的滾動。第十九頁,共三十八頁,2022年,8月28日將關(guān)聯(lián)“多”的一端化簡在二維圖形繪制的時候,需要為屏幕中每一個像素點建立一個對象來保存相關(guān)信息。在具體渲染的時候,需要按照掃描線遍歷每一個像素點,查看當(dāng)前像素點是否與需要繪制的圖形相交,或者處于圖形內(nèi)部,這涉及到排序,不好的排序會導(dǎo)致圖形渲染效率低下。第二十頁,共三十八頁,2022年,8月28日錯誤放置的屬性導(dǎo)致系統(tǒng)效率低下的另一個原因是過度建模,類中一些不需要的屬性應(yīng)該從模型中簡單的去掉。第二十一頁,共三十八頁,2022年,8月28日映射活動-優(yōu)化對象設(shè)計模型壓縮對象:將對象變?yōu)閷傩?,對象模型在?jīng)歷了一些優(yōu)化后,只剩下很少的屬性或行為,若這些類與其他的一個類關(guān)聯(lián),就可以將對象壓縮為屬性。第二十二頁,共三十八頁,2022年,8月28日映射活動-優(yōu)化對象設(shè)計模型延時高成本計算創(chuàng)建特殊對象常常是昂貴的,其實可以將對象的創(chuàng)建延時到實際需要使用的時候考慮一個Web頁面上面有很多圖片,但是并不是所有的圖片在同一時間顯示第二十三頁,共三十八頁,2022年,8月28日映射活動-優(yōu)化對象設(shè)計模型采用緩存存放高成本計算結(jié)果在網(wǎng)頁顯示中,我們一般將Image圖片解碼成RGB格式的數(shù)據(jù)存儲在內(nèi)存緩存中,需要渲染的時候,直接從內(nèi)存中讀出,比再去解碼一次會快很多。緩存有一定大小,可以按照最近最長使用的策略進(jìn)行替換。第二十四頁,共三十八頁,2022年,8月28日映射活動-將關(guān)聯(lián)映射到集合關(guān)聯(lián)是UML中的概念,表示2個或多個對象之間有聯(lián)系,但是不幸的是程序設(shè)計語言中并沒有關(guān)聯(lián)的概念,取而代之的是引用和集合引用:一個對象存儲另外一個對象的句柄集合:存儲幾個對象的引用并排序第二十五頁,共三十八頁,2022年,8月28日單向一對一關(guān)聯(lián)publicclassAdvertiser{privateAccountaccount;publicAdvertiser(){ account=newAccount(); }publicAccountgetAccount(){ returnaccount;}}第二十六頁,共三十八頁,2022年,8月28日一對一雙向關(guān)聯(lián)publicclassAdvertiser{privateAccountaccount;publicAdvertiser(){ account=newAccount(this);}publicAccountgetAccount(){ returnaccount;}}publicclassAccount{privateAdvertiserowner;publicAccount(Advertiserowner){ this.owner=owner; }publicAdvertisergetAdvertiser(){ returnowner;}}第二十七頁,共三十八頁,2022年,8月28日一對多關(guān)聯(lián)publicclassAdvertiser{
privateSetaccounts;publicAdvertiser(){ account=newHashSet(); }publicvoidaddAccount(Accounta){ accounts.add(a); a.setOwner(this);}}publicclassAccount{privateAdvertiserOwner;publicvoidsetOwner(AdvertiserOwner){ this.owner=Owner; Owner.addAccount(this); }………….}第二十八頁,共三十八頁,2022年,8月28日多對多關(guān)聯(lián)publicclassTournament{privateListplayers;publicTournament(){ palyers=newArrayList(); }
publicvoidaddPlayer(Playerp){ if(!players.contain(p)){ players.add(p);
p.addTournament(this);}}}publicclassPlayer{privateListtournaments;publicPlayer(){ tournaments=newArrayList();}publicvoidaddTournament(Tournamentt){ if(!tournaments.contain(t)){ tournaments.add(p);
t.addPlayer(this);
}}}第二十九頁,共三十八頁,2022年,8月28日受限關(guān)聯(lián)publicclassTournament{
privateMapplayers;publicvoidaddPlayer(Stringnickname,Playerp){ if(!players.containKey(nickName)){ players.put(nickName,p); p.addTournament(nickName,this);}}}publicclassPlayer{privateMaptournaments;publicvoidaddTournament(Stringnickname,Tournamentt){if(!tournaments.containKey(nickName,t)){ tournaments.put(nickName,t); t.addPlayer(nickName,t); }}}第三十頁,共三十八頁,2022年,8月28日映射活動-將契約映射到異常面向?qū)ο笳Z言沒有對契約進(jìn)行支持一般使用異常機制來處理契約事故第三十一頁,共三十八頁,2022年,8月28日publicclassTournament{//.......privateListplayers;publicaddPlayer(Playerp)throwsknownPlayer,TooManyPlayers,UnknownPlayer,IllegalNumPlayers,IllegalMaxNumPlayers{//checkprecondition!isPlayerAccepted(p)if(isPlayerAccepted(p))thrownewknownPlayer(p);//checkpreconditiongetNumPlayers()<maxNumPlayersif(getNumPlayers()==getMaxNumPlayers())thrownewTooManyPlayers(getNumPlayers());.....//savecurrentplayernumintpre_getNumPlayers=getNumPlayers();//checkpostconditionisPlayerAccepted(p)if(!isPlayerAccepted(p))thrownewunKnownPlayer(p);//checkpostconditiongeNumPlayers()=pre_getNumPlayers+1if(geNumPlayers()!=pre_getNumPlayers+1)thrownewIllegalNumPlayers(geNumPlayers());}}第三十二頁,共三十八頁,2022年,8月28日將契約映射到異常的啟發(fā)式方案對代碼編寫測試代碼,由測試人員編寫著重對子系統(tǒng)接口進(jìn)行測試著重考慮涉及到生命周期最長的對象的契約測試第三十三頁,共三十八頁,2022年,8月28日映射活動-將對象模型映射到持久存儲將持久性存儲對象映射到數(shù)據(jù)庫的表中主關(guān)鍵字,候選關(guān)鍵字(user表)外關(guān)鍵字(game表)Firstnameloginemail“alice”am789am789@“piter”jkhhhpiter@“zhang”zz101z
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 會計事務(wù)所實習(xí)日記
- 會計人員培訓(xùn)心得體會
- 幼兒教育的教學(xué)隨筆匯編12篇
- 關(guān)于銷售類生產(chǎn)實習(xí)報告4篇
- 鄉(xiāng)鎮(zhèn)雪亮工程公共視頻應(yīng)用聯(lián)網(wǎng)項目綜合視頻監(jiān)控系統(tǒng)功能介紹
- 法律的作用(醉駕版)
- 2025年運載火箭控制系統(tǒng)仿真實時處理系統(tǒng)項目發(fā)展計劃
- 《職場溝通》電子教案 項目六 職場面試溝通
- 商鋪出租合同模板
- 杭州市房屋租賃合同
- 三年級《稻草人》閱讀測試試題附答案
- 心理健康與職業(yè)生涯(第一章)課件
- 粵教版三年級勞動與技術(shù)全冊教案教學(xué)設(shè)計
- 越努力越幸運商務(wù)紅色工作匯報PPT模板
- (完整版)外科學(xué)名詞解釋【完整版】
- 永磁同步電機控制系統(tǒng)設(shè)計與仿真畢業(yè)論文
- 傳感器與檢測技術(shù)課后習(xí)題和答案(陳杰)
- 藏歷新年ppt模版課件
- 基于PLC的自動門控制系統(tǒng)
- 滬教牛津版小學(xué)四年英語上冊全冊教案
- 智能凈水器控制系統(tǒng)設(shè)計
評論
0/150
提交評論