将模型映射到代码(共38张PPT)精选_第1页
将模型映射到代码(共38张PPT)精选_第2页
将模型映射到代码(共38张PPT)精选_第3页
将模型映射到代码(共38张PPT)精选_第4页
将模型映射到代码(共38张PPT)精选_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

将模型映射(yìngshè)到代码第一页,共38页。导言(dǎoyán)如果设计(shèjì)模式的选择和类接口规格说明工作做的足够仔细,那么现存大部分设计(shèjì)问题可以解决,但是将模型映射到代码时会产生很多问题(违反契约,随意添加参数,交付压力等),本章介绍一些将模型映射到代码的方法,提高系统质量第二页,共38页。对象(duìxiàng)设计活动图第三页,共38页。映射(yìngshè)概述优化类模型减少关联重数加快查询速度,增加冗余关联提高有效性将关联映射到集合上将关联映射到源代码上将契约映射到异常上描述违反契约的操作行为将类模型映射到存储模式(móshì)上选择存储策略,将类模型映射到存储模式(móshì)上第四页,共38页。映射(yìngshè)的概念转换的类型模型转换:优化原始模型,如将单一属性转化(zhuǎnhuà)为类(将地址字符串转化(zhuǎnhuà)为包含街道,,城市,国家等属性的类)重构:类似模型转换,代码级别的转换第五页,共38页。映射(yìngshè)的概念正向工程:产生与对象模型对应的源代码模板逆向(nìxiànɡ)工程:产生与源代码对应的对象模型,主要在系统设计方案丢失时使用第六页,共38页。模型(móxíng)转换模型转换(zhuǎnhuàn)作用于某一模型上,以产生另一模型,其目的是简化或优化原有模型,转换(zhuǎnhuàn)可能增加,删除,修改类,方法,以及属性。需同步更新对象设计模型。第七页,共38页。重构重构是对源代码(dàimǎ)的转换,在不影响系统行为的前提下,提高代码(dàimǎ)的可读性和可修改性重构好处容易阅读所有逻辑都只在唯一地点指定新的改动不会危及现有的行为简单的表达条件逻辑第八页,共38页。重构征兆三次法则:如果你重复拷贝某段代码超过3次,考虑(kǎolǜ)重构数量法则:如果某个方法的实现超过20行,考虑(kǎolǜ)重构重构时机在添加新功能时进行重构.在修改bug时进行重构在代码复审时进行重构.什么时候不易进行重构现有的程序无法运行,此时应该是重写程序,不是重构程序到了最后的交付期限第九页,共38页。重构与设计重构与设计是互补(hùbǔ)的,程序应该是先设计,后编码。设计上的不足可以用重构来弥补,但不应该因为有重构而忽视设计。如果能很容易的通过重构来适应需求的变化,那么就不必过度的设计,当需求改变时再重构代码。第十页,共38页。第一次重构后publicclassUser{protectStringemail;}publicclassStudentextendsUser{//....}publicclassTeacherextendsUser{//....}

第一次重构前publicclassStudent{privateStringemail;//....}publicclassTeacher{privateStringemail;//....}第十一页,共38页。

第二次重构前publicclassUser{protectStringemail;}publicclassStudentextendsUser{publicStudent(Stringemail){this.email=email; }}

第二次重构后publicclassUser{privateStringemail;publicUser(Stringemail){this.email=email; }}publicclassStudentextendsUser{publicStudent(Stringemail){super(email); }}第十二页,共38页。第三十三页,共38页。publicclassAccount{publicclassUser{优化访问路径:对多重关联的重复遍历,对关联多的一端的遍历,以及错误(cuòwù)放置的属性,这些都是导致系统效率低下的原因。为每一个代码类构建一个UML类并增加属性和方法。email=email;</body>privateMapplayers;publicAccountgetAccount(){使用(shǐyòng)独立数据表(关联表)来实现多对多关系映射(yìngshè)活动-优化对象设计模型如将UML模型每个属性映射到Java类中某个私有字段以及get和set方法上垂直映射:每一个类通过一个表来表示,使用外关键字来连接子类表和超类表,超类表包含一个附加列,表示该对象属于哪一个子类,所有表共享一个关键字,即对象标识符,相同对象标识符的数据表示一个对象(Stringnickname,Playerp){publicTournament(){publicclassTeacherextendsUser{returnaccount;正向工程(gōngchéng)与逆向工程(gōngchéng)正向工程:保持对象设计模型与源代码的高度一致,减少在实现期间引入的错误数。如将UML模型每个属性映射到Java类中某个私有字段以及get和set方法上将UML模型每个方法映射到Java类中某个方法上逆向工程:根据源代码产生(chǎnshēng)对象模型,是正向工程的逆过程为每一个代码类构建一个UML类并增加属性和方法。因为正向工程会丢失信息(例如关联通过Java集合实现),所以构建出的对象模型与原对象模型不一定一致第十三页,共38页。转换(zhuǎnhuàn)原则每一次转换都面临着风险,所以必须遵守一些原则每个转换对应唯一的判定准则:以改进系统响应时间为目标使系统易于扩展不能同时(tóngshí)考虑多个目标每个转换必须是局部的一次尽量改变少量方法和类尽量在一个子系统内进行修改第十四页,共38页。转换(zhuǎnhuàn)原则每一个转换必须与其他更改活动相隔离改变(gǎibiàn)性能的时候不应该增加新的功能增加新的功能时不需要考虑性能每个转换之后必须进行确认对象模型转换:更新顺序图并检查相关用例重构:运行对应类的测试用例增加了新的功能:构造新的测试用例第十五页,共38页。映射活动-优化对象设计(shèjì)模型优化访问路径:对多重关联的重复遍历,对关联多的一端的遍历,以及错误(cuòwù)放置的属性,这些都是导致系统效率低下的原因。第十六页,共38页。映射活动-优化对象(duìxiàng)设计模型关联的重复遍历标识经常被调用的操作(cāozuò),并在顺序图的帮助下检查这些多重关联遍历是否必须。第十七页,共38页。浏览器页面的滚动流畅度一直是衡量浏览器是否好用的一个重要指标。一个页面通常由Html,Css,Img,Js等组成,在内存中通过(tōngguò)Dom树来表示。<html><header/><body><text>helloworld</text></body></html>第十八页,共38页。浏览页面时,鼠标滚轮每滚动一下,页面重新绘制了n次,这样才能体现(tǐxiàn)流畅的滚动效果。每一次重新绘制,都需要对Dom树进行一次遍历,重新计算每个元素的位置,重新布局,这样严重影响了效率。解决办法1,如果只是滚动的话,其实元素之间的相对位置并没有发生改变,只需要记录元素相对位置,再加上横纵坐标的平移,重新绘制即可得到正确的视图。解决办法2,将页面完整渲染后保存成图像,滚动仅仅是图像的滚动。第十九页,共38页。将关联(guānlián)“多”的一端化简在二维图形绘制的时候,需要为屏幕中每一个像素点建立一个对象来保存相关信息。在具体渲染的时候,需要按照扫描线遍历每一个像素点,查看当前像素点是否与需要绘制的图形相交,或者处于图形内部,这涉及到排序,不好的排序会导致图形渲染效率低下。第二十页,共38页。错误放置的属性导致系统效率低下的另一个原因是过度建模,类中一些不需要的属性应该从模型中简单(jiǎndān)的去掉。第二十一页,共38页。映射活动-优化对象(duìxiàng)设计模型压缩对象:将对象变为属性,对象模型在经历了一些优化后,只剩下很少的属性或行为(xíngwéi),若这些类与其他的一个类关联,就可以将对象压缩为属性。第二十二页,共38页。映射(yìngshè)活动-优化对象设计模型延时高成本计算创建特殊对象常常是昂贵的,其实可以将对象的创建延时到实际需要使用的时候考虑一个Web页面上面有很多图片,但是(dànshì)并不是所有的图片在同一时间显示第二十三页,共38页。players.第二十六页,共38页。映射(yìngshè)活动-优化对象设计模型对代码编写(biānxiě)测试代码,由测试人员编写(biānxiě)将持久性存储对象映射(yìngshè)到数据库的表中publicvoidaddPlayer(Playerp){解决办法2,将页面完整渲染后保存成图像,滚动仅仅是图像的滚动。tournamnet表tournamentPlayer表player表映射活动(huódòng)-将契约映射到异常LeagueOwner表League表if(isPlayerAccepted(p))email=email;每个转换之后必须进行确认if(!isPlayerAccepted(p))一对(yīduì)多关联映射活动-优化对象设计(shèjì)模型采用缓存存放高成本计算结果在网页显示中,我们一般将Image图片解码成RGB格式的数据存储在内存缓存中,需要渲染的时候,直接从内存中读出,比再去解码一次会快很多。缓存有一定大小,可以(kěyǐ)按照最近最长使用的策略进行替换。第二十四页,共38页。映射(yìngshè)活动-将关联映射(yìngshè)到集合关联是UML中的概念,表示2个或多个对象之间有联系,但是不幸的是程序设计语言中并没有关联的概念,取而代之的是引用和集合引用:一个对象存储(cúnchǔ)另外一个对象的句柄集合:存储(cúnchǔ)几个对象的引用并排序第二十五页,共38页。单向(dānxiànɡ)一对一关联publicclassAdvertiser{privateAccountaccount;publicAdvertiser(){ account=newAccount(); }publicAccountgetAccount(){ returnaccount;}}第二十六页,共38页。一对一双向关联(guānlián)publicclassAdvertiser{privateAccountaccount;publicAdvertiser(){ account=newAccount(this);}publicAccountgetAccount(){ returnaccount;}}publicclassAccount{privateAdvertiserowner;publicAccount(Advertiserowner){ this.owner=owner; }publicAdvertisergetAdvertiser(){ returnowner;}}第二十七页,共38页。一对(yīduì)多关联publicclassAdvertiser{

privateSetaccounts;publicAdvertiser(){ account=newHashSet(); }publicvoidaddAccount(Accounta){ accounts.add(a); a.setOwner(this);}}publicclassAccount{privateAdvertiserOwner;publicvoidsetOwner(AdvertiserOwner){ this.owner=Owner; Owner.addAccount(this); }………….}第二十八页,共38页。多对多关联(guānliá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);

}}}第二十九页,共38页。受限关联(guānliá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); }}}第三十页,共38页。映射活动(huódòng)-将契约映射到异常面向对象语言没有对契约进行支持一般使用异常(yìcháng)机制来处理契约事故第三十一页,共38页。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());}}第三十二页,共38页。将契约映射到异常的启发式方案对代码编写(biānxiě)测试代码,由测试人员编写(biānxiě)着重对子系统接口进行测试着重考虑涉及到生命周期最长的对象的契约测试第三十三页,共38页。映射活动(huódòng)-将对象模型映射到持久存储将持久性存储对象映射(yìngshè)到数据库的表

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论