• 2011-01-18

    那一点的调用

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://www.blogbus.com/dreamhead-logs/100357058.html

    每每我讲如何写好代码,总会有人跳出来,无比惆怅的跟我说,你说的这些都挺好,我也认同,只是我面对的是一个有着悠久历史的遗留系统。然后,用一种痛说革命家史的架势,给我列举无数的理由。总而言之,一句话,不是我不想学好,形势让我没法学好。

    初时,我会耐心的听他叙述完一切,心中充满无比的同情。但是,让我百思不得其解的是,为啥我从来没遇到这种情况。我与人合作的过程中面对的难道不是同一个代码库吗?我怎么能坚持把代码写好,而且,奇怪的是,和我一起合作的人从来没有提出过这种问题。

    没有调查研究就没有发言权,我开始观察他们的工作方式,开始通过code diff了解他们修改代码的方式。当我看到在一大片代码被塞到了一个原本已经很大的函数里,我顿悟了,这就是差别。

    我知道旧代码非我一己之力一朝一夕可以改变,惹不起,躲得起。面对同样的情况,我会选择在一个新函数开始编写新代码,当然,作为ThoughtWorker,会有测试的。当我放心的完成了这个新函数,接下来,就是在旧代码里找到调用点,在那里放一个简单的函数调用。

    由于各种各样的原因,旧代码没有测试,甚至没办法测试,所以,新加的这个函数调用可能也测试不了,但是,只有一句没测试,显然比一大片代码没测试要令人更放心一些。

    这个思路简单得一塌糊涂。

    我做旧架构调整,用到的也是同样的思路,设计新架构,然后用一个dispatcher在入口处做分发,新旧架构得以并存。Martin Fowler的DSL 里有一个Embedment Helper,也是类似的想法,如果需要在文法文件里嵌入代码,就是一句简单的函数调用,而把更多的代码放到另外的类里。

    从此以后,我不再同情那些抱怨沉重代码库让他们没法写好代码的人。

    分享到:

    历史上的今天:

    时间与质量 2006-01-18
    引用地址:

    评论

  • 想请教一下,TW的筒子是如何做code reivew或者鼓励客户做code review的?我在翻阅博主的帖子的时候,似乎对这块没有特别强调,而是更多偏重于TDD,我觉得TDD的问题是一碰到没有责任心的程序猿,就很容易流于形式了
  • 1. 你看到的一大段代码,说不定是从别的地方复制过来的,只改动一两个变量名字。
    2. 有的人是不知道这个工作方法,反正原来的函数体这么大,我再加一点也算不了什么。
    3. 即使有了方法,大家也不一定会做。得过且过的思想在大部分人的思想里面还是很有生命力的,盘算最多的是怎么能不维护老代码。
  • 《整洁代码》中,也说出了一种原则:童子军原则。大概意思就是你修改过代码的地方,一定要比之前的好,至少要保持一样。
    但我想每个程序员,都不愿意代码在自己的手中变得越来越腐蚀。
  • 呵呵,楼主,我没别的意思!我一直在关注你的blog,并且应称你一声师兄,目前我正在沈阳工作,而你已离职多时。好的方案是能有效解决问题的方案,需要选择,无所谓“几种”,无所谓好坏,这也是优秀程序员和一般程序员的区别。你永远不能用一套理论、方案、约定规则去解决所有的问题。
  • 老架构老代码修改,确认让人头痛。有的人在原来基础上修改,有的人喜欢推翻重写,有的人有效重构原代码,等等。楼主的处理方式是一种,很有效,但不一定适用于所有的情况。
    回复在路上说:
    原本就没有银弹,肯定不能覆盖所有情况。如果你有这几种思路之外的方案,请不吝赐教。
    2011-01-19 18:08:25