【问题标题】:Add a change to legacy code添加对旧代码的更改
【发布时间】:2010-07-05 07:24:54
【问题描述】:

我们有一个由 A、B 和 C 类组成的遗留系统。A 既可怕又庞大。 B也是。C也是!! (这在公司内部得到承认,我们正试图在未来重新考虑它们)。

更可怕的是 A 和 B 扩展了 C,他们真的不应该这样做,因为它们并不是一回事。进行编码的开发人员(称他为 X)承认,他这样做是为了让 A 和 B 可以使用 C 的“某些”方法!

现在客户想要更新旧系统,而更改要求我将相同的更改添加到 A 和 B。我可以做的是将更改添加到 C,以便 A 和 B 可以看到它。但如果我这样做,我会做和 X 一样的事情。

我的想法是编写另一个 D 类,这样 A 和 B 就可以拥有自己的 D 并获得更改。你怎么看?

提前致谢!

莎拉

【问题讨论】:

    标签: java legacy


    【解决方案1】:

    有道理。 Josh Bloch 还建议在有效的 Java 中使用组合而不是继承。当您使用它时,请检查您是否也无法将其他几个共享例程移过来。许多小台阶覆盖很远的距离。

    【讨论】:

    • 如果能在之前添加一些单元测试就更好了,这样对你的重构更有信心...
    【解决方案2】:

    对于这样笼统的问题,很难给出明确的答案。

    将通用(无状态)方法移入辅助类的想法可能是一个不错的想法。同样,将一个类的调用委托给另一个类的调用可能是减少已变得臃肿的类的大小的好方法。

    但是,在这种特殊情况下,很难说辅助类或委托是否是最佳解决方案。例如,如果现有类上的方法是紧密耦合的,则可能很难将它们分成单独的类。

    也许最好的解决方案是提出现有类的重构并摆脱不适当的(如您所报告的)基类。

    【讨论】:

    • 是的,我真正想做的是——提出重构。然而现实是我们必须先把改变推出...... :(
    • @sarahTheButterFly 小心这种态度:确保您所做的每一次更改都使代码比开始之前更干净。在代码更干净之前不要发布代码。它不必一尘不染,只是不那么复杂。记住这句话:“如果你发现自己在一个洞里,首先要做的就是停止挖掘。”
    • @Peter 是的,我明白你的意思。我完全同意 Stephen C 关于提出重构过程的建议。但是我不是决策者。我希望我是!在开始之前,我确实尝试让代码更清洁。这就是我在这里问这个问题的原因。
    【解决方案3】:

    莎拉,

    如果不知道 A、B 和 C 之间的确切关系,很难给出具体的建议。如果 A 和 B 需要完全相同的更改,我将假设它们在某种程度上必须相似。因此,假设 A 和 B 相似但与 C 不同,您可能需要执行以下操作:

    1. 创建一个父类 D,A 和 B 都从该类扩展。此父项包含 A 和 B 共享的功能(您计划更改)。
    2. 要么创建一个包含函数 A、B 和 C 共享的单独类,并让 C 和 D 拥有它的实例,要么为 C 和 D 创建另一个父类 E,其中包含 A、B 的函数, 和 C 有共同点。

    同样,如果我的假设是错误的,我的建议可能无效。您能否让我们更好地了解 A、B 和 C 之间的关系?

    【讨论】:

    • 感谢杰克的回复。是的,我认为 A 和 B 有可能有一个父类 D。但是这两个类都需要重新分解并分解为许多小类。我希望我能清楚地概述 A、B、C 是什么样的以及它们之间的关系,但我不能,因为它们太混乱和复杂了。我们正在考虑重写它们,但我确实记得 Joel 关于 Netscape 故事的文章……我认为应该关闭这篇文章,以免让更多人感到困惑。
    • 没问题,莎拉。我认为我们都处于与你现在所处的位置相似的位置。你只需要按照你所得到的去做,并希望在这个过程中让系统变得更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 2021-12-03
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    相关资源
    最近更新 更多