【问题标题】:How to renew a weird Applications without making the same errors?如何更新一个奇怪的应用程序而不犯同样的错误?
【发布时间】:2009-10-07 09:26:27
【问题描述】:

我的新项目是更新客户使用多年的软件。 就像我们都知道的那样......多年来,事情不断发展。

所以我查看了旧应用程序。获取有关它的所有信息并写下很多用户故事。 清理完之后,我意识到我(最终)犯了一个错误,导致了与客户现在遇到的同样的问题。

这是我犯的另一个错误,但真的很烦人。

你们如何防止此类错误。您拒绝查看旧应用吗?

【问题讨论】:

  • 你没有说错误或问题是什么,它是一个混淆的要求,它是矛盾的要求,它是一个错误的假设,它是一个环境约束。如果我们不知道所犯的错误,我们如何提供避免它的方法?我能提出的唯一建议是严格的同行评审,但即使这样有时也会失败。
  • 数据库出错了。旧应用程序的许多奇怪的事情,例如处理新数据,都是基于该数据库。重新设计后……由于处理新数据,我犯了某种相同的错误。这真的很烦人。我想防止这样的错误...我非常看重旧代码/数据库

标签: design-patterns


【解决方案1】:

这是一个非常困难的问题。如果旧代码很大,我将描述我会做什么(并且已经做过)。

一般来说,旧代码充满了决策、错误修复和未记录的行为。如果你把它扔掉,你肯定会犯许多与他们一样的错误,然后更多。

为了它的价值,你应该进化系统围绕旧代码。尝试从旧代码中抽象出来,例如,通过创建接口,然后通过调用旧代码首先来实现它们。为接口编写大量单元测试,并获得有关旧代码如何工作的知识。新功能应该获得新的实现,因此旧代码和新代码将并存,只要需要,甚至可能永远存在。

现在,慢慢地、小心地侵入旧代码,重构它,替换它,并确保你的测试仍然通过。还要编写新的测试。如果您对系统进行了回归测试(除了单元测试),它们仍然需要通过。

不接触旧代码是可以的,通常情况下,如果它工作正常,没有错误报告,它通过了您的测试,并且不需要扩展。

一些不错的资源:

http://martinfowler.com/bliki/StranglerApplication.html

Working Effectively with Legacy Code

我已经在 StackOverflow 中找到了它:

Strategy for large scale refactoring

【讨论】:

    【解决方案2】:

    单元测试。但是,如果您以前没有进行单元测试,它们将无法帮助您。

    【讨论】:

    • 单元测试并不能防止项目规划错误。
    • 主要问题是我的程序实际上以正确的方式工作。所以这不是真正的编程错误。单元测试很难找到这样的设计问题。
    【解决方案3】:

    这个问题听起来像是通过“清理”而不是重写现有代码来修改现有代码。这个过程有时被称为“重构”。 Martin Fowler 有一本关于重构的好书,名为“Refactoring”。他首先给出了重构实际代码的具体示例,并在代码旁边链接了关于他正在使用的特定技术的未来章节。

    他谈到重构的第一件事就是编写一个测试来测试您正在更改的代码是否对某些常见的输入集执行相同的操作。然后,当您“重构”代码时,对它运行测试以确保它的功能完全相同。这可以是前错误修复或后错误修复。但是如果有bug,除了重构,当然还得squash。

    【讨论】:

    • 重构是个好主意。由于它是不同类型的应用程序(访问),它可能会变得困难。我正在构建一个新的基于 Grails 的 Wep 应用程序。
    【解决方案4】:

    为什么要从头开始重写?您也许可以重用现有应用程序的某些部分并重构那些需要更改的部分。

    【讨论】:

    • 这是一个旧的基于访问的应用程序。有点过时,不足以满足客户的需求。
    【解决方案5】:

    当我要重新创建已经完成的东西时,我会尽量避免查看已经存在的实现。我试着专注于它应该完成的事情,而不是看它是如何尝试完成的。

    【讨论】:

    • 是的,我同意你的看法。但是,已经内置的特殊客户需求呢?您是否要求客户这样做...我通过阅读代码和测试应用程序来实现这一点。
    • 这基本上是一样的:你必须找出应用程序应该做什么而不是它当前正在做什么。在查看现有源代码时,您必然会重复现有的错误——这正是您要避免的。为了防止这种情况发生,您必须联系客户并了解他们真正想要的是什么。
    猜你喜欢
    • 2016-09-18
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 2022-01-12
    • 2014-12-25
    • 1970-01-01
    • 2021-10-10
    相关资源
    最近更新 更多