跳转到主要内容

保存的文章

遗留代码修复的第一步

Dave Nicolette |领导敏捷
Dave Nicolette 高级顾问
阅读: 遗留代码修复的第一步

Remediating Code要求您首先考虑需要做什么。

大多数时候,我们使用现有的代码,而不是编写全新的应用程序。许多代码可以从一些改进中受益,使其更具可读性、更具内聚性、耦合不那么紧密、更容易隔离等等。

这种清理需要重构,或者改变代码的结构(设计)而不改变其外部可见的行为。

为了提高应用技能,它有助于实践这种技能以一定的心灵方式。如果我们只在我们需要它的那一刻申请技能“真实”,这很难改善。

我们知道如何练习编写新的或“绿地”代码。我们做它像这样.但是我们可以进行补救吗遗留代码

当然可以。下面是一些很容易在网上找到的遗留代码修正练习的例子:

我们在筛选技术职位候选人时也使用类似的练习。下面是Java重构练习的起始代码:Java的遗产下面是一个示例解决方案和文档演练:遗留Java解决方案

这个练习的起始代码被设计成包含一些代码味道.我们要求候选人清理代码。

这可能有点不公平。在现实生活中,您不会像这样接近一个代码库并开始分解它。相反,你会执行增量重构在对应用程序进行修改的正常过程中。

当我们要求人们以开放式的方式清理代码时,他们不确定从哪里开始或结束。另一方面,为了筛选求职者,我们想知道他们是怎么想的。所以这在上下文中是很公平的。

无论如何,这是可能的实践重构,就像实践测试驱动开发、空手道、音乐或烹饪一样。你不会去学自卫技巧一个抢劫。你不会第一次演奏一段音乐音乐会。你不会学会如何烧水为老板准备晚餐。出于同样的原因,当您在修复一个bug或增强一个特性的过程中,也没有必要尝试并理解重构。

您在网上找到的一些重构练习(特别是福勒)通过特定的一系列动作通过手引导您。这不一定是解决问题的唯一方法。这只是一种可能的方法。这对我们自己的锻炼的样品解决方案尽可能多地进行样品解决方案。

当你在看一段“真正的”代码时,没有人会牵着你的手。你得想清楚该怎么做。当我们要求人们清理混乱的代码时,他们没有用户故事来告诉他们代码的哪一部分目前是有趣的,看看他们会怎么做是很有趣的。

有些人不愿意更改任何代码,除非他们有机会与原始作者、团队的技术领导或应用程序架构师交谈。有些人则相反:他们会一头扎进去,改变任何对他们来说“有趣”的事情,而不去验证他们的任何假设。

许多候选人追逐松鼠。他们注意到一种代码气味,开始纠正它,然后注意到另一种代码气味。他们停止了正在进行的工作,开始处理第二个代码气味。然后他们注意到第三个。等等。

得到你的轴承

我建议第一步应该是弄清楚你的方位。如果有一个用户故事,它将告诉您应该修改或添加什么应用程序行为。您只需要重构与该行为相关的代码。即使您看到了另一种对您来说似乎更糟糕的代码味道,您的任务是完成User Story,而不是修复您不喜欢的代码库的所有内容。

如果没有用户故事,并且你被要求以开放式的方式“解决问题”,就像我们在筛选工作候选人时所做的那样,那么你就需要某种理性的方法。

在考虑求职者时,我们没有任何特别的方法,只要它是合理的。你会惊讶地发现,有多少人根本没有任何方法,而只是抓住那些恰好吸引他们注意力的代码。然后,他们在接下来的90分钟里处理代码中一个相对琐碎的问题。

一种理性的方法是寻找唾手可得的果实。在我们针对Java修正挑战的示例解决方案中注意到的第一个代码味道是无用的类级别的评论.这有那么可怕吗?也许不是,但这是一个明显的解决办法,又快又简单。没有什么比速战速决更能让你重拾信心了。

另一种方法是寻找影响相对较大的问题。我们的Java修正练习附带了JUnit测试用例。我们注意到求职者是否关注测试用例。XP从业者通常会这样做开始通过运行任何可用的可执行测试用例来探索代码库。

没有面向测试思维的人甚至可能不会考虑运行测试套件(啧啧啧啧).事实上,许多候选人甚至从未查看过项目的测试目录。

如果你这样做了,你会看到测试用例itFindsAddisonTexasBy5DigitZipCode ()itFindsMaranaArizonaBy9DigitZipCode ()运行时间比其他测试套件长得多。进一步调查,你会发现方法setzipcode()JobApplicant调用基于互联网的服务,根据邮政编码查找城市名称。

没有办法将这个调用与方法的其余部分隔离开来。所以这是重构的一个潜在起点。另一个理性的方法。

你不问我,我就不会说谎

应聘者常犯的一个普遍错误是不问问题。一开始,我们告诉他们,如果对代码的意图有疑问,我们(我们中的任何一个人都在推动会议)可以作为主题专家、业务分析师或产品负责人或其他什么人。亚博vip9通道大多数人从来不问一个问题。

一个人看到变量名为segundoNombre然后马上把它改成中间名字他的理由是名字应该是一致的。他是对的:名字应该一致。

他没有问我为什么segundoNombre一开始就在密码里。如果他问的话,他就会知道西班牙人的名字没有“中间名”。塞贡多数量是正确的域名项。

在一个“真实”的应用程序中,假设它遵循了使用的原则无处不在的语言,会有关于该名称的文档化标准,例如:

  • 显示:塞贡多数量
  • 简短的展示:赛格。笔名。
  • 数据库列:SEGUNDO_NOMBRE
  • Java变量:segundoNombre
  • Ruby变量:segundo_nombre

那个人在重命名变量的问题上花了很长时间。这部分代码的问题是变量的名字。这是在不使用Java的国际化支持的情况下将西班牙语名称塞入代码的方式。一个软件的考古学家会立即察觉到在应用程序发布后的某个时候已经添加了对西班牙名字的支持,而没有考虑如何合并对国际化名字的支持。这个人从来没有看到这个问题,因为他专注于变量名,他从来没有要求澄清。

结论

基本的重构包含一个单独的步骤。大多数功能齐全的ide都支持通过键盘快捷键、上下文菜单或主菜单中的选择进行最常见的单步重构。多步骤重构包括一系列按特定顺序执行的简单重构(有时是少量手工编辑),以维护安全性。

很容易找到一些练习来帮助您练习用于经常使用的重构的一系列步骤。但也不要忽视这个过程中的第一步:想想我们需要做什么。

下一个;不可变的服务器:为什么?

留下你的评论

您的电子邮件地址将不会被公布。必填字段被标记