ImageVerifierCode 换一换
格式:PPT , 页数:37 ,大小:361KB ,
资源ID:11066912      下载积分:12 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/11066912.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(面向对象设计原则ppt讲课稿.ppt)为本站上传会员【w****g】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

面向对象设计原则ppt讲课稿.ppt

1、 ,*,面向对象设计原则,宋俊杰,目标,重新认识一下面向对象,了解面向对象设计原则,重新认识面向对象,通过面向对象编程语言,(OOPL),认识到的面向对象,,并不是面向对象的全部,甚至只是浅陋的面向对象,不是使用了面向对象语言就是实现了面向对象的设计和开发,我们不能依赖编程语言的面向对象机制来掌握面向对象,OOPL,的三大机制“封装、继承、多态”可以表达面向对,象的概念,但是没有刻画出面向对象的核心精神。,可以用这三大机制做出好的“面向对象设计”也可以做出差的“面向对象的设计”,.,重新认识面向对象,OOPL,没有回答面向对象的根本性问题,-,我们为什么要面向对象?我们应该怎样实现好的面向对象

2、我们应该遵循什么样的原则?,任何一个严肃的面向对象程序员都要系统的学习面向对象知识,单纯从编程语言上获得的面向对象知识,不能够胜任面向对象设计与开发,.,举一个例子,示例场景:,我们需要设计一个人事管理系统,其中的一个功能是对各种不同的类型员工,计算其当月的工资,-,不同类型的员工,拥有不同的薪金计算制度。,机构化做法,1,。,获得人事系统中所有可能的员工类型,2,。,根据不同的员工类型所对应的不同薪金制度,计算其工资,enum EmployeeType,Engineer;,Sales;,Manager;,/,计算工资程序,If(type=EmployeeType.Enginner),els

3、e if(type=EmployeeType.Sales),面向对象设计,1,根据不同员工设计不同的类,并使这些类继承自一个,Employee,抽象类,其中有一个抽象方法,getSalary.,2,在各个不同的员工中,根据自己的薪金制度,重写,(override)getSalary,方法,abstract class Employee,public abstract int getSalary();,class Sales extends Employee,public int getSalary(),.,class Engineer extends Employee,public int g

4、etSalary(),/,显示工资程序,Employee e=emFactory.getEmployee(id);,System.out.println(e.getSalary();,现在需求变了,示例场景:,随着业务的规模的拓展,又出现了更多类型的员工,比如钟点工、计件工,等等,这对系统提出了新的挑战,原有的程序要改变。,结构化做法:,几乎所有涉及到员工类型的地方都要做改变,这些代码都要重新编译重新部署,面向对象做法:,只要添加新的员工类,让其继承自,Employee,抽象方法,并重写,getSalary(),方法,然后在,EmployeeFactory.getEmployee(),方法中根

5、据相关条件产生新的员工类型就可以了。其他地方不需要改变,.,重新认识,对于前面的例子,从宏观上看,面向对象的构建方式跟更能适应软件的变化,能将变化所带来的影响减小到最小。,从微观层面来看,面向对象的方式更强调各个类的“责任”,新增员工类型不会影响原来员工类型的实现代码,这是符合真实世界的,也更能控制变化所影响的范围,毕竟,Engineer,类不应该为新增的“钟点工”来买单,对象是什么?,-,从概念层面讲,对象是某种责任的抽象。,-,从规格层面讲,对象是一系列可以被其他对象使用的接口,(API),。,-,从语言实现层面来看,对象封装了代码和数据,(,行为和状态,),。,有了这些认识之后,怎样才能

6、设计“好的面向对象”?,-,遵循一定的面向对象设计原则,-,熟悉一些经典的面向对象设计模式,.,面向对象设计原则,针对接口编程,而不是针对实现编程,-,客户无需知道所使用对象的特定类型,只需知道对象拥有客户所期望的接口,有限使用组合,而不是类继承,-,类继承通常为“白箱复用”,对象组合通常成为“黑箱复用”。继承在某种程度上破坏了封装性,子类父类耦合度高;而对象组合则只要求被组合对象具有良好定义的接口,耦合度低,。,封装变化点,-,使用封装来创建对象之间的分界层,让设计者可以在分界层的一侧进行修改,而不会对另一侧产生不良的影响,从而实现层次间的松耦合。,具体的设计原则,单一职责原则(,SRP,)

7、开放封闭原则(,OCP,),Liskov,替换原则(,LSP,),依赖倒置原则(,DIP,),接口隔离原则(,ISP,),单一职责原则,就一个类而言应该仅有一个引起它变化的原因。,当需求变化时,该变化就会反映为类的职责变化。如果一个类承担了多个职责,那么引起它变化的原因就有多个。,如果一个类承担的职责过多,就等于把这些职责耦合在了一起。一个职责的变化就可能会削弱,或者抑制这个类完成其他职责的能力,.,如果需求变化总是引起多个职责同时变化,那么我们就不必分离它们,推论:只有变化实际发生时才有意义,.,开放封闭原则,OCP,软件实体,(,类、模块、函数等等,),应该是可以扩展的,但是不可以修改的

8、对扩展是开放的。当需求 变化时,我们可以对模块进行扩展,使其具有能够满足那些变化的行为。,-,对更改是封闭的。对模块进行修改时不必改动模块的源代码(并非绝对,但是应该是最小限度),例子,Interface Shape,public void draw(),class Square extends Shape,public void draw(),class Circle extends Shape,public void draw(),class Test,public static void main(String args),List shapes=,/,绘制所有图形,Iterato

9、r iter =shapes.iterator();,while(iter.hasNext(),(Shape)iter.next().draw();,如果要绘制一个新的形状,只需要增加一个新的,Shape,的派生类就行了,.(,系统的其他地方会有一些改动,但是这里没有改动,),我说谎了!,上面的例子并不是,100%,封闭的。如果我们要求所有的,圆必须在正方形之前绘制,我们就要改动,Test,的代码了。,一般而言,无论模块多么“封闭”,都会存在一些无法对之封闭的变化。没有对所有情况都贴切的模型。,如何对待?,设计人员必须对于他设计的模块应对哪种变化封闭做出选择。必须先猜测出最有可能发生变化的种类

10、然后构造抽象来隔离那些变化。,有时不容易做到,代价有时会比较高,我们希望把,OCP,应用限定在可能发生的变化上。,结论,开发人员应该仅仅对程序中呈现出频繁变化的那些部分做出抽象。拒绝不成熟的抽象和抽象本身一样重要。,(,对变化进行封装,),Liskov(,里氏,),替换原则(,LSP,),子类型必须能够替换掉它们的基类型,一个微妙的违规,正方形是矩形(,is-a,关系)。正方形继承矩形。,public class Rectangle,private double h;,private double w;,public void setHeight(double h),this.h=h;,pu

11、blic void setWidth(double w),this.w=w;,public double getHeight(),return this.h;,public double getWidth(),return this.w;,public double area(),return this.getHeight()*this.getWidth();,public class Square extends Rectangle,private double h;,private double w;,public void setHeight(double h),this.h=h;,th

12、is.w=h;,public void setWidth(double w),this.w=w;,this.h=w;,public double getHeight(),return this.h;,public double getWidth(),return this.w;,public class Test,public void fun(Rectangle r),r.setHeight(1);,r.setWidth(2);,System.out.println(r.area();,public static void main(String args),Rectangle r =new

13、 Rectangle();,Rectangle s=new Square();,Test t=new Test();,/t.fun(r);,t.fun(s);,如果,fun,方法的参数,Rectangle,指向的是一个正方形,产生的结果就会让人产生迷惑。,结果是,4,!对于写,fun,方法的人来讲,他会认为应该是,2.,IS-A,是关于行为的,Square,对象的行为方式和函数,fun,所期望的,Rectangle,对象的行为方式不相容,.,对象的行为方式才是软件真正所关注的问题,.(,关心是不是想象中的那种行为,),OOD,中,IS-A,关系是就行为方式而言的,.,接受缺陷,大多数情况下,接

14、受一个多态行为中的微妙错误会比试着修改设计使之完全符合,LSP,更为有利,.,接受缺陷而不是去追求完美是一个工程上权衡的问题,.,好的工程师知道如何接受缺陷比追求完美更有利,不过,不应该轻易放弃,LSP,原则,我们经常用的例子,struts,类,RequestProcessor,里面的代码,:,protected ActionForward processActionPerform(HttpServletRequest request,HttpServletResponse response,Action action,ActionForm form,ActionMapping mapping

15、),throws IOException,ServletException,try,return(,action.execute(mapping,form,request,response),);,catch(Exception e),return(processException(request,response,e,form,mapping);,注意红色部分,依赖倒置原则,DIP,要依赖于抽象不要依赖于具体,抽象不应该依赖于细节,细节应该依赖于抽象,另一种说法,:,要对接口编程,不要针对实现编程,.,另一种说法的解释,应当使用,java,接口和抽象,java,类进行变量的类型声明,参量的类

16、型声明,方法的返回类型声明,以及数据类型的转换等,.,Vector employees=new Vector();,应该声明为,List employees=new Vector();,好处是,将,Vector,类型转会为,ArrayList,需要最小的改动,.,怎样做到,以抽象方式耦合是依赖倒转原则的关键,.,一个抽象耦合关系总要涉及具体类从抽象类继承,并且保证任何引用到基类的地方都可以换成其子类,因此里氏替换原则是依赖倒置原则的基础,.,并非完美,抽象层次上的耦合虽然有灵活性,但也带来了额外的复杂性,.,如果一个具体类发生变化的可能性非常小,那么抽象耦合发挥的好处便十分有限,这时使用具体耦

17、合反而会更好,接口隔离原则,ISP,接口的污染,一个没有经验的设计师往往想节省接口的数目,将几个功能相近或功能相关的接口合并,并将这看成是代码优化的一部分,.,接口隔离原则,ISP,定义,:,从一个客户类的角度来讲,:,一个类对另外一个类的依赖性应当是建立在最小接口上的,.,使用多个专门的接口比使用单一的总接口要好,.,例子,例子,(,单一职责,),总结,“,开,-,闭,”,原则,(OCP),对可变性封装,里氏替换原则,(LSP),如何进行继承,依赖倒置原则,(DIP),针对接口编程,接口隔离原则,(ISP),恰当的划分接口和角色,我所理解的好软件,满足需求,能够应对变化,结束,谢谢,我所理解的好软件,满足需求,能够应对变化,结束,谢谢,

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服