




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
将模型映射到代码第一页,共三十八页,2022年,8月28日导言如果设计模式的选择和类接口规格说明工作做的足够仔细,那么现存大部分设计问题可以解决,但是将模型映射到代码时会产生很多问题(违反契约,随意添加参数,交付压力等),本章介绍一些将模型映射到代码的方法,提高系统质量第二页,共三十八页,2022年,8月28日对象设计活动图第三页,共三十八页,2022年,8月28日映射概述优化类模型减少关联重数加快查询速度,增加冗余关联提高有效性将关联映射到集合上将关联映射到源代码上将契约映射到异常上描述违反契约的操作行为将类模型映射到存储模式上选择存储策略,将类模型映射到存储模式上第四页,共三十八页,2022年,8月28日映射的概念转换的类型模型转换:优化原始模型,如将单一属性转化为类(将地址字符串转化为包含街道,邮编,城市,国家等属性的类)重构:类似模型转换,代码级别的转换第五页,共三十八页,2022年,8月28日映射的概念正向工程:产生与对象模型对应的源代码模板逆向工程:产生与源代码对应的对象模型,主要在系统设计方案丢失时使用第六页,共三十八页,2022年,8月28日模型转换模型转换作用于某一模型上,以产生另一模型,其目的是简化或优化原有模型,转换可能增加,删除,修改类,方法,以及属性。需同步更新对象设计模型。第七页,共三十八页,2022年,8月28日重构重构是对源代码的转换,在不影响系统行为的前提下,提高代码的可读性和可修改性重构好处容易阅读所有逻辑都只在唯一地点指定新的改动不会危及现有的行为简单的表达条件逻辑第八页,共三十八页,2022年,8月28日重构征兆三次法则:如果你重复拷贝某段代码超过3次,考虑重构数量法则:如果某个方法的实现超过20行,考虑重构重构时机在添加新功能时进行重构.在修改bug时进行重构在代码复审时进行重构.什么时候不易进行重构现有的程序无法运行,此时应该是重写程序,不是重构程序到了最后的交付期限第九页,共三十八页,2022年,8月28日重构与设计重构与设计是互补的,程序应该是先设计,后编码。设计上的不足可以用重构来弥补,但不应该因为有重构而忽视设计。如果能很容易的通过重构来适应需求的变化,那么就不必过度的设计,当需求改变时再重构代码。第十页,共三十八页,2022年,8月28日第一次重构后publicclassUser{protectStringemail;}publicclassStudentextendsUser{//....}publicclassTeacherextendsUser{//....}
第一次重构前publicclassStudent{privateStringemail;//....}publicclassTeacher{privateStringemail;//....}第十一页,共三十八页,2022年,8月28日
第二次重构前publicclassUser{protectStringemail;}publicclassStudentextendsUser{publicStudent(Stringemail){this.email=email; }}
第二次重构后publicclassUser{privateStringemail;publicUser(Stringemail){this.email=email; }}publicclassStudentextendsUser{publicStudent(Stringemail){super(email); }}第十二页,共三十八页,2022年,8月28日正向工程与逆向工程正向工程:保持对象设计模型与源代码的高度一致,减少在实现期间引入的错误数。如将UML模型每个属性映射到Java类中某个私有字段以及get和set方法上将UML模型每个方法映射到Java类中某个方法上逆向工程:根据源代码产生对象模型,是正向工程的逆过程为每一个代码类构建一个UML类并增加属性和方法。因为正向工程会丢失信息(例如关联通过Java集合实现),所以构建出的对象模型与原对象模型不一定一致第十三页,共三十八页,2022年,8月28日转换原则每一次转换都面临着风险,所以必须遵守一些原则每个转换对应唯一的判定准则:以改进系统响应时间为目标使系统易于扩展不能同时考虑多个目标每个转换必须是局部的一次尽量改变少量方法和类尽量在一个子系统内进行修改第十四页,共三十八页,2022年,8月28日转换原则每一个转换必须与其他更改活动相隔离改变性能的时候不应该增加新的功能增加新的功能时不需要考虑性能每个转换之后必须进行确认对象模型转换:更新顺序图并检查相关用例重构:运行对应类的测试用例增加了新的功能:构造新的测试用例第十五页,共三十八页,2022年,8月28日映射活动-优化对象设计模型优化访问路径:对多重关联的重复遍历,对关联多的一端的遍历,以及错误放置的属性,这些都是导致系统效率低下的原因。第十六页,共三十八页,2022年,8月28日映射活动-优化对象设计模型关联的重复遍历标识经常被调用的操作,并在顺序图的帮助下检查这些多重关联遍历是否必须。第十七页,共三十八页,2022年,8月28日浏览器页面的滚动流畅度一直是衡量浏览器是否好用的一个重要指标。一个页面通常由Html,Css,Img,Js等组成,在内存中通过Dom树来表示。<html><header/><body><text>helloworld</text></body></html>第十八页,共三十八页,2022年,8月28日浏览页面时,鼠标滚轮每滚动一下,页面重新绘制了n次,这样才能体现流畅的滚动效果。每一次重新绘制,都需要对Dom树进行一次遍历,重新计算每个元素的位置,重新布局,这样严重影响了效率。解决办法1,如果只是滚动的话,其实元素之间的相对位置并没有发生改变,只需要记录元素相对位置,再加上横纵坐标的平移,重新绘制即可得到正确的视图。解决办法2,将页面完整渲染后保存成图像,滚动仅仅是图像的滚动。第十九页,共三十八页,2022年,8月28日将关联“多”的一端化简在二维图形绘制的时候,需要为屏幕中每一个像素点建立一个对象来保存相关信息。在具体渲染的时候,需要按照扫描线遍历每一个像素点,查看当前像素点是否与需要绘制的图形相交,或者处于图形内部,这涉及到排序,不好的排序会导致图形渲染效率低下。第二十页,共三十八页,2022年,8月28日错误放置的属性导致系统效率低下的另一个原因是过度建模,类中一些不需要的属性应该从模型中简单的去掉。第二十一页,共三十八页,2022年,8月28日映射活动-优化对象设计模型压缩对象:将对象变为属性,对象模型在经历了一些优化后,只剩下很少的属性或行为,若这些类与其他的一个类关联,就可以将对象压缩为属性。第二十二页,共三十八页,2022年,8月28日映射活动-优化对象设计模型延时高成本计算创建特殊对象常常是昂贵的,其实可以将对象的创建延时到实际需要使用的时候考虑一个Web页面上面有很多图片,但是并不是所有的图片在同一时间显示第二十三页,共三十八页,2022年,8月28日映射活动-优化对象设计模型采用缓存存放高成本计算结果在网页显示中,我们一般将Image图片解码成RGB格式的数据存储在内存缓存中,需要渲染的时候,直接从内存中读出,比再去解码一次会快很多。缓存有一定大小,可以按照最近最长使用的策略进行替换。第二十四页,共三十八页,2022年,8月28日映射活动-将关联映射到集合关联是UML中的概念,表示2个或多个对象之间有联系,但是不幸的是程序设计语言中并没有关联的概念,取而代之的是引用和集合引用:一个对象存储另外一个对象的句柄集合:存储几个对象的引用并排序第二十五页,共三十八页,2022年,8月28日单向一对一关联publicclassAdvertiser{privateAccountaccount;publicAdvertiser(){ account=newAccount(); }publicAccountgetAccount(){ returnaccount;}}第二十六页,共三十八页,2022年,8月28日一对一双向关联publicclassAdvertiser{privateAccountaccount;publicAdvertiser(){ account=newAccount(this);}publicAccountgetAccount(){ returnaccount;}}publicclassAccount{privateAdvertiserowner;publicAccount(Advertiserowner){ this.owner=owner; }publicAdvertisergetAdvertiser(){ returnowner;}}第二十七页,共三十八页,2022年,8月28日一对多关联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日多对多关联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日受限关联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日映射活动-将契约映射到异常面向对象语言没有对契约进行支持一般使用异常机制来处理契约事故第三十一页,共三十八页,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日将契约映射到异常的启发式方案对代码编写测试代码,由测试人员编写着重对子系统接口进行测试着重考虑涉及到生命周期最长的对象的契约测试第三十三页,共三十八页,2022年,8月28日映射活动-将对象模型映射到持久存储将持久性存储对象映射到数据库的表中主关键字,候选关键字(user表)外关键字(game表)Firstnameloginemail“alice”am789am789@“piter”jkhhhpiter@“zhang”zz101z
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2025学年高中语文第六单元感性与理性同样有力2春末闲谈实战演练苏教版选修现代散文蚜
- 粤教版(2019)必修二 《移动终端的工作原理》教学设计
- 2024-2025学年高中英语Unit3AtasteofEnglishhumourSectionⅢGrammar课后篇巩固提升新人教版必修4
- 2024-2025学年高中数学第1章导数及其应用1.1变化率与导数课时作业2导数的概念新人教A版选修2-2
- Unit 9 Section A 1a~2d教学设计 -2024-2025学年人教版英语八年级下册
- 第 7课 隋唐制度的变化与创新 教学设计-2023-2024学年高一上学期统编版(2019)必修中外历史纲要上
- Module 5 Unit 1 Can you be my Chinese pen friend?(教学设计)-2024-2025学年外研版(三起)英语六年级上册
- Unit 1 People around us Reading 教学设计 2024-2025学年沪教版(2024)七年级英语下册
- Starter Unit 3 课时2 Section A(Pronunciation)(教学设计)2024-2025学年人教版(2024)七年级英语上册
- 17 科技发展 造福人类《科技改变世界》(教学设计)-部编版(五四制)道德与法治五年级上册
- T-GDASE 0042-2024 固定式液压升降装置安全技术规范
- 气血疏通中级班教材
- 2024福建省厦门市总工会拟录用人员笔试历年典型考题及考点剖析附答案带详解
- 四川省康定市大槽门金矿资源储量核实报告
- DL-T-805.1-2011火电厂汽水化学导则第1部分:锅炉给水加氧处理导则
- 选择性必修二《Unit 4 Journey across a vast land》单元教学设计
- 2024年一年级数学下册教学计划15篇
- 岭南版六年级美术下册教学工作计划
- 《电力系统自动化运维综合实》课件-2M 同轴电缆制作
- 《会计学原理》习题及答案
- 门诊常见疾病护理常规课件
评论
0/150
提交评论