




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
將模型映射到代碼第一頁,共三十八頁,2022年,8月28日導(dǎo)言如果設(shè)計(jì)模式的選擇和類接口規(guī)格說明工作做的足夠仔細(xì),那么現(xiàn)存大部分設(shè)計(jì)問題可以解決,但是將模型映射到代碼時(shí)會(huì)產(chǎn)生很多問題(違反契約,隨意添加參數(shù),交付壓力等),本章介紹一些將模型映射到代碼的方法,提高系統(tǒng)質(zhì)量第二頁,共三十八頁,2022年,8月28日對(duì)象設(shè)計(jì)活動(dòng)圖第三頁,共三十八頁,2022年,8月28日映射概述優(yōu)化類模型減少關(guān)聯(lián)重?cái)?shù)加快查詢速度,增加冗余關(guān)聯(lián)提高有效性將關(guān)聯(lián)映射到集合上將關(guān)聯(lián)映射到源代碼上將契約映射到異常上描述違反契約的操作行為將類模型映射到存儲(chǔ)模式上選擇存儲(chǔ)策略,將類模型映射到存儲(chǔ)模式上第四頁,共三十八頁,2022年,8月28日映射的概念轉(zhuǎn)換的類型模型轉(zhuǎn)換:優(yōu)化原始模型,如將單一屬性轉(zhuǎn)化為類(將地址字符串轉(zhuǎn)化為包含街道,郵編,城市,國(guó)家等屬性的類)重構(gòu):類似模型轉(zhuǎn)換,代碼級(jí)別的轉(zhuǎn)換第五頁,共三十八頁,2022年,8月28日映射的概念正向工程:產(chǎn)生與對(duì)象模型對(duì)應(yīng)的源代碼模板逆向工程:產(chǎn)生與源代碼對(duì)應(yīng)的對(duì)象模型,主要在系統(tǒng)設(shè)計(jì)方案丟失時(shí)使用第六頁,共三十八頁,2022年,8月28日模型轉(zhuǎn)換模型轉(zhuǎn)換作用于某一模型上,以產(chǎn)生另一模型,其目的是簡(jiǎn)化或優(yōu)化原有模型,轉(zhuǎn)換可能增加,刪除,修改類,方法,以及屬性。需同步更新對(duì)象設(shè)計(jì)模型。第七頁,共三十八頁,2022年,8月28日重構(gòu)重構(gòu)是對(duì)源代碼的轉(zhuǎn)換,在不影響系統(tǒng)行為的前提下,提高代碼的可讀性和可修改性重構(gòu)好處容易閱讀所有邏輯都只在唯一地點(diǎn)指定新的改動(dòng)不會(huì)危及現(xiàn)有的行為簡(jiǎn)單的表達(dá)條件邏輯第八頁,共三十八頁,2022年,8月28日重構(gòu)征兆三次法則:如果你重復(fù)拷貝某段代碼超過3次,考慮重構(gòu)數(shù)量法則:如果某個(gè)方法的實(shí)現(xiàn)超過20行,考慮重構(gòu)重構(gòu)時(shí)機(jī)在添加新功能時(shí)進(jìn)行重構(gòu).在修改bug時(shí)進(jìn)行重構(gòu)在代碼復(fù)審時(shí)進(jìn)行重構(gòu).什么時(shí)候不易進(jìn)行重構(gòu)現(xiàn)有的程序無法運(yùn)行,此時(shí)應(yīng)該是重寫程序,不是重構(gòu)程序到了最后的交付期限第九頁,共三十八頁,2022年,8月28日重構(gòu)與設(shè)計(jì)重構(gòu)與設(shè)計(jì)是互補(bǔ)的,程序應(yīng)該是先設(shè)計(jì),后編碼。設(shè)計(jì)上的不足可以用重構(gòu)來彌補(bǔ),但不應(yīng)該因?yàn)橛兄貥?gòu)而忽視設(shè)計(jì)。如果能很容易的通過重構(gòu)來適應(yīng)需求的變化,那么就不必過度的設(shè)計(jì),當(dāng)需求改變時(shí)再重構(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日正向工程與逆向工程正向工程:保持對(duì)象設(shè)計(jì)模型與源代碼的高度一致,減少在實(shí)現(xiàn)期間引入的錯(cuò)誤數(shù)。如將UML模型每個(gè)屬性映射到Java類中某個(gè)私有字段以及get和set方法上將UML模型每個(gè)方法映射到Java類中某個(gè)方法上逆向工程:根據(jù)源代碼產(chǎn)生對(duì)象模型,是正向工程的逆過程為每一個(gè)代碼類構(gòu)建一個(gè)UML類并增加屬性和方法。因?yàn)檎蚬こ虝?huì)丟失信息(例如關(guān)聯(lián)通過Java集合實(shí)現(xiàn)),所以構(gòu)建出的對(duì)象模型與原對(duì)象模型不一定一致第十三頁,共三十八頁,2022年,8月28日轉(zhuǎn)換原則每一次轉(zhuǎn)換都面臨著風(fēng)險(xiǎn),所以必須遵守一些原則每個(gè)轉(zhuǎn)換對(duì)應(yīng)唯一的判定準(zhǔn)則:以改進(jìn)系統(tǒng)響應(yīng)時(shí)間為目標(biāo)使系統(tǒng)易于擴(kuò)展不能同時(shí)考慮多個(gè)目標(biāo)每個(gè)轉(zhuǎn)換必須是局部的一次盡量改變少量方法和類盡量在一個(gè)子系統(tǒng)內(nèi)進(jìn)行修改第十四頁,共三十八頁,2022年,8月28日轉(zhuǎn)換原則每一個(gè)轉(zhuǎn)換必須與其他更改活動(dòng)相隔離改變性能的時(shí)候不應(yīng)該增加新的功能增加新的功能時(shí)不需要考慮性能每個(gè)轉(zhuǎn)換之后必須進(jìn)行確認(rèn)對(duì)象模型轉(zhuǎn)換:更新順序圖并檢查相關(guān)用例重構(gòu):運(yùn)行對(duì)應(yīng)類的測(cè)試用例增加了新的功能:構(gòu)造新的測(cè)試用例第十五頁,共三十八頁,2022年,8月28日映射活動(dòng)-優(yōu)化對(duì)象設(shè)計(jì)模型優(yōu)化訪問路徑:對(duì)多重關(guān)聯(lián)的重復(fù)遍歷,對(duì)關(guān)聯(lián)多的一端的遍歷,以及錯(cuò)誤放置的屬性,這些都是導(dǎo)致系統(tǒng)效率低下的原因。第十六頁,共三十八頁,2022年,8月28日映射活動(dòng)-優(yōu)化對(duì)象設(shè)計(jì)模型關(guān)聯(lián)的重復(fù)遍歷標(biāo)識(shí)經(jīng)常被調(diào)用的操作,并在順序圖的幫助下檢查這些多重關(guān)聯(lián)遍歷是否必須。第十七頁,共三十八頁,2022年,8月28日瀏覽器頁面的滾動(dòng)流暢度一直是衡量瀏覽器是否好用的一個(gè)重要指標(biāo)。一個(gè)頁面通常由Html,Css,Img,Js等組成,在內(nèi)存中通過Dom樹來表示。<html><header/><body><text>helloworld</text></body></html>第十八頁,共三十八頁,2022年,8月28日瀏覽頁面時(shí),鼠標(biāo)滾輪每滾動(dòng)一下,頁面重新繪制了n次,這樣才能體現(xiàn)流暢的滾動(dòng)效果。每一次重新繪制,都需要對(duì)Dom樹進(jìn)行一次遍歷,重新計(jì)算每個(gè)元素的位置,重新布局,這樣嚴(yán)重影響了效率。解決辦法1,如果只是滾動(dòng)的話,其實(shí)元素之間的相對(duì)位置并沒有發(fā)生改變,只需要記錄元素相對(duì)位置,再加上橫縱坐標(biāo)的平移,重新繪制即可得到正確的視圖。解決辦法2,將頁面完整渲染后保存成圖像,滾動(dòng)僅僅是圖像的滾動(dòng)。第十九頁,共三十八頁,2022年,8月28日將關(guān)聯(lián)“多”的一端化簡(jiǎn)在二維圖形繪制的時(shí)候,需要為屏幕中每一個(gè)像素點(diǎn)建立一個(gè)對(duì)象來保存相關(guān)信息。在具體渲染的時(shí)候,需要按照掃描線遍歷每一個(gè)像素點(diǎn),查看當(dāng)前像素點(diǎn)是否與需要繪制的圖形相交,或者處于圖形內(nèi)部,這涉及到排序,不好的排序會(huì)導(dǎo)致圖形渲染效率低下。第二十頁,共三十八頁,2022年,8月28日錯(cuò)誤放置的屬性導(dǎo)致系統(tǒng)效率低下的另一個(gè)原因是過度建模,類中一些不需要的屬性應(yīng)該從模型中簡(jiǎn)單的去掉。第二十一頁,共三十八頁,2022年,8月28日映射活動(dòng)-優(yōu)化對(duì)象設(shè)計(jì)模型壓縮對(duì)象:將對(duì)象變?yōu)閷傩?,?duì)象模型在經(jīng)歷了一些優(yōu)化后,只剩下很少的屬性或行為,若這些類與其他的一個(gè)類關(guān)聯(lián),就可以將對(duì)象壓縮為屬性。第二十二頁,共三十八頁,2022年,8月28日映射活動(dòng)-優(yōu)化對(duì)象設(shè)計(jì)模型延時(shí)高成本計(jì)算創(chuàng)建特殊對(duì)象常常是昂貴的,其實(shí)可以將對(duì)象的創(chuàng)建延時(shí)到實(shí)際需要使用的時(shí)候考慮一個(gè)Web頁面上面有很多圖片,但是并不是所有的圖片在同一時(shí)間顯示第二十三頁,共三十八頁,2022年,8月28日映射活動(dòng)-優(yōu)化對(duì)象設(shè)計(jì)模型采用緩存存放高成本計(jì)算結(jié)果在網(wǎng)頁顯示中,我們一般將Image圖片解碼成RGB格式的數(shù)據(jù)存儲(chǔ)在內(nèi)存緩存中,需要渲染的時(shí)候,直接從內(nèi)存中讀出,比再去解碼一次會(huì)快很多。緩存有一定大小,可以按照最近最長(zhǎng)使用的策略進(jìn)行替換。第二十四頁,共三十八頁,2022年,8月28日映射活動(dòng)-將關(guān)聯(lián)映射到集合關(guān)聯(lián)是UML中的概念,表示2個(gè)或多個(gè)對(duì)象之間有聯(lián)系,但是不幸的是程序設(shè)計(jì)語言中并沒有關(guān)聯(lián)的概念,取而代之的是引用和集合引用:一個(gè)對(duì)象存儲(chǔ)另外一個(gè)對(duì)象的句柄集合:存儲(chǔ)幾個(gè)對(duì)象的引用并排序第二十五頁,共三十八頁,2022年,8月28日單向一對(duì)一關(guān)聯(lián)publicclassAdvertiser{privateAccountaccount;publicAdvertiser(){ account=newAccount(); }publicAccountgetAccount(){ returnaccount;}}第二十六頁,共三十八頁,2022年,8月28日一對(duì)一雙向關(guān)聯(lián)publicclassAdvertiser{privateAccountaccount;publicAdvertiser(){ account=newAccount(this);}publicAccountgetAccount(){ returnaccount;}}publicclassAccount{privateAdvertiserowner;publicAccount(Advertiserowner){ this.owner=owner; }publicAdvertisergetAdvertiser(){ returnowner;}}第二十七頁,共三十八頁,2022年,8月28日一對(duì)多關(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日多對(duì)多關(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日映射活動(dòng)-將契約映射到異常面向?qū)ο笳Z言沒有對(duì)契約進(jìn)行支持一般使用異常機(jī)制來處理契約事故第三十一頁,共三十八頁,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ā)式方案對(duì)代碼編寫測(cè)試代碼,由測(cè)試人員編寫著重對(duì)子系統(tǒng)接口進(jìn)行測(cè)試著重考慮涉及到生命周期最長(zhǎng)的對(duì)象的契約測(cè)試第三十三頁,共三十八頁,2022年,8月28日映射活動(dòng)-將對(duì)象模型映射到持久存儲(chǔ)將持久性存儲(chǔ)對(duì)象映射到數(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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025廣東珠海市橫琴粵澳深度合作區(qū)招聘公辦幼兒園教職工(第一批)5人模擬試卷附答案詳解
- 2025年黃山市中心血站招聘醫(yī)學(xué)檢驗(yàn)人員1人考前自測(cè)高頻考點(diǎn)模擬試題完整參考答案詳解
- 2025廣東廣州市越秀區(qū)建設(shè)街招聘輔助人員1人模擬試卷及完整答案詳解
- 2025年酒及飲料加工機(jī)械項(xiàng)目發(fā)展計(jì)劃
- 2025年度中國(guó)科學(xué)院國(guó)家天文臺(tái)長(zhǎng)春人造衛(wèi)星觀測(cè)站招聘(7人)考前自測(cè)高頻考點(diǎn)模擬試題及答案詳解(必刷)
- 2025年馬鞍山當(dāng)涂縣公開引進(jìn)中小學(xué)教師65人考前自測(cè)高頻考點(diǎn)模擬試題及答案詳解(全優(yōu))
- 2025廣西百色市田陽區(qū)消防救援大隊(duì)政府招聘專職消防員9人考前自測(cè)高頻考點(diǎn)模擬試題及答案詳解參考
- 2025年甘肅省武威市涼州區(qū)清源鎮(zhèn)選聘專業(yè)化管理的大學(xué)生村文書考前自測(cè)高頻考點(diǎn)模擬試題及答案詳解(奪冠)
- 2025內(nèi)蒙古鄂爾多斯市委政策研究室所屬事業(yè)單位引進(jìn)高層次人才和緊缺專業(yè)人才2人模擬試卷及答案詳解(新)
- 2025年河北金融學(xué)院選聘工作人員60名模擬試卷參考答案詳解
- 2025-2026學(xué)年第一學(xué)期蘇教版二年級(jí)數(shù)學(xué)上冊(cè)第一單元測(cè)試卷及答案
- 2025山西陽泉平定縣縣屬國(guó)有企業(yè)招聘100人筆試備考試題及答案解析
- 第五單元漫步經(jīng)典第4課時(shí)《第九十四(驚愕)交響曲》教學(xué)設(shè)計(jì)-西大版初中音樂八年級(jí)上冊(cè)
- 2025年金融科技行業(yè)數(shù)字支付發(fā)展前景研究報(bào)告
- 七上語文月考必考名著《朝花夕拾》高頻考點(diǎn)簡(jiǎn)答70道
- 2025榆林鎂業(yè)(集團(tuán))有限公司招聘(9人)考試參考試題及答案解析
- 愛國(guó)教育主題班會(huì)課件:看中華崛起展少年擔(dān)當(dāng)
- 2025年市場(chǎng)營(yíng)銷自考真題及答案
- 數(shù)字化轉(zhuǎn)型文化旅游產(chǎn)業(yè)智慧化發(fā)展研究報(bào)告
- 低空經(jīng)濟(jì)全景圖:新質(zhì)生產(chǎn)力驅(qū)動(dòng)下的萬億級(jí)新賽道與區(qū)域標(biāo)桿實(shí)踐
- 硫酸安全培訓(xùn)與防范課件
評(píng)論
0/150
提交評(píng)論