论坛首页 Java企业应用论坛

看看著名项目的代码

浏览 9828 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-07-03  
ajoo 写道
引用
很久之后,也不会出现

这话真的很自信啊。是关于什么的呢?这么强?

素啊,偶都很想看看,给点片断吧
0 请登录后投票
   发表时间:2005-07-03  
ajoo 写道
TomHornson 写道
ajoo 写道
上面的addConfiguredPatternset(),直接调用append(p,this)就ok了。

和上面列举的ANT代码有点类似,我前端时间写过一小片代码,总的来说,就是针对AS、Service、Application做检测,很多共性的东西,不过,导致我不能进一步抽象的原因是抛出的异常。上面的这段代码,在异常抛出方面可能也需要稍微关注一下。


异常是会有些影响,但是仍然不会导致大段的逻辑重复。最多就是一两个函数调用的重复而已。
你可以给出例子,我们看看?

public class Repeat {
    public static void main(String[] args);{
        /*handle madatory services*/
        try{
            try{
                
            }catch(IOException ioe);{
                logger.info("Exception occurred when handling madatory services.");;
            }
        }catch(Exception e);{
            if(e instanceof RuntimeException);{
                throw (RuntimeException);e;
            }else{
                throw new MadatoryServiceException(e);;
            }
        }
        /*handle important services*/
        try{
            try{
                
            }catch(IOException ioe);{
                logger.info("Exception occurred when handling important services.");;
            }
        }catch(Exception e);{
            /*
             * omitted
             */
        }
        /*handle trivial services*/
        try{
            try{
                
            }catch(IOException ioe);{
                
            }
        }catch(Exception e);{
            /*
             * omitted
             */
        }
    }
    
    private class MadatoryServiceException extends RuntimeException {
        public MadatoryServiceException(); {
            super();;
        }
        public MadatoryServiceException(String message); {
            super(message);;
        }
        public MadatoryServiceException(Throwable cause); {
            super(cause);;
        }
        public MadatoryServiceException(String message, Throwable cause); {
            super(message, cause);;
        }
    }
    private class ImportantServiceException extends RuntimeException{
        /*
         * omitted
         */
    }
    private class TrivialServiceException extends RuntimeException{
        /*
         * omitted
         */
    }
}

上面这段代码随手写。在处理madatory、important、trivial服务中,有不少的逻辑一样,但是,就是因为异常处理少许的出入,导致,三种服务的处理不能抽象到一个函数中,事实上,示意的那段ANT代码小小地也有个异常出入,不过,不是很明显。
0 请登录后投票
   发表时间:2005-07-03  
如果你的try块里边的东西都一样,把它写成一个单独的函数不成吗?然后trivial, important等都调用这个函数,但是分别处理异常。
void workWithException(...);
throws Exception{
  ...
}

void main();{
  //important:
  try{
    workWithException(...);;
  }
  catch(...);{
     ...
  }

  //trivial:
  try{
    workWithException(...);;
  }
  catch(...);{
     ...
  }
}


那个ant代码的异常处理,其实也是一个问题。
一个是throw new BuildException(...);
另一个是noChildrenAllowed()。

但是其实noChildrenAllowed里面也是throw new BuildException(),就是error message有点不同。而且意思还都一样

"You must not specify nested elements when using refid"

"Cannot append to a reference"

让人感觉这同一个类都不是一个人写的似的。
0 请登录后投票
   发表时间:2005-07-03  
ajoo 写道
如果你的try块里边的东西都一样,把它写成一个单独的函数不成吗?然后trivial, important等都调用这个函数,但是分别处理异常。
void workWithException(...);
throws Exception{
  ...
}

void main();{
  //important:
  try{
    workWithException(...);;
  }
  catch(...);{
     ...
  }

  //trivial:
  try{
    workWithException(...);;
  }
  catch(...);{
     ...
  }
}


那个ant代码的异常处理,其实也是一个问题。
一个是throw new BuildException(...);
另一个是noChildrenAllowed()。

但是其实noChildrenAllowed里面也是throw new BuildException(),就是error message有点不同。而且意思还都一样

"You must not specify nested elements when using refid"

"Cannot append to a reference"

让人感觉这同一个类都不是一个人写的似的。

事实上,在try...catch,之前之后都还有一些代码。总的来说,个人觉的,在有些地方重复代码是场景所需,往往也不是很关键。
ajoo 写道

"You must not specify nested elements when using refid"

"Cannot append to a reference"

什么意思亚?
0 请登录后投票
   发表时间:2005-07-03  
引用
什么意思亚?

那是例子中两端代码的错误信息。

看上去,虽然字面不同,但是意思相同。
感觉上是很随意地给出了字面不同的message,而不是故意弄得不同。

更何况,即使真有需要不同,一个参数也搞定了。


其实,对这种明显的重复代码的罪犯,要是还说什么个人口味问题,我只能表示佩服了。

关于你的代码,因为见不到完整的,所以我也没法具体说。
只是我觉得,有时候一些语法结构的重复(如函数的forwarding调用,定义类,定义函数签名之类的不包含具体业务逻辑的语法开销)不可避免,单个函数的调用不可避免,但是要是有相当多的逻辑(比如说超过五句)重复,绝对是可以避免的。
0 请登录后投票
   发表时间:2005-07-03  
ajoo 写道
TomHornson 写道
代码的质量关键看编写者。而有些项目参与的人很多很杂,所以,一概而论就有点不恰当。
....

patternset应该是ant核心的东西,所以我大胆估计这应该不是随便某个参与者写的。

上面的addConfiguredPatternset(),直接调用append(p,this)就ok了。


大胆估计错误
PatternSet这个文件的经手者不下10人
这个文件的cvs版本目前是1.44
现在的append(...)从1.3开始就有了,大概是2000年9月由Stefan Bodewig修改后提交
而addConfiguredPatternset在1.21引入,在2002年3月,提交者是Erik Hatcher
至于这个文件的代码,确实比较丑陋,但这是哲学问题。ant代码的这种集体所有制不如XP团队或各部分存在主导开发者的团队(比如tapstry,spring等)对代码的细节结构敏感

如果不考虑异常问题,这里也有个笔误,如果要省点力的化,应当调用append(p,getProject())
0 请登录后投票
   发表时间:2005-07-03  
ajoo 写道
引用
什么意思亚?

那是例子中两端代码的错误信息。

看上去,虽然字面不同,但是意思相同。
感觉上是很随意地给出了字面不同的message,而不是故意弄得不同。

更何况,即使真有需要不同,一个参数也搞定了。


这里的异常可能没那么简单。
noChildrenAllowed()是在DataType里面定义的,DataType有着无数子类, 它爆的异常直接指明了问题与nested elements有关。
除非能够确认append必然也是element nest的做法,否则在append中也爆这个异常,则是词不达意。
0 请登录后投票
   发表时间:2005-07-04  
首先楼主要明白一点,一个项目要想做到十全十美是不可能的,软件本身就是要持续改进的,否则也谈不上重构了。如果真的要挑,那个项目敢说自己就是十全十美的,而且这真的和每个人的设计口味相关,你所说的也未必是对的,不是吗?也许那只是你的个人理解而已。

当然,我也不喜欢偶像崇拜,开源的目的本来就是为了让大家共同学习,如果到哪一天你能看出这个项目的不足之处了,你应该感到欣喜,别忘了, 你的水平提高大多数都是来源于这些本来现在让你感到不屑的项目。
0 请登录后投票
   发表时间:2005-07-06  
楼主ajoo正是要贡献一个功能超越ant的开源项目build tool.
http://forum.iteye.com/viewtopic.php?t=14263

而且ajoo已经贡献了 jaskell, yan 等开源项目,并几次发出挑战帖,激将法,哄骗大家对他的 source 进行挑剔。

这次ajoo讨论ant的不足。主要是为了避免那些无穷无尽的质问“为什么要重复发明轮子呢?”吧。

有了Struts,为什么还要有 WebWork?为什么没有人质问 WebWork作者“为什么要重复发明轮子呢?”

所以,这类质问,这主要是对作者的资格的质问吧。
ajoo的当务之急,是赶紧出名,证明自己的能力。

这里有个悖论,
(1) ajoo ,你说你有能力,你为什么还没有名气?还不富有?那么只能说明你没有能力。
(2) 我为什么不敢怀疑名人大师,因为他们有名。既然我敢怀疑你,自然是因为你没有名气。根据(1),说明你没有能力,我怀疑你是对的。

有名的人,资格尚且受到怀疑。何况没有名气的人?
而且怀疑某人的资格,最保险。因为评论的是人,是人的资格,不涉及到具体的问题争论,不用冒风险,不会暴露自己某个领域的无知。而讨论具体问题,风险太大了,多少斤两,就被人看出来了。

注:
不针对具体人,具体事,针对一种普遍现象。
看到论坛中大量这种的帖子,不是针对具体主题问题进行讨论,而围绕着“资格”这个东西进行泛泛的无谓的口舌之争。
0 请登录后投票
   发表时间:2005-07-06  
你、人、不、针对 几个出现的频率高
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics