



免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
为何Java中承继决意是有害的大决意好的治理者象躲避瘟疫一样来防备使用OK承继(extends 关涉)。真实80%的代码应该彻底用interfaces写,而不是通过extends。“Java治理形式”一书详细阐述了怎么用接口承继代替OK承继。这篇文章形容治理者为何会这么作。Extends是有害的;大约关于Charles Manson这个级其他不是,可是十足糟糕的它应该退职何笼统或许的时分被隐匿。“JAVA治理形式”一书花了很大的部分计议用interface承继代替OK承继。好的治理者在他的代码中,大部分用interface,而不是详细的基类。本文计议为何治理者会如许适量,并且也先容一些基于interface的编程基础。接口(Interface)和类(Class)?一次,我列入一个Java用户组的集会。在集会中,Jams Gosling(Java之父)做动员人发言。在那令人难忘的Q&A部分中,有人问他:“假如你重新布局Java,你想扭转什么?”。“我想扔掉classes”他回答。在笑声平息后,它标明说,真正的题目不是由于class本身,而是OK承继(extends) 关涉。接口承继(implements关涉)是更好的。你应该尽笼统或许的防备OK承继。获患了灵便性为何你应该防备OK承继呢?第一个题目是熟谙的使用详细类名将你固定到特定的OK,给底层的扭转增多了不消要的艰难。在目前的迅速编程门径中,核心是并行的治理和开发的观点。在你详细治理挨次前,你入手下手编程。这个武艺不同于古板门径的模式-古板的门径是治应该该在编码入手下手前OK-可是良多告捷的项目已经证实你大要更疾驶的开发高风致代码,相关于古板的陈陈相因的门径。可是在并行开发的核心是主意灵便性。你不得不以某一种门径写你的代码以至于最新发明的必要大要尽笼统或许不有痛苦的归并到已有的代码中。胜于OK你大约必要的特色,你只要OK你熟谙必要的特色,并且过火的对变更的包涵。假如你不有这类灵便,并行的开发,那简直不笼统或许。关于Inteface的编程是灵便布局的核心。为了注明为何,让咱们看一下当使用它们的时分,会发生什么。考虑下面的代码:f()LinkedList list = new LinkedList();/.g( list );g( LinkedList list )list.add( . );g2( list )假定一个关于疾驶究诘的必要被提出,以至于这个LinkedList不克不及够贪图。你必要用HashSet来代替它。在已有代码中,变更不克不及够部分化,因为你不光仅必要修正f()也必要修正g()(它带有LinkedList参数),并且还有g()把列表传递给的任何代码。象下面如许重写代码:f()Collection list = new LinkedList();/.g( list );g( Collection list )list.add( . );g2( list )如许修正Linked list成hash,笼统或许只不过简单的用new HashSet()代替new LinkedList()。就如许。不有其他的必要修正的地方。作为另一个例子,对照下面两段代码:f()Collection c = new HashSet();/.g( c );g( Collection c )for( Iterator i = c.iterator(); i.hasNext() )do_something_with( i.next() );和f2()Collection c = new HashSet();/.g2( c.iterator() );g2( Iterator i )while( i.hasNext() )do_something_with( i.next() );g2()门径那时大要遍历Collection的派生,就像你大要从Map中失掉的键值对。到底上,你大要写iterator,它发生发火数据,代替遍历一个Collection。你大要写iterator,它从测试的框架梗概文件中失掉消息。这会有弘大的灵便性。耦合关于OK承继,一个更加关头的题目是耦合-令人烦躁的请托,就是那种挨次的一部分关于另一部分的请托。全局变量提供经典的例子,证实为何强耦合会引起费事。比如,假如你扭转全局变量的种别,那么凡有效到这个变量的函数大约都被影响,所以凡有这些代码都要被查看,变更和重新测试。并且,凡有效到这个变量的函数通过这个变量相互耦合。也就是,假如一个变量值在难以使用的时分被扭转,一个函数大约就不正确的影响了另一个函数的举止。这个题目显然的匿伏于多线程的挨次。作为一个治理者,你应该奋力最小化耦合关涉。你不克不及一并打消耦合,因为从一个类的对象到另一个类的对象的门径调用是一个松耦合的模式。你不笼统或许有一个挨次,它不有任何的耦合。然则,你大要通过遵守OO划定规矩,最小化一定的耦合(最紧要的是,一个对象的OK应该彻底匿伏于使用他的对象)。比如,一个对象的实例变量(不是常量的成员域),应该老是private。我意思是某段时期的,无例外的,不竭的。(你大要无意偶尔无效地使用protected门径,可是protected实例变量是可憎的事)相通的启事你应该不消get/set函数-他们关是以一个域公用只不过使人感到过于繁冗的门径(诚然前往润饰的对象而不是基础种别值的访问函数是在某些情况下是由启事的,那种情况下,前往的对象类是一个在治理时的关头抽象)。这里,我不是书怄气。在我本人的任务中,我发明一个直接的相互关涉在我OO门径的峻厉之间,疾驶代码开发和简单的代码OK。不管何时我违犯核心的OO原则,如OK匿伏,我毕竟重写那个代码(一般因为代码是不可调试的)。我不有工夫重写代码,所以我遵循那些划定规矩。我珍爱的彻底实用?我对干净的启事不有兴趣。脆弱的基类题目那时,让咱们使用耦合的观点到承继。在一个用extends的承继OK系统中,派生类是非常亲昵的和基类耦合,当且这类亲昵的毗连是不冀望的。治理者已经使用了外号“脆弱的基类题目”去形容这个举止。基础类被认为是脆弱的是,因为你在看起来安全的情况下修正基类,可是当从派生类承继时,新的举止大约引起派生类出现违抗零乱。你不克不及通过简单的在隔离下查看基类的门径来判袂基类的变更是安全的;而是你也必需看(和测试)凡有派生类。并且,你必需查看凡有的代码,它们也用在基类和派生类对象中,因为这个代码大约被新的举止所打破。一个关于基础类的简单变更笼统或许招致整个挨次不可垄断。让咱们一起查看脆弱的基类和基类耦合的题目。下面的类extends了Java的ArrayList类去使它像一个stack来运行:class Stack extends ArrayListprivate int stack_pointer = 0;public void push( Object article )add( stack_pointer+, article );public Object pop()return remove( -stack_pointer );public void push_many( Object articles )for( int i = 0; i articles.length; +i )push( articlesi );甚至一个象如许简单的类也有题目。思忖当一个用户均衡承继和用ArrayList的clear()门径去弹出堆栈时:Stack a_stack = new Stack();a_stack.push(1);a_stack.push(2);a_stack.clear();这个代码告捷编译,可是因为基类不晓得关于stack指针堆栈的情况,这个stack对象目前在一个未定义的状态。下一个关于push()调用把新的项放入索引2的位置。(stack_pointer的目前值),所以stack无效地有三个元素-下边两个是渣滓。(Java的stack类正是有这个题目,不要用它).对这个令人厌烦的承继的门径题方针贪图方法是为Stack覆盖凡有的ArrayList门径,那大要修正数组的状态,所以覆盖正确的垄断Stack指针梗概抛出一个例外。(removeRange()门径关于抛出一个例外一个好的候选门径)。这个门径有两个毛病。第一,假如你覆盖了凡有的器械,这个基类应该真正的是一个interface,而不是一个class。假如你不消任何承继门径,在OK承继中就不有这一点。第二,更紧要的是,你不克不及够让一个stack支持凡有的ArrayList门径。比如,令人懊恼的removeRange()不有什么感召。仅有OK无用门径的合理的阶梯是使它抛出一个例外,因为它应该永远不被调用。这个门径无效的把编译舛误成为运行舛误。不好的门径是,假如门径只不过不被定义,编译器会输出一个门径未找到的舛误。假如门径具有,可是抛出一个例外,你只要在挨次真正的运行时,你能力够发明调用舛误。关于这个基类题方针一个更好的贪图方法是封装数据布局代替用承继。这是新的和改进的Stack的版本:class Stackprivate int stack_pointer = 0;private ArrayList the_data = new ArrayList();public void push( Object article )the_data.add( stack_poniter+, article );public Object pop()return the_data.remove( -stack_pointer );public void push_many( Object articles )for( int i = 0; i high_water_mark )high_water_mark = current_size;super.push( article );publish Object pop()-current_size;return super.pop();public int maximum_size_so_far()retur
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度农村涵洞改造施工合同
- 2025版导游领队带团全程服务合同范本
- 2025版建筑消防技术咨询服务与改造协议
- 二零二五年度脚手架施工工程结算与支付合同
- 2025版汽车融资租赁车辆租赁合同模板修订版
- 二零二五年度货物运输保险协议:物流企业货物保险合同
- 二零二五年场部保密协议及保密信息保密义务履行监督合同
- 2025版江苏智能交通系统工程合同
- 2025版汽车租赁公司车辆股份买卖合作协议
- 2025版婚礼化妆服务及产品销售合同
- 敷尔佳创业板IPO获批格林生物递交招股书
- 汽车检测与维修技术专业企业调研报告
- 医学腺垂体功能减退症(0001)专题课件
- 国家级自然保护区科学考察技术方案
- 危险化学品培训教材PPT
- 叠片机说明书
- 磷酸钠安全周知卡、职业危害告知卡、理化特性表
- 知名投资机构和投资人联系方式汇总
- 循环流化床锅炉设备及系统课件
- (完整word版)教育部发布《3-6岁儿童学习与发展指南》(全文)
- 施工组织方案(高压旋喷桩内插h型钢)新0319教学文案
评论
0/150
提交评论