你可以做一个传统的代码库,它将对提高质量影响最大的是什么?(What can you do to a

2019-08-16 17:37发布

当你在一个传统的代码库工作,什么都会有一段时间的影响最大,这将提高代码库的质量?

  • 删除未使用的代码
  • 删除重复的代码
  • 添加单元测试,提高测试覆盖率,其中覆盖率低
  • 创建跨文件格式保持一致
  • 更新第三方软件
  • 降低静态分析工具生成的警告(ieFindbugs)

代码库已经与不同的专业知识水平多年来,有很多的未经测试和一些不可测没有写作测试花费显著时间方面写了很多开发商。

Answer 1:

  • 阅读Michael羽毛的书“修改代码的工作”

这是一本很好的书。

如果你不喜欢这个答案的话,我能给的最好的建议是:

  • 首先,停止制造新的遗留代码[1]

[1]:遗留码=不带单元测试代码,因此一个未知

没有自动化测试套件代替改变遗留代码是危险的,不负责任的。 如果没有良好的单元测试覆盖率,你不可能知道什么是影响这些变化都会有。 羽毛建议使用“束缚”的办法,你隔离,你需要改变,写一些基本的测试来验证基本假设,使单元测试支持的微小变化,并从那里工作了码区域。

注:我不是说你需要停止一切花费数周时间编写测试的一切。 恰恰相反,就在你需要测试,并从那里工作了区域测试。

吉米·博加德和雷休斯敦做了非常类似于这样一个主题一个有趣的屏幕转换: http://www.lostechies.com/blogs/jimmy_bogard/archive/2008/05/06/pablotv-eliminating-static-dependencies-screencast。 ASPX



Answer 2:

我用了约50程序员编写和修改了传统的1M LOC应用程序。

* Remove unused code

几乎没用......只是忽略它。 你不会得到一个大的投资回报(ROI)。

* Remove duplicated code

其实,当我解决我的东西总是搜索重复。 如果我发现了一些我把泛型函数或评论所有的代码发生了重叠(有时,用于把一个泛型函数的努力不值得)。 主要的想法是,我讨厌做同样的动作不止一次。 另一个原因是,因为总是有一个人(可能是我)忘记检查其他发生...

* Add unit tests to improve test coverage where coverage is low

自动单元测试是美好的...但如果你有一个大的积压,任务本身是很难推动,除非你有稳定性问题。 与正在工作的一部分去,并希望在数年你有体面的覆盖面。

* Create consistent formatting across files

IMO在格式不同的是遗产的一部分。 它给你约谁的代码编写或当一个提示。 这可以给大家介绍如何在代码的那部分表现了一些线索。 这样做重新格式化的工作,是不是有趣,它不会给你的客户的任何价值。

* Update 3rd party software

这样做只是,如果有新的非常好的功能的,或者您的版本不是由新操作系统支持。

* Reduce warnings generated by static analysis tools

它可以值得。 有时警告可以隐藏了潜在的错误。



Answer 3:

Add unit tests to improve test coverage. Having good test coverage will allow you to refactor and improve functionality without fear.

There is a good book on this written by the author of CPPUnit, Working Effectively with Legacy Code.

Adding tests to legacy code is certianly more challenging than creating them from scratch. The most useful concept I've taken away from the book is the notion of "seams", which Feathers defines as

"a place where you can alter behavior in your program without editing in that place."

Sometimes its worth refactoring to create seams that will make future testing easier (or possible in the first place.) The google testing blog has several interesting posts on the subject, mostly revolving around the process of Dependency Injection.



Answer 4:

我会说“删除重复的代码”几乎意味着你必须拉出代码和抽象的它,所以它可以在多个地方使用 - 这样,在理论上,使错误更容易解决,因为你只需要一个固定的代码段,而不是很多代码片段,以修复一个bug。



Answer 5:

我可以涉及到这个问题,因为我目前在我的腿上“那些”老学校代码库之一。 它不是一个真正的遗产,但它肯定不是跟随几年的趋势。

我会告诉你的事情我会喜欢它,每天固定为他们的错误我:

  • 记录了输入和输出变量
  • 重构的变量名,使他们真正的意思是其他的东西,一些匈牙利符号前缀后面的三个字母与一些不起眼的含义的缩写。 CammelCase是要走的路。
  • 我害怕改变任何代码的死亡,因为它会影响到众多使用该软件,有人会发现,即使是最不起眼的副作用的客户。 任何重复的回归测试将是一件幸事,因为现在是零。

剩下的就是真正的花生。 这是与传统的代码库的主要问题,他们真的吃了大量的时间。



Answer 6:

我会说这在很大程度上取决于你想用旧代码做什么?

如果将无限期地停留在维护模式和它的正常工作,什么都不做是最好的选择。 “如果不破,不解决它。”

如果它不做工精细,去掉无用的代码和重构重复代码将使调试方便很多。 但是,我只会做对犯错误的代码,这些变化。

如果您计划在2.0版本中,添加单元测试和清理代码,你会提出



Answer 7:

良好的文档。 正如有人谁有权维护和扩展的遗留代码,这是头号问题。 这是困难的,如果不是彻头彻尾的危险更改代码,你不明白。 即使你足够幸运递给记录代码,如何确保你的文件是正确的? 它涵盖了所有的原始作者的隐性知识? 它说所有的“招数”和边缘情况?

良好的文档是什么让那些比原来笔者了解,修复和延长甚至恶意代码等。 我要砍死尚未充分证明代码,我可以在很完美高深莫测的代码了解一周的任何一天。



Answer 8:

我对我所做的,我有工作的遗留代码的单一最重要的事情是要围绕它建立一个真正的API。 这是我建立的围绕.NET对象模型1970年的风格COBOL API,让所有的不安全的代码是在一个地方,所有的API的原生数据类型和.NET数据类型之间的转换是在一个地方,在主要方法返回和接受数据集,等等。

这是非常难以做到的权利,还有它的一些缺点,我知道的。 这并不是高效的得不得了要么,与所有的那张编组。 但在另一方面,我可以建立一个往返数据到15岁的应用程序,它在约一个半小时坚持其Btrieve的(!)的数据,和它的作品一个DataGridView。 当客户来到我的项目,我估计是在几天或几周,而不是几个月或几年。



Answer 9:

作为平行什么乔希·西格尔说,我要说的评论地狱出来。 我上得到了我的腿上甩几个非常大的遗留系统的工作,我发现最大的问题是跟踪的东西我已经了解一个特定的代码段。 一旦我开始把笔记,因为我去,包括“待办事项”的笔记,我停下来再搞清楚什么我已经想通了。 然后,我可以专注于那些代码段的流动方式和交互。



Answer 10:

我想说的只是息事宁人的大部分。 如果它不破那就不要修复它。 如果它坏了,然后继续前进,修复和改进即碎和其紧密围绕代码的代码部分。 您可以使用错误的疼痛或缺阵功能缺失证明的努力和提高该部分费用。

我不会推荐任何一种批发重写,重构,重新格式化,或者投入的不是由实际业务或最终用户需要引导的单元测试。

如果你有机会来解决事情,那么这样做的权利(做正确的第一次的机会可能已经过去了,但既然你再次接触的那部分还不如做它周围正确的时间),这包括所有你提到的项目。

因此,在总结,没有单一的或只是几件事情,你应该做的。 你应该做的这一切,但在一小部分,并以机会的方式。



Answer 11:

Late to the party, but the following may be worth doing where a function/method is used or referenced often:

  • Local variables often tend to be poorly named in legacy code (often owing to their scope expanding when a method is modified, and not being updated to reflect this). Renaming these in line with their actual purpose can help clarify legacy code.
  • Even just laying out the method slightly differently can work wonders - for instance, putting all the clauses of an if on one line.
  • There might be stale/confusing code comments there already. Remove them if they're not needed, or amend them if you absolutely have to. (Of course, I'm not advocating removal of useful comments, just those that are a hindrance.)

These might not have the massive headline impact you're looking for, but they are low risk, particularly if the code can't be unit tested.



文章来源: What can you do to a legacy codebase that will have the greatest impact on improving the quality?