锁定老帖子 主题:看看著名项目的代码
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2005-07-03
ajoo 写道 引用 很久之后,也不会出现
这话真的很自信啊。是关于什么的呢?这么强? 素啊,偶都很想看看,给点片断吧 |
|
返回顶楼 | |
发表时间: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代码小小地也有个异常出入,不过,不是很明显。 |
|
返回顶楼 | |
发表时间: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" 让人感觉这同一个类都不是一个人写的似的。 |
|
返回顶楼 | |
发表时间: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" 什么意思亚? |
|
返回顶楼 | |
发表时间:2005-07-03
引用 什么意思亚?
那是例子中两端代码的错误信息。 看上去,虽然字面不同,但是意思相同。 感觉上是很随意地给出了字面不同的message,而不是故意弄得不同。 更何况,即使真有需要不同,一个参数也搞定了。 其实,对这种明显的重复代码的罪犯,要是还说什么个人口味问题,我只能表示佩服了。 关于你的代码,因为见不到完整的,所以我也没法具体说。 只是我觉得,有时候一些语法结构的重复(如函数的forwarding调用,定义类,定义函数签名之类的不包含具体业务逻辑的语法开销)不可避免,单个函数的调用不可避免,但是要是有相当多的逻辑(比如说超过五句)重复,绝对是可以避免的。 |
|
返回顶楼 | |
发表时间: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()) |
|
返回顶楼 | |
发表时间:2005-07-03
ajoo 写道 引用 什么意思亚?
那是例子中两端代码的错误信息。 看上去,虽然字面不同,但是意思相同。 感觉上是很随意地给出了字面不同的message,而不是故意弄得不同。 更何况,即使真有需要不同,一个参数也搞定了。 这里的异常可能没那么简单。 noChildrenAllowed()是在DataType里面定义的,DataType有着无数子类, 它爆的异常直接指明了问题与nested elements有关。 除非能够确认append必然也是element nest的做法,否则在append中也爆这个异常,则是词不达意。 |
|
返回顶楼 | |
发表时间:2005-07-04
首先楼主要明白一点,一个项目要想做到十全十美是不可能的,软件本身就是要持续改进的,否则也谈不上重构了。如果真的要挑,那个项目敢说自己就是十全十美的,而且这真的和每个人的设计口味相关,你所说的也未必是对的,不是吗?也许那只是你的个人理解而已。
当然,我也不喜欢偶像崇拜,开源的目的本来就是为了让大家共同学习,如果到哪一天你能看出这个项目的不足之处了,你应该感到欣喜,别忘了, 你的水平提高大多数都是来源于这些本来现在让你感到不屑的项目。 |
|
返回顶楼 | |
发表时间: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),说明你没有能力,我怀疑你是对的。 有名的人,资格尚且受到怀疑。何况没有名气的人? 而且怀疑某人的资格,最保险。因为评论的是人,是人的资格,不涉及到具体的问题争论,不用冒风险,不会暴露自己某个领域的无知。而讨论具体问题,风险太大了,多少斤两,就被人看出来了。 注: 不针对具体人,具体事,针对一种普遍现象。 看到论坛中大量这种的帖子,不是针对具体主题问题进行讨论,而围绕着“资格”这个东西进行泛泛的无谓的口舌之争。 |
|
返回顶楼 | |
发表时间:2005-07-06
你、人、不、针对 几个出现的频率高
|
|
返回顶楼 | |