测试指导下不断发展的多毛软件

软件有机增长。 一次一行,一次更改。 这些更改很快加起来。 在理想的世界中,它们共同构成了一个具有一致性的架构,旨在揭示设计意图。 但是有时候软件只是变得毛茸茸的-充满了使基础逻辑模糊的小细节。 是什么使软件多毛,我们如何才能停止它

多毛的代码

通常,代码从干净开始-全新的闪亮代码。 但是,每次进行与原始设计都不完全匹配的更改时,您都会添加一根头发 -一个细微的细微细节。 它不会减损代码的总体目的,而只是涵盖了最初没有想到的特定细节。 一根头发就可以了。 但是,然后添加另一个,另一个和另一个。 在不知不觉中,干净,闪亮的代码被细小的头发覆盖着。 最终,代码变得如此繁琐,您甚至无法再看到基础设计。
面对现实吧,我们基本上都是维护程序员。 我们中实际上有多少人从事真正的新建项目而且无论如何,在启动新项目之后不久,您就需要更改以前的操作,然后又回到维护领域。 我们花费大部分时间来更改现有代码。 如果我们不小心,我们会花费大部分时间来添加新头发。

最简单的事情

更改现有代码时,很容易做出可能可行的最小更改。 通常,这是一个好方法。 基督,TDD非常擅长让您专注于此。 编写测试,使其通过。 编写测试,使其通过。 做可能可行的最简单的事情。 但是,您必须执行重构步骤。 “红色,绿色, 重构 ”的人们。 如果您不进行重构,那么您的代码将变得繁琐。 如果您不进行重构,那么您刚刚添加的内容就很繁琐。 当然,这是一个经过充分测试的,写得精美的文章。 但这仍然是个矛盾。
问题是,原谅自己很容易。

但这只是if语句

这只是一个小变化。 在这种特定情况下,我们想做一些细微的不同。 它可能看起来不像,但这是一个错误。 您已经描述了更改的逻辑 ,但没有描述原因 。 你描述的行为是如何不同,然而不知其所以然 。 恭喜,您刚长了一根新头发。

一个例子

也许一个例子现在会有所帮助。 假设我们为在线零售商工作。 当我们完成订单时,我们拿走每个物品并尝试发货。 对于那些无库存的产品,我们将在购买新库存时将其添加到队列中。

与在线零售商一样,我们正在慢慢占领整个领域:现在,我们正在扩展到运输数字商品和实物商品。 这意味着某些订单将用于不需要实际装运的物品。 每个项目都知道它是数字产品还是物理产品。 权利管理团队已经创建了一个电子货运管理系统(通过电子邮件发送给您和我)-因此,我们需要做的就是确保我们不要尝试发布数字商品,而要通过电子邮件发送。 好吧,可能最简单的方法是:

毕竟,这只是一个“如果”,对吧
这一切都很好,很花哨,直到在UAT中我们意识到我们要显示3天的数字商品交付。 这是不对的,因此我们收到了要求立即显示数字商品交货的请求。 Item上有一种计算预计交货日期的方法:

好吧,这很容易-每个项目都知道它是否用于数字交付,因此如果出现以下情况,我们可以添加另一个项目:

毕竟,如果再增加一个,对吧伤害在哪里但是代码一点一点地变得越来越毛。
麻烦的是,您在代码中涂抹了很多无关的小毛发。 你在这儿有一根头发,那边又有一根。 知道它们是相关的–它们是在同一组更改中完成的。 但是其他人会在6个月内查看此代码吗如果我们需要进行更改,以便用户可以为支持这两种方式的商品选择电子和/或实物交付,该怎么办现在,我需要查找所有受到我们原始更改影响的地方并进行更多更改。 但是,它们并没有组合在一起,它们遍布各地。 当然,我可以有条不紊地找到他们。 但是,也许如果我首先将其构建得更好,会更容易吗

更好的方法

这一切都从一个布尔标志开始-这是第一个气味。 然后,我们发现自己检查了标志的状态并基于标志进行切换。 这几乎就像是一种新的交付方法领域概念 说,我创建了一个DeliveryMethod接口-每个项目可以有一个DeliveryMethod。

然后,我为此创建两个具体的实现:

现在,有关不同交付方式如何工作的所有逻辑都在DeliveryMethod类本地。 这将相关的更改分组在一起; 如果以后需要更改投放规则,则可以确切知道它们的位置。

学科

最终,编写干净的代码就是要遵守纪律 。 TDD是一门很好的学科–它使您专注于手头的任务,仅添加当前所需的代码; 同时确保您几乎可以完全覆盖测试范围。

但是,避免冗长的代码需要更多的纪律。 我们需要记住描述改变的意图,而不仅仅是实现。 代码主要是由人类读取的,因此表示代码做其所做的原因比表示逻辑重要得多。 测试仅确保您的逻辑正确,还需要确保您的代码能够揭示其原因。

参考资料:在Actively Lazy博客上,由我们的JCG合作伙伴 David Green进行的测试指导着不断发展的多毛软件 。

翻译自: https://www.javacodegeeks.com/2012/02/growing-hairy-software-guided-by-tests.html

文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树使用JDBC操作数据库数据库操作91268 人正在系统学习中 相关资源:【内存遍历工具】Cheat.Engine.V5.4.简体中文版-专业指导文档类…

来源:danpu0978

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年3月11日
下一篇 2020年3月12日

相关推荐