面向对象? 1 面向对象的目的是什么? (1)面向对象是从面向过程进化而来,进化过程中遇到了根本性问题。(说明它解决面向永远做不到的事情)(2)面向对象的追求:首先,完成功能需求。其次,追求设计出稳定性高,复用度高,弹性高的软件。(3)人的本性:懒惰。追求在需求变化中,尽可能做到,需求变化而修改变化最小; 2 面向对象中最大的挑战是什么?是需求变化发生时,我们怎样做到改动最小,依然能做到稳定性高,利用率高,弹性高的软件。这里体现出,完成功能这只是我们基本目标,但它却不是我们最大的挑战!同样,它所占用的时间也很小。我们大部分时间是用在了稳定性高,利用率高,弹性高。 3 追求的各元素的重要性比例。(好的软件的特征) 功能需求10 稳定性高 30 复用度高20 弹性高20 可扩展性高20 【---------- 目前 ----------- 】【-------- 将来(为变化、维护而生)----------- 】目前:功能需求:最低级别。稳定性:级别最高。重要性也最高。将来:复用度:高弹性度:高可扩展性:高说了半天,我首先想问,稳定性,复用度,弹性,可扩展性是什么搞清楚没有?是什么都没有搞清楚,那就啥也别搞了。每一。“是什么”的问题。【稳 定 性】1 软件在不同平台上运行时的稳定。2 性能的稳定性。【复 用 度】你制作软件时的所有的零件的再利用率。【弹 性】就是修改后,给软件带来的后遗症不。就是软件的免疫力强。搞它几下,不出问题。就好像皮肤一样,按它几下,揪它几下,它不会出问题。【可扩展性】如是其它因素刺激新需求产生,整个软件结构能否容纳新的变化,而改动很小。 它们追求在不同的方面想要追求的目标。稳定性:追求方向是软件的能力;复用度:追求方向是代码的能力;弹性与可扩展性:追求方向是软件的结构的能力; 4 怎样做到“两能+一度+三性”?两能:功能+性能;度:复用度;三性:稳定性+弹性+可扩展性;第一.具体是什么? 你覆盖的目的已经告诉我们:父类的,有的我们想要,有的我们不能(拥有)。你把它们再分类,反正都是鸭子,再把基类细分,如果我们拥有多继承的能力。我啥也不说了,眼泪花花的。好,上帝来了。====》接口来了。 一下,见到上帝就忘了,我们是来做什么来了?哈哈,我终于遇到了一个解决方案,这可是我的聪明才智才想到的,太不容易了,我得立马行到,把它搞成这个样子,怀都不怀疑一下。关键:你是来做什么的。每一个动作都搞成一个接口,文件也会变多,管理难度加大。能少则少啊!有的就没有必要搞成接口啊?办法:分类:(一般-------特殊) 终于:这种方案完美无缺了吧?首先,它能做到可扩展性增强。不管你再加入什么样的鸭子,只管从中继承就是了,如果没有的,你再加入新的接口,它对以前的没有影响。所以,这点上,我能做到,你随便加,我丝毫不受影响!完美吧!你就赞叹去吧!其次,我的复用度做到最大化。那么多接口,只要有的,你只管用就是了!只要你想用,我哪个都可以给你用!你说,复用率高不高!我不说。再次,弹性(包括放大(扩展),缩小(丢掉不要的)),都做到了最大化;最后,至于稳定性,你说高不高了?哈哈!(你肯定说,不知道!因为它太小了,就是运行起来也感觉不到,那你就生成1000个这样的程序试试,不够就再加到10000个。)哈,完美了吧,那就叫无懈可击! 辨析:首先,你确实已经拥有了这些优点!但是,并不代表你没有缺点!第一、 整个体系中,基本每处都有修改,如果你还在那认为,这种做法只是比较差劲点,也没有什么大不了的!那么,我问你?如果让你修改100个这样的类如何?你还美起来了吗?因为,只要你搞一个类,不管新的,还是旧的,它总是你修改才能做到。一句话:总是修改===错误!第二、 同样的方法名称,出现在那么多地方,你感觉舒服吗?如果你觉得还行,那么你最初的目的是什么?那你为什么不每一种鸭子写一个类呢?兜了一圈,又回到原处去把原来的错误再范上一便,心里才舒服!你要知道,重复,不再是一种失误!而是一咱错误!重复==错误两字:重复。第三、 你连什么是复用都没有搞清楚?还搞呢?你说什么?你敢再说一遍吗?你的复用做的是最差的一种!!!做了还不知道从哪里死的呢?还在那自我陶醉!唉,太可悲了。一种错误导致导致两种错误!反过来,这两种错误是由一种引起的! 蒙了吧!再也找不到北了!不过呢?做到这步,你已经很不容易了!想再高深一步,得努力哟!再说一遍,需求:稳定性好,复用度高,弹性高的系统?可是复用度很差!好话不说三遍!你目前的方案只解决了一部分问题,并不能解决全部!只是从一个问题走出来,却又跳进了另一个困难!(从不能获得多重继承跳进代码无法复用!)唉,被你逼得想死!跳楼去!别跳,告诉你一下,你接口可以复用?谁可以用?那是不假,但是,代码并没有复用?如果像基类一样,那才呢代码复用?这里我说的是,你没有做到代码的复用!明白?这意味着,每当需要改动时,你总得去追踪每一个定义此类行为的类。你累吗?这样,你愿意吗?如果你愿意,天天让你做这工作,以后! 天使来了:老方法:最原始的状态去寻找。设计原则。 第一、 可变部分,不可变部分分开!第二、 针对接口编程,而不是针对实现去编程!那就是有哪些接口,你先不考虑具休的类的实现,而是先实现接口!这样做有以下的好处!(稍后再详细道来1复用度高(表现在方法都已经实现到类中,我们只管用类就可以了,修改变少!另外,代码重复的问题得到很好的解决!先自目前,子类只是想得到它想要的行为就可以了,不管是在什么时候,编译时,还是运行时,它不管,它只想得到这种能力(方法呀)!)想一想,如果我们在编译时把行为给一个变量,那是什么?行为不是方法吗?不是编译死了吗?哈哈,再想一想!)说明: 设计原则:针对接口编程,不要针对实现编程!解释:首先用类来实现接口,再在设计其它的类时使用这个已“实现接口的类”;而不是在每一个类中去实现接口!这个原则给我们带来的好处:(1)避免代码重复!(2)复用度高!(3)修改量减少!还有很多,还没有想到!以后再说! 反过来想:你看接口这么多好处!那么我们以后把所有的方法都接口的形式!那不就完事了,还用得着这么哆嗦吗?想一想,别不动脑!(缺点)用接口实现的类来给其它类加入方法!这比起来继承来,还是要写一些代码的!(优点)利用组合,它获得了方法的能力(而回避免了多继承,太妙了,完全两种思路!),再就是它拥有了动态获取或改变方法行为能力的本事!你不感觉不可思议吗?动态改变它的行为!天啊! 设计行为方法时有两种来源:(1)组合;(2)继承;为什么我把组合放在第一位!想一想吧!所以说:把动态的,将来会变化的行为与稳定不会变化的开形为分开,再把那些动态变化的实现接口,这样它拥有了两者的优势! 前后两者的差别:(提高的最好办法=善于分析,比较,总结)前者:依赖于实现;后者:不依赖实现;下面是具体分析:先说组合方法的实现,首先要有这样的观念,实现类唯一依赖的就是一个接口,它只和接口打交道!子类也是只和接口打交道!子类-----》接口《-------接口实现类。 子类 接口实现类虽然我们在子类中用到了接口实现类字段,但是它的真正的意思是,用它这个类的接口的行为!因为你“接口实现类”已实现这个接口了!所以你有我(子类)的形为了!所以说,你接口实现类与我们的子类没有任何绑定关系。没有你也没有关系,只要我能找到一个实现实现这个接口的类,就可以替代你!就在这替代之间,我(使用接口的子类)丝毫不受影响,你做你的,我做我的!(我们要明白,实现接口类的作用:它就是让我把方法实现了,好让你们共用啊!你们不用写实现这样的接口,就可以使用了!免得方法得复出现(重复定义)!这是关键,很松耦合的哟!)再说依赖于实现的问题:什么叫依赖于实现?就是你的方法是建立在必须你已经实现的基础上的(不管怎么实现,反正你已有了这样的方法!要么你实现,要么你父类实现。总之得有实现!问题的关键是,我们不能改变这些方法!所以,它依赖于实现)。方法再谈谈以前的实现:具休看你与我有什么不同,到底不同到哪里?行为的来源:(1)组合;(2)继承;(3)实现接口! 类:有两种东西!(1) 数据;(2)行为;类:有两个时代!(1) 编译时代;(2)运行时代;这四个东西可真是宝贝啊。每一个不同的东西,都有它不同的特点,我们怎样利用它的特点!来为我们服务!它们的特点分析: 针对***编程? 如”针对实现编程”、“针对超类型编程”、“针对接口编程”。这主要的差别是:针对实现编程就是你编程中只能用这一种东西,而同族的其它东西不能用(也就说,你和具体的一种类型绑定在一起了)。针对超类型与针对接口编程都没有与哪一个具体的类型绑定!它两个的差别主要在于:接口更好,更强! “硬编码与动态加载”的方式来实现方法的差别!一句话:“针对实现编程”就是针对某一个“具体的类”编程!特点:写的这段代码与具体的类绑定在一起!它这里的“针对”是指“代码中的引用变量”。换句话说:针对***编程就是在代码中“你想让你的变量能不能指向同族类型的对象”。另一种说法:绑定死,不具有灵活性就是针对实现编程!