论坛首页 海阔天空论坛

目前项目的暴强代码风格 + 把它重构了!

浏览 31849 次
精华帖 (0) :: 良好帖 (31) :: 灌水帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-12-16   最后修改:2008-12-16
我有点不明白你为什么会费这么大的劲,因为我看起来是一段很简单的程序,只要有IDE帮忙,根本连测试都不用写就可以重构出来。

我的感觉是,你仍然着重于“理解它的逻辑”,然后调整它的结构。既然看过《重构》那么你应该知道,重构是一些形式化的过程,我相信你并没有认真去想这句话到底是什么意思。你应该再认真看看这本书,看看Opdyke的关于行为保持的论文,回头想一想你做的重构(特别是extract method)。如果你能保证每一步改变都是行为保持的那么你既不用理解原来的逻辑也不用增加测试,这段小程序很轻松就能弄完。重构看起来是件很容易说也很容易做的事,但如果你不去仔细想里面的道道你就会这样,二十分钟能干完的事用掉两小时。

(补充:我绝不是提倡不在重构的同时增加测试,请任何人都不要误解。)
2 请登录后投票
   发表时间:2008-12-16   最后修改:2008-12-16
gigix 写道
我有点不明白你为什么会费这么大的劲,因为我看起来是一段很简单的程序,只要有IDE帮忙,根本连测试都不用写就可以重构出来。

我的感觉是,你仍然着重于“理解它的逻辑”,然后调整它的结构。既然看过《重构》那么你应该知道,重构是一些形式化的过程,我相信你并没有认真去想这句话到底是什么意思。你应该再认真看看这本书,看看Opdyke的关于行为保持的论文,回头想一想你做的重构(特别是extract method)。如果你能保证每一步改变都是行为保持的那么你既不用理解原来的逻辑也不用增加测试,这段小程序很轻松就能弄完。重构看起来是件很容易说也很容易做的事,但如果你不去仔细想里面的道道你就会这样,二十分钟能干完的事用掉两小时。

(补充:我绝不是提倡不在重构的同时增加测试,请任何人都不要误解。)


我认为,重构中,最重要的一项是:“命名”。修改函数的名称,修改变量的名称,抽取函数、分解函数后,同样需要给新的函数命名。
不理解程序,你如何命名?

如果重构的目的,仅仅是为了保持代码的行为不变,当然只需要考虑“形式化的过程”。
0 请登录后投票
   发表时间:2008-12-16   最后修改:2008-12-16
gigix 写道
我有点不明白你为什么会费这么大的劲,因为我看起来是一段很简单的程序,只要有IDE帮忙,根本连测试都不用写就可以重构出来。

我的感觉是,你仍然着重于“理解它的逻辑”,然后调整它的结构。既然看过《重构》那么你应该知道,重构是一些形式化的过程,我相信你并没有认真去想这句话到底是什么意思。你应该再认真看看这本书,看看Opdyke的关于行为保持的论文,回头想一想你做的重构(特别是extract method)。如果你能保证每一步改变都是行为保持的那么你既不用理解原来的逻辑也不用增加测试,这段小程序很轻松就能弄完。重构看起来是件很容易说也很容易做的事,但如果你不去仔细想里面的道道你就会这样,二十分钟能干完的事用掉两小时。

(补充:我绝不是提倡不在重构的同时增加测试,请任何人都不要误解。)



恩,我也觉得大部分的extract method 都不会对程序的行为造成改动。应该是自己对那段代码没啥信心吧,
以为不写测试就会出错。所以搞的很啰嗦。

谢谢了。今天我的收获很大。《重构》我会仔细再读的。


daquan198163 写道
workflowService.assignTask(flowBean, isStart, isTransition, transitionPath);
之后可以断言数据库里相应任务的状态


恩。我也是这样做的。

感觉似乎只有这一条路啊。

我觉得想按照Pragmatic 作者说的那样,写的测试用例刚刚好,真的很需要修炼!


庄表伟 写道

我认为,重构中,最重要的一项是:“命名”。


是的。好的命名风格真的可以给程序员减轻很大负担!

想起前几天看到句话:程序员的水平跟英文命名有很大关系。
0 请登录后投票
   发表时间:2008-12-16   最后修改:2008-12-16
发重了编辑掉。。。
0 请登录后投票
   发表时间:2008-12-16  
setTransitionPathOrEndOrSignalAnInstanceIfIsTransition
doProcessIfParentOfTaskIsTaskNode
isShouldDouldDoProcess

这都是受了spring的毒害吧。。。把方法名当句子来写。。。太寒了。。。
0 请登录后投票
   发表时间:2008-12-16  
seen 写道
setTransitionPathOrEndOrSignalAnInstanceIfIsTransition
doProcessIfParentOfTaskIsTaskNode
isShouldDouldDoProcess

这都是受了spring的毒害吧。。。把方法名当句子来写。。。太寒了。。。



其实java众一直是这样的,而且还有两个人,kent beck,martin flower因为特别会造句成为大师 呢
0 请登录后投票
   发表时间:2008-12-16  
lz自问一下,如果有后人需要接手你的代码,日子是否会比现在的你要好过?
0 请登录后投票
   发表时间:2008-12-16   最后修改:2008-12-16
seen 写道
setTransitionPathOrEndOrSignalAnInstanceIfIsTransition
doProcessIfParentOfTaskIsTaskNode
isShouldDouldDoProcess

这都是受了spring的毒害吧。。。把方法名当句子来写。。。太寒了。。。



这种东西看了估计杀人的心都有了....

如果print的名字是

listSentenceWithBlackGroundAndWhiteChar....那写C的人会死一大片.

我看到第一个函数名,心里就一个字"干!"..

0 请登录后投票
   发表时间:2008-12-16  
ray_linn 写道
seen 写道
setTransitionPathOrEndOrSignalAnInstanceIfIsTransition
doProcessIfParentOfTaskIsTaskNode
isShouldDouldDoProcess

这都是受了spring的毒害吧。。。把方法名当句子来写。。。太寒了。。。



这种东西看了估计杀人的心都有了....

如果print的名字是

listSentenceWithBlackGroundAndWhiteChar....那写C的人会死一大片.

我看到第一个函数名,心里就一个字"干!"..



哥,你觉得该咋写?
0 请登录后投票
   发表时间:2008-12-16  
3. 1   选中下面的这段代码,然后 alt + shift + m。 起个名字,叫。。。呃。。。。
setTransitionPathOrEndOrSignalAnInstanceIfIsTransition吧。
我想表达的意思是:当 isTransition的时候,setTransitionPath或者signal()或者end()一个instance...

Java代码
if (isTransition)  
        if (!instance.hasEnded()) {  
            if (transitionPath != null 
                    && !"".equals(transitionPath))  
                instance.signal(transitionPath);  
            else 
                instance.signal();  
        } else {  
            instance.end();  
        }  
    } 

--------------
按照你的描述,我会这么写:
proc_inst(struct instance inst, int is_trans)
0 请登录后投票
论坛首页 海阔天空版

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