花钱的年华

--今天开始成为主站

用户操作
[即时聊天] [发私信] [加为好友]
江南白衣ID:calvinxiu
691445次访问,排名53好友0人,关注者38
calvinxiu的文章
原创 161 篇
翻译 0 篇
转载 0 篇
评论 646 篇
江南白衣的公告

肖桦,江南白衣,
开源项目SpringSide
春天的旁边
发起者

最近评论
calvinxiu:
发版本最痛苦的事情,就是刚发完之后忽然又有了一个比较重要的更新。

推荐大家下载3.0.3.1 (2mb)

1.简化了目录结构,感觉又清爽了不少。
2.消除了最后一块需要逐个Class写配置文件的地方(applicationContext.xml中的sessionFactory的mapping class)。
dreaming:恭喜~
hongyi:还是一头雾水,郁闷,为啥有这么多东东,叫人头大
suncheng_hong:用过appfuse,但springside还没有尝试过。
suncheng_hong:很想尝试一下。
文章分类
    收藏
      相册
      Blog用图
      Friends
      @_@
      Anders小明
      buaawhl
      cac
      canonical
      cctvx1
      david.turing
      femto
      g9
      JohnsonQu
      Michael Chen
      Raimundox
      robbin
      SimonLei
      totodo
      wuyu
      周爱民
      孟岩
      差沙
      庄表伟
      落魄的程序员
      透明
      郁也风
      铁手
      银狐999
      飞云小侠
      存档
      订阅我的博客
      XML聚合  FeedSky
      订阅到鲜果
      订阅到Google
      订阅到抓虾
      订阅到BlogLines
      订阅到Yahoo
      订阅到GouGou
      订阅到飞鸽
      订阅到Rojo
      订阅到newsgator
      订阅到netvibes

      原创 像工匠一样进行重构--《Refactoring WorkBook》收藏

      新一篇: "Shale? JSF? Struts is dead?" | 旧一篇: Web层改进II-用xmlhttp 无声息提交复杂表单

      作者: 江南白衣

       最新版本及评论请看:http://www.blogjava.net/calvin/archive/2005/10/04/14790.html

       像工匠一样进行重构, 让重构成为一门手艺.
      Martin Fowler的《Refactoring》其实更适合做一本关于重构的洗脑,宣言式的书,就像Kent Beck的《XP Explain》一样薄薄的就可以了。只可惜他却非常的厚,后面的重构名录都是写给小白看的。所以我更喜欢《Refacoring WorkBook》,以一个工匠的语气(沉默寡言而实要)传授重构的手艺。


      1.重构 Between Classes
         〈Design pattern〉有半数篇幅教育大家不能只靠继承,要善用组合/委托。重构里面其实也有很多事情靠把继承变成委托来解决。
        1.1继承
           1.1.1 并行继承体系,组合爆炸
                     这在以前是个头痛的问题,现在都已习惯用委托。
                     另外java还有个不是很让人满意的接口机制解决并行继承。
           1.1.2  父子类的关系
                      比如过于亲密,子类会乱修改父类的方法,访问父类的变量,这时候可以定义final的Template方法。
                      还有拒绝的馈赠,我暂时还没有在这上面遇到问题,作者也建议如果没事就由他,如果有事,就要费劲的move method ;或者子类不继承父类,而只是组合父类。
         1.2职责
           经过很多次重构之后,我发现,其实哪个方法应该放在哪个类其实很主观的,你每天醒来都能想到一个理由让一个方法搬一下家,所以我现在已经放弃追求一种“对”的职责分配了,看着顺眼就行。
          
        1.3散弹式修改
           作一个修改就要改N个类时,也没什么特别好方法,就是找找看,有没有能为这个修改负责的统管全局的类。
           但现在的很多散弹式修改是分层做成的。
       
        1.4库类
           OpenSource的类库,总有些时候会想要扩展
           1.如果只是一两个方法,直接在客户代码里扩展,
           2.否则自己多一个类库的子类
           3.最费劲就是引入一个新的层
          
       题外话,重构其实很依赖工具,和对全部代码的拥有度,哗一下就来个全项目的rename。当你设计库类时,你并不一定拥有使用这些库类的客户代码了,因此一开始就要认真设计,不能依赖重构,改接口会让人K死的。

      2.重构 Within Classes
      2.1 大是罪
         Long Method、Large Class、Long Parameter List, 一般通过度量工具找出来,还可以自己设定一个触发器,当度量值超过某个限度时就报警。
         PMD可以实现这个功能,但度量工具我更喜欢Metrics Reload,一个IDEA的插件,给出的度量信息很全面。
         但是也切忌为了度量的数值而重构。
         Long Method当然是尝试Extract Method。
         Large Class就要把类的职能分开几个域,尝试拆出另一个Class或者SubClass。
         Long Parameter List 可以通过在方法内的变量用查询获得而不用由参数传入;
                                        或者把某些参数组成一个对象。
       
      1.2 重复也是罪
          重复在30年前就被认为是不好的一样东西,表现在1.代码类似,2.代码、接口不同而作用相近。
          去除重复的方法也没什么特别,无非就是
          Extract Method(同一个类)。有差异时,通过参数化达到共用。
          Pull Up Method到父类(同一个父类)。有差异时,通过模板机制达到共用。
          Class A调用Class B   或者   Extract Class C  (两个完全无相干的类)
       
      1.3 命名
         中国程序员的英文本来就差,要多参考Ofbiz、Comperie的命名, 尽快建立团队的项目字典、领域术语字典。
         也幸亏,现在在工具辅助下,代码的rename是最容易的重构。

      1.4复杂条件表达式

         作者认为,即使现在Program最关注的是对象,以及对象间的关系了,但优质的内部代码依然重要,推荐《编程珠玑》和《Elements of Programing style》。

         化简复杂条件的基本有三个方法
          1.通过!(A&B)==(!A)||(!B)化简
          2.通过有意义的变量,函数代替条件表达式,比如
             boolean isMidScore = (X>1000)&&(X<3000);
          3.通过把一个if拆分开来执行,把guard clause放在前面
            比如if(A||B)
                        do();
                  ->if(A)
                        do();
                     if(B)
                        do();
                又可以把2、3灵活组合,比如根据2,Extract出一个isRight()函数,根据3
          isRight()
          {
            if(A)
              return true;
            if(B)
              return true;
            return false;
          }

      1.5 其他
         没用的死代码,通过IDE工具探知并移除。小心有些框架代码是不能删除的。
         Magic Number,当然是改为常量。如果Magic Number很多,可以用Map、枚举类来存放。
         除臭剂式的注释,为方法,变量改一个更适合的名字。如果注释是针对一个代码段的,可以Extract Method。当然,代码只能说明how, 不能说明why,更不能说明why not,这才是注释存在的地方。

      发表于 @ 2005年02月06日 15:57:00|评论(loading...)|编辑

      新一篇: "Shale? JSF? Struts is dead?" | 旧一篇: Web层改进II-用xmlhttp 无声息提交复杂表单

      评论

      #oaexvz@mail.com 发表于2007-09-02 15:36:22  IP: 200.31.42.*
      irvethag mygzf rgidv nwlbvzsu cqztpk unqymfxsr obwdkfe
      #kyxbjnlt@mail.com 发表于2007-09-02 15:37:15  IP: 222.229.0.*
      tdiaez dtpulxcns ikvfb vrei jturk olxfuvnba jqxrpgitz http://www.hkwba.mnfbyiquh.com
      #egic@mail.com 发表于2007-09-02 15:37:50  IP: 68.180.195.*
      fwnv mvrb wmsxyz tdlzrp goxewzi qkdvuhpoi rdwjxl gykxps stwcym
      发表评论  


      登录
      Csdn Blog version 3.1a
      Copyright © 江南白衣