编程卡塔是用于练习重构老旧代码的工具。

128

最近几个月我对编程卡塔很感兴趣。我认为这是磨练编程技能和提高工作中编写代码质量的好方法。

有很多地方可以找到卡塔,例如:

http://codekata.pragprog.com/

http://schuchert.wikispaces.com/Katas

http://www.codingdojo.org/

我发现这些网站都是优秀的卡塔资源库...而且我尝试完成其中的一些任务时,获益匪浅。

然而,我觉得迄今为止所有的卡塔都存在一个缺陷。它们似乎没有让我有机会练习重构不良代码。学习如何第一时间编写清晰的代码当然很好...但在我的工作中,我没有太多机会编写新代码。相反,我经常在与旧代码作斗争,并尝试弄清楚如何重构模块、消除依赖关系和减少耦合度。

因此,我正在寻找一些卡塔,以此来磨练重构旧代码并将其转化为清晰代码的技能。

有人知道已经存在的任何这样的卡塔吗?我知道在工作中我可以获得很多练习机会...但我想把自己的技能磨练到能够快速看出如何打破依赖关系并将类中过于复杂的任务分离的水平。


+1,好问题,提供了有用的信息。 - KLE
我希望我能给予超过+1的赞 :) 很棒的问题。我甚至从未考虑过这种编程实践... - FallenAvatar
我非常希望能看到有人发布一个专门用于重构遗留代码的小型系统......其中包含Michael Feathers的重构亮点。我已经寻找了一个多星期了,像这样的东西有人有吗?有人有吗? :) - Derick Bailey
不错的问题。你可以练习@Ryan在他的回复中提到的内容。我建议fork一个Github存储库:https://github.com/garora/TDD-Katas 你可以查看历史记录,了解这些Katas是如何被重构的。 - Gaurav Arora
3个回答

95

我不知道有哪个网站直接分类目录它们,但是我偶尔会使用以下策略:

  1. 找到一个旧的、小的、未维护的开源项目在sourceforge上
  2. 下载它,让它编译/构建/运行
  3. 阅读文档,了解代码风格
  4. 使用《遗留代码重构》中的技巧将其中一部分放在测试下面
  5. 重构那一部分,也许会修复错误并添加功能
  6. 重复步骤4到6

当你发现有特别具有挑战性的部分时,要丢掉你的工作,重复几次以加强你的技能。

这样不仅可以练习重构技能,还可以练习其他技能,如代码阅读、测试和处理构建过程。

最难的问题是找到一个你足够感兴趣继续工作的项目。我上次参与的是一个用于python基因编程的库,我的当前项目是Java IRC库。


4
+1 非常有趣的建议。正如你所说,难点在于找到一个合适的项目。我会认真考虑这个建议。也许如果我或别人找到了一些非常有用的项目,可以将它们保存和记录在某个地方作为“Kata”。 - mezoid
3
《处理遗留代码》 - 你是指《与遗留代码有效地工作》吗?http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052 - TrueWill
1
是的,我指的是《遗留代码有效工作》。感谢您的提醒! - Ryan

21

Emily Bache拥有一个GitHub代码库,其中包含一些重构的kata:Emily Bache's Refactoring Kata Repo。其中包括需要重构的KataYahtzee和KataTennis变体。此外,她还有一个经过设计的重构kata变体——Gilded Rose Kata。

她的代码库中还有Racing Car Katas:Racing Car Kata。这些Race Car Katas也包括了一些很好的重构练习。

这些kata在多种语言中都有对应的代码:

  • C++
  • C#
  • Java
  • Javascript
  • Python
  • Ruby

4
Emily还出版了《编程道场手册》一书,列举了Katas并描述了如何开始和运营自己的编程道场。我强烈推荐这本书:https://leanpub.com/codingdojohandbook - Christian Maslen
1
我曾经使用过她的书来运行道场,并且我同意它是一本极好的资源。Emily在pluralsight.com/courses/the-coding-dojo上也有相关课程。 - Steve Clanton

21

我感觉像是一个死灵法师回复这样一个老的贴子,但有一件事会成为一个很好的补充:遗留代码退役

这个想法是用遗留代码来进行代码退役并尝试练习处理遗留代码的技术,但我看不出有什么可以阻止你简单地使用准备好的代码并自己练习。只用它来创建黄金大师需要一个小时的工作时间,而你可以做更多的事情。如果你的kata通常持续约2小时,那么将通常发生在LCR上的内容分开成kata,就可以得到四个不同的工作项目。

GitHub存储库是由该想法的作者J.B. Rainsberger创建的,其中包含一个简单的遗留系统Trivial Game。

从我的组织者/参与者的经验来看,人们真的很喜欢这个,并且能够看到遗留代码中存在的问题,以及您的重构可能误入歧途(以及如何!)。这里是另一个关于它是如何看起来的描述,由Andreas Leidig提供。


如果你在编写这个时感觉像一个死灵法师,那么想象一下我有多么感觉! - TiggerToo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接