bluevoyage的专栏

我向往淡蓝色的未来 我体味淡蓝色的静谧 我永远都要争取机会 我希翼创造光彩未来!

用户操作
[即时聊天] [发私信] [加为好友]
姓名ID:bluevoyage
132611次访问,排名627好友0人,关注者0
bluevoyage的文章
原创 124 篇
翻译 3 篇
转载 2 篇
评论 241 篇
BlueVoyage的公告
月 [下月] [上月]
http://www.hrtsea.com/bbs/Images/fish.swf">http://www.hrtsea.com/bbs/Images/fish.swf">http://www.hrtsea.com/bbs/Images/fish.swf">http://www.hrtsea.com/bbs/Images/fish.swf">http://www.hrtsea.com/bbs/Images/fish.swf">http://www.hrtsea.com/bbs/Images/fish.swf">

天气预报

最近评论
sap99:www.sap99.com/,SAP99资料多多

SAP免费资料下载
http://www.sap99.com

有很多的学习资料,推荐一下,
hacklew1985:还不错
mosquitowenzi:觉得科蓝公司咋样?科蓝公司的技术如何?
QQ爱:没我棒
消费下:我的妈妈啊 烂作文啊 我太伤脑筋了啊 我实在是 不知道杂写啊 这样是在浪费我的时间啊 我烦 啊~!~!~!~!~!~~!~~!~~!~!~!~!~!~!~我找的东西就是没有啊 叫 我杂办 啊 老师问我的时候我没有写那杂办 啊 星期一就要交 啊 大哥啊 我!~!~!~!~!~!~!~!~!~!多不知道说些什么啊 有关于2008年的银川 就告诉我啊 谢谢了啊 !~!~!~!~!~!~!~!我实在……
文章分类
收藏
    相册
    bluevoyage
    实用工具
    CSDN搜索
    IP查询手机号查询
    万年历
    神州龙地图
    收藏
    CSDN--模式应用和实例专题
    IT写作社区
    wiki.csdn.net
    www.cnblogs.com
    blogers of csdn
    Java Project & Python
    毒药的写字本子
    blogers of smth.org
    听着音乐,学着java
    index of blogers of smth.org
    Java服务器开发之路
    冷萧寒@Blogging-Java
    最新的J2EE新闻和技术文档
    电脑技术,学习历程
    被人类社会放大的差异
    corp.
    ibm.com : Java 专区
    www.oracle.com/cn/
    赛迪网 -软件与服务: 产业透视
    赛迪网 -软件与服务: 新闻观察
    group
    UML软件工程组织
    上海软件在线
    全国双软认定
    OTHERS
    广 告 狂 热 者
    TAOUP初译稿
    ngnr的专栏
    博文视点书友论坛
    程序无间道
    袁德俊的专栏
    tech.
    BBS 水木清华站Blog目录
    ChinaJavaWorld.com技术论坛
    java摘录笔记
    Java研究组织
    Matrix-与Java共舞
    microsoft.com/china/MSDN/
    Oracle Corp. Java 开发中心
    springframework.org
    SpringFramework中文论坛
    www.qca.cn
    松耦合空间
    赛迪网>技术天地>精彩专题
    网站设计与开发
    网页设计师
    蓝色理想
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 为什么extends是有害的(二)收藏

    新一篇: 使用 Hibernate 将 Java 对象持久保存到 IBM DB2 通用数据库中 | 旧一篇: 为什么extends是有害的(一)

    为什么extends是有害的(二)
    2003年8月31日  作者:neo 


    [/接上一篇]
    有一天,有人也许运行这个代码并且注意到Stack没有运行的如想象的那么快,并且能够在重负荷下使用。你能够重写Stack,以至于它不用ArrayList并且继续提高Stack的效率。这是新的倾向的和有意义的版本:
    [/代码]
    class Stack
    {
         private int stack_pointer = -1;
         private Object[] stack = new Object[1000];

         public void push( Object article )
    {
             assert stack_pointer < stack.length;
            
             stack[ ++stack_pointer ] = article;
          }

          public Object pop()
          {
               assert stack_pointer >= 0;
               return stack[ stack_pointer-- ];
           }
       
           public void push_many( Object[] articles )
           {
               assert ( stack_pointer + articles.length ) < stack.length;
           
               System.arraycopy( articles, 0, stack, stack_pointer + 1, articles.length );
               Stack_pointer += articles.length;
           }
    }
    [/代码]

    注意到push_many不再多次调用push()—它做块传输。新的Stack运行正常;事实上,比前一个版本更好。不幸的是,派生类Monitorable_stack不再运行,因为如果push_many()被调用,它不正确的跟踪堆栈的使用(push()的派生类版本不再通过继承的push_many()方法调用,所以push_many()不再更新high_water_mark)。Stack是一个脆弱的类。与关闭它一样,事实上不可能通过小心来消灭这些类型的错误。

    注意如果你用接口继承,你就没有这个问题,因为你没有继承对你有害的函数。如果Stack是接口,由Simple_stack和Monitorable_stack实现,那么代码就是更加健壮的。

    我提供了一个基于接口的方法在Listing 0.1。这个解决方法和继承实现的方法一样的灵活:你能够用Stack抽象术语来写代码而不必担心你事实上在操作那种具体的堆栈。因为两个实现必须提供公共接口的所有东西,它很难使事情变糟。我仍然有和写基类的代码一样的只写一次,因为我用封装而不是继承。在底层,我不得不通过封装类中的琐碎的访问器方法来访问缺省的实现。(例如,Monitorable_Stack.push(…)(在41行)不得不调用在Simple_stack等价的方法).程序员埋怨写所有这些行,但是写这特别行代码同消除重要的潜在bug是非常小的成本。

    [/代码]
    Listing 0.1. 用接口消除脆弱基类

       1| import java.util.*;
       2|
       3| interface Stack
       4| {
       5|     void push( Object o );
       6|     Object pop();
       7|     void push_many( Object[] source );
       8| }
       9|
      10| class Simple_stack implements Stack
      11| {   private int stack_pointer = -1;
      12|     private Object[] stack = new Object[1000];
      13|
      14|     public void push( Object o )
      15|     {   assert stack_pointer < stack.length;
      16|
      17|         stack[ ++stack_pointer ] = o;
      18|     }
      19|
      20|     public Object pop()
      21|     {   assert stack_pointer >= 0;
      22|
      23|         return stack[ stack_pointer-- ];
      24|     }
      25|
      26|     public void push_many( Object[] source )
      27|     {   assert (stack_pointer + source.length) < stack.length;
      28|
      29|         System.arraycopy(source,0,stack,stack_pointer+1,source.length);
      30|         stack_pointer += source.length;
      31|     }
      32| }
      33|
      34|
      35| class Monitorable_Stack implements Stack
      36| {
      37|     private int high_water_mark = 0;
      38|     private int current_size;
      39|     Simple_stack stack = new Simple_stack();
      40|
      41|     public void push( Object o )
      42|     {   if( ++current_size > high_water_mark )
      43|             high_water_mark = current_size;
      44|         stack.push(o);
      45|     }
      46|    
      47|     public Object pop()
      48|     {   --current_size;
      49|         return stack.pop();
      50|     }
      51|
      52|     public void push_many( Object[] source )
      53|     {
      54|         if( current_size + source.length > high_water_mark )
      55|             high_water_mark = current_size + source.length;
      56|
      57|         stack.push_many( source );
      58|     }
      59|
      60|     public int maximum_size()
      61|     {   return high_water_mark;
      62|     }
      63| }
      64|
    [/代码]

    没有提到基于框架编程,那使对于脆弱的基类的讨论是不完整的。诸如Microsoft Foundation Classes(MFC)的基类已经成为建立类库的流行途径。尽管MFC本身正在神圣的隐退,但是MFC的基口已经是根深蒂固,而这无关于Microsoft在那终止,程序员会一直认为Microsoft的方法是最好的方法。

    一个基于框架的系统典型的使用半成品的类的构成库开始,这些类不做任何需要做的事,而是依赖于派生类来提供需要的功能。在Java中,一个好的例子就是组件的paint()方法,它是一个有效的占位者;一个派生类必须提供真正的版本。

    你能够适度的多国一些东西,但是一个基于定制的派生类的完整的类框架是非常脆弱的。基类是太脆弱了。当我们用MFC编程时,每次Microsoft公布新版本时,我不得不重写我的应用。这些代码将经常编译,但是由于一些基类的改变,它们不能运行。

    所有提供的Java包工作的非常好。为了使它们运行,你不需要扩展任何东西。这个已经提供的结构比派生类的框架结构更好。它容易维护和使用,并且如果Sun Microsystems提供的类改变了它的实现,也不会使你的代码处在危险中。

    总结脆弱基类
    一般,最好避开具体基础类和extends关系,而用接口和implements关系。我的处理规则是,在我的至少80%的代码中完全用接口来完成。例如,我从不用对HashMap的引用;我用对Map接口的引用。(我对interface这个字不是严格的。当你看怎样用接口的时候,InputStream是一个好的接口,尽管它在Java中是作为抽象类来实现的。)

    你增加的越抽象,就越灵活。在今天的商业环境下,需求随着程序开发而改变,灵活就是最主要的。而且灵敏编程中的大多数只有代码使用抽象来写才会很好的运行。

    如果你近距离的检查四人帮的模式,你将看到这些模式中的很多是提供方法消除实现继承,而最好用接口继承,并且大多数模式的共有特征是用接口继承。这个重要事实是我们开始时提到的:模式是发现而不是发明。模式的出现是当你发现写得很好,易维护的运行代码时。它讲的是这些写得好的,易维护的代码根本的避开了实现继承。

    这个文章是从我即将出版的书,暂时命名为《Holub on Patterns:Learning Design Patterns by Looking at Code》,将有Apress在今年秋季出版。

    关于作者
    Allen Holub从1979年就在计算机工业中工作。当前,他作为一个顾问,在公司的执行、培训和设计编码的服务中提供建议,使公司节省在软件中的成本。它已经出版的了8本书,包括《Taming Java Thread》(Apress, 2000)和《Compiler Design in C》(Pearson Higher Education,1990),并且在加州大学伯克利分校讲课。在他的网站,你会发现更多的信息。(http://www.holub.com

    Resources
    ? A good, though academic, treatment of fragile base classes by Leonid Mikhajlov and Emil Sekerinski:
    http://www.cas.mcmaster.ca/~emil/publications/fragile/ecoop98.pdf
    ? See all of Allen Holub's Java Toolbox columns:
    http://www.javaworld.com/columns/jw-toolbox-index.shtml
    ? View David Geary's Java Design Patterns columns:
    http://www.javaworld.com/columns/jw-java-design-patterns-index.shtml
    ? The Gang of Four book is the seminal work on design patterns: Design Patterns, Eric Gamma, Richard Helm, Ralph Johnson, and John Vlissides (Addison-Wesley Publishing Co., 1995; ISBN: 0201633612):
    http://www.amazon.com/exec/obidos/ASIN/0201633612/javaworld
    ? Browse the Design Patterns section of JavaWorld's Topical Index:
    http://www.javaworld.com/channel_content/jw-patterns-index.shtml
    ? Browse the Object-Oriented Design and Programming section of JavaWorld' Topical Index:
    http://www.javaworld.com/channel_content/jw-oop-index.shtml
    ? Visit the JavaWorld Forum:
    http://www.javaworld.com/javaforums/ubbthreads.php?Cat=&C=2
    ? Sign up for JavaWorld's free weekly newsletters:
    http://www.javaworld.com/subscribe

    发表于 @ 2004年07月30日 03:37:00|评论(loading...)|编辑

    新一篇: 使用 Hibernate 将 Java 对象持久保存到 IBM DB2 通用数据库中 | 旧一篇: 为什么extends是有害的(一)

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © BlueVoyage