2010-07-05 54 views
2

我们有一个遗留系统,由A,B和C类组成.A非常可怕。 B和C也是! (这是公司内部公认的,我们正试图在未来重新考虑它们)。对传统代码添加更改

更可怕的是A和B扩展了C,他们真的不应该,因为它们不是真正的同样的事情。一位开发者(称他为X)承认他这样做是为了让A和B可以使用C的一些方法!

现在客户想要更新遗留系统和变化要求我加入到A和B相同的变化有什么我能做的就是添加更改为C,那么A和B可以看到它。但是如果我这样做,我将会像X一样做同样的事情。

我心目中什么是写另一个类d,所以A和B可以有自己的d,并得到了改变。你怎么看?

提前致谢!

莎拉

回答

4

有道理。 Josh Bloch还建议在有效的Java中使用合成而不是继承。当你在检查它时,检查你是否不能移动其他共享例程。许多小步骤覆盖了很大的距离。

+1

如果你以前可以添加一些单元测试,它会更好,为了更有信心在你的重构... – 2010-07-05 16:25:22

1

很难给出一个明确的答案这样一个笼统的问题。

将普通(无状态)方法转换为帮助类的想法是一个很好的方法。同样,将一个类的调用委托给另一个类调用可以通过来减少已经膨胀的类的大小。

然而,这是很难说的辅助类或委派是否是在这种特殊情况下的最佳解决方案。例如,如果现有类中的方法紧密耦合,则可能很难将它们分为不同的类。

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

+0

是的,我想要做的是 - 提出重构。然而事实是,我们必须首先推出这些变化...... :( – sarahTheButterFly 2010-07-05 08:06:41

+0

@sarahTheButterFly请小心这种态度:确保您所做的每一项更改都会使代码比开始之前更干净。不要在代码更清洁之前先发布代码它不一定是一尘不染,只是简单一点而已,请记住下面的话:“如果你发现自己在一个洞里,首先要做的就是停止挖掘。” – 2010-07-05 23:25:38

+0

@Peter是的,我理解你的意思,我完全同意但是我不是决策者,我希望我是这样的!我在开始之前试着让代码清理干净,这就是为什么我在这里问这个问题的原因: – sarahTheButterFly 2010-07-05 23:58:22

0

萨拉,

这是很难不知道A,B之间的确切关系给予具体建议,并C.我要去承担,如果他们需要确切的B必须以某种方式相似同样的变化。因此,假设A和B与C类似,但与C不同,您可能需要执行以下操作:

  1. 创建一个A类和B类扩展的父类D。此父级包含A和B共享的功能(您计划进行更改)。
  2. 要么创建包含功能A,B,和C共享和具有C和d独立的类具有它的一个实例或创建另一个父类,E,对于C和d包含函数A,B和C有共同之处。

同样,如果我的假设是错误我的建议可能是无效的。你能否给我们提供A,B和C如何相关的更好的想法?

+0

谢谢Jake回复是的,我认为A和B可能有一个父类D,但是这两个类都需要重新考虑并分解成许多小类,我希望能够清楚地概述A,B, C就像一个nd他们是如何相关的,但我不能,因为他们太麻烦和复杂。我们正在考虑重写它们,但我确实记得Joel关于Netscape故事的文章......我认为这篇文章应该被关闭,这样我就不会混淆更多的人。 – sarahTheButterFly 2010-07-05 23:23:27

+0

不是问题,莎拉。我想我们都和你现在所处的位置处于类似的位置。你只需要对你提供的东西做出适当的回应,并希望在这个过程中使系统更好一些。 – 2010-07-06 13:20:29