穷人如何使用测试驱动开发进行重构

穷人如何使用测试驱动开发进行重构


重构这个词现在已经被用烂了。我们经常听经理啥的说,咱们应该把系统重构一
下。当他用重构这个词的时候,想表达两个意思。一,把这个系统重写一遍,大
手术,二,我很fation.


重构具有更严格的意义,就是需要在重写的同时,保证系统原有的功能。如果对
系统原有的功能不变做出保证呢?


我听过很多人保证:我的U盘绝对没有病毒。你用什么保证。我见过用脑袋保证
某事的,最后,他的脑袋还留在他自己的脖子上。我并非对他的脑袋搬移有什么
兴趣,而是想说,他的脑袋确实很值钱,但是于我却毫无用处。


我们用什么保证?胡适先生说:证据。测试驱动开发能给出证据。


测试用例如果在重构前和重构后都通过,就说明重构至少在功能不变上是成功的。


重构有不少好工具了,可是对于我等穷人,没有大公司啥的作为支撑,有时机器
连eclipse跑不起来都不顺畅。没有利器,如果重构?


测试驱动开发也有不少好工具,可是如果你用的既不是C++也不是Java,甚至
连.net也不是,cppunit,junit这些工具又如何助力呢?


刘慈欣先生在《全频道阻塞干扰》的最后,让被逼到毫无退路的美国军官说:我
们的祖先也不是最开始就有坦克大炮导弹核武器的,士兵们,上刺刀。


我们总可以在更原始的工具中找到新技术的精神,因为牛人们从前就是以此这些
丑陋陈旧的工具创造了这些新的技术。


昨天还是前天,二猫像个小大人一样一直坐桌前陪我吃饭,跟我聊。谈到她喜欢
吃这个吃那个。这几乎就是目前她生活的全部,所以有些事情是她想不到的。


我说:爸爸小的时候没吃过香蕉。


她问:为什么不吃?你不喜欢吃么。


我说:因为买不起。


她问:香蕉很贵么?


我说:不贵,是我没有钱。


我曾经教育才外教Dave同学。是的,教育,爱国主义教育。他看到我读《鸿:中
国的三个女儿》,问我:允许你读这种书么?


我说:啥?为什么不能。


他说:这书不是中国出版的。


这书确实不是咱们出版的,是阿于同学从美国给我带回来的。


这面这段对话可以看出,他对于陌生的国度有怎么的不了解。所以,在后来,我
对他进行了如下教育:


我问:你是不是以为俺们政府真的就挺虐待她一家的,她家还给俺们做出那么多
贡献和牺牲。他说,是啊。我说:那我来给你讲一些事。


作者,五岁的时候,因为不喜欢上幼儿园,把牛奶倒在桌子上,挨了批评,很委
屈。


Dave说:我记得这个情节。淘气的女孩。


我以为,不打死她个败家的就已经是手下留情了。中国很多孩子至今都不能每天
喝上牛奶,我在大学以前,就很少喝到牛奶。


他很难相信。


我再问:你记不记得,她妈妈去医院(或者临时监狱?)看她爸,因为不能坐单
位的车(她爸单位的),而只能骑着自行车。你认为这很艰苦?


他说:是。


我告诉他:那是195X年,整个中国,就没有几个人有自行车。我想,不亚于现在
的宝马吧。直到197X年,20年后,自行车仍然是结婚时必备的四大件之一。可
见,它多么昂贵。


同样的数据,同样的事实,我们可能得到完全不同的结论。


但是,即使我们买不起香蕉也仍然活了下来。重构,测试驱动开发,也是一样。
尤其是在最艰苦的时候,比如你所用的语言没有测试驱动工具,就更能体现出穷
人方法的必要性。


1. 我们假设所有的输出都是向控制台的。


至于gui程序,你可以先写一个console版本,让未来要写的gui与console版本使
用相同的业务逻辑库,凡是与计算机的机制无关,而与用户特定需求的,都放这
里。gui消失触发以后,别的啥也不干,调用业务逻辑库中的某个函数。


2. 先跑一把程序,整个输出,重定向到一个文本文件里。


这时,输出的文本文件十有八九不是你想要的。因为特别简单的程序,会轻量级
到甚至无须测试驱动开发。


3. 手动修改这个文本文件,改成你最后需要输出的样子,重命名为
expected.txt。


这就是以后我们用以对比的素材了。


4. 跑你的程序,改它,再跑,再改。估计好多人都要先改语法错误,让编译通
过。


始终把输出由控制台重定向到 output.txt。这样做:


假如你有输入文件的话,那么,假定它命名为 input.txt。


program.exe < input.txt > output.txt


5. 当你需要测试驱动的时候,执行这样一条指令:


diff output expected.txt


如果啥结果也没输出,成功了。我第一次见到比较成功的时候没有输出,很惊度。
李记者教导我说,diff么,就是找不同,没有不同,它就应该不吱声。


如果有任何输出,你的程序仍然没有符合要求,继续改,继续跑。


6. 以上,是测试驱动开发。测试驱动开发,是重构的前提。没有测试驱动,一
次次用眼睛在程序输出里找你想要发现的错误或者期待的字符,你就是在构建性
能可怜而其实非常宝贵的人肉计算机。


如果不同太多,你又想找特定的字符,请使用 grep。


7. 以上的 diff 和 grep 是标准unix系统的小工具,所有的Linux版本里都有。
如果你使用windows,那么,可以下载 mingw & msys,或者 gnuwin
[http://gnuwin32.sourceforge.net/]。


8. 关于重构,补充一点。


想各种办法,始终保持约20分钟内,代码可以编译和运行和测试通过。尽可能不
要冒险长时间不编译或不运行或者测试不通过。你可能会期待在一个大~~~的不间
断的重构之后,代码一下子跑起来了,而且正常了。


这就像打算沿着海岸游泳到达某个地方,我们可能遇到一个海湾,抄近路似乎一
下子就过去了。你可以想像一下,从丹东到青岛,一种方案是沿着渤海湾一次半
公里,另一种方案是取直线。取直线,真的是极富有吸引力。毕竟,我们编程大
半是为了快感,而不是为了资本家。可是,如果你沉了呢,后果很严重。这也是
为什么需要测试驱动开发的原因。


小步的迭代,每步都要确保能活着再次接触海岸。我妈说了:宁走十步远,不走
一步险。


我曾经4个小时左右,不编译,不执行,不测试,这个期间程序就跟大手术尚未缝
合,根本不能跑。一下子跑起来,是的,非常兴奋。可是,也有几个小时以后完
成失败,甚至回滚到几分钟前都没有意义,只能一下回滚到几小时以前。那种挫
败感也令人印象深刻。这些经历,我知道你也有,就像牛仔的伤疤,如果没死是
大可以拿出来显摆的。


不过,还是每天写一点,每小时写一点,20分钟写一点。以微小的可控的单位前
进。像竹子那样,每走一步,就要做个小节。


未来无限美好,此刻却虚无飘渺。如果有经理老板导师男朋友女朋友对你这样
说,你就给他讲讲测试驱动开发和重构的道理。


----


完成所有今天能完成的任务,喝一杯咖啡,然后倒头大睡。人生当如此,哪怕就
此长眠,也了无遗憾。





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值