1

我有一大段代码(遗留代码)知道连接到外部服务让我们说连接到Skype并带来它的可用性,它这样做的方式(这就是它的工作方式,为了示例)。是

SkypeAvailabilityManager.java

.init
.start
.stop
.connect
.disconnect
.keepAlive
.updateStatus

(让我们假设所有方法都需要公开并且有人调用它们)。现在有一大段代码(调用上述所有方法的大量遗留代码)。

现在我需要与Skype同步或与其他一些服务同步让我们说它MessengerB

但是对于 messengerB,我不需要初始化、启动、连接等,我只需要 updateStatus 方法。

所以我想到了这个重构(这对我来说听起来不太好,我会解释为什么

Interface: ExternalStatusFetcher

它的方法:

.updateStatus

现在遗留代码在许多地方调用上述.init .start .stop .connect 方法,但是我需要添加的新MessengerStatusUpdaterImpl 只需要.updateStatus 并且我想重用Skype 实现的.updateStatus 因为我想重用代码。

所以我的局限性:

  1. 重用 SkypeAvailabilityManager.java
  2. 遗留代码调用 .start .stop ... 从代码中的许多地方我没有什么要改变的,这是一个巨大的遗产。
  3. 我希望在我的代码中有一个共同的接口含义我想以相同的方式对待这两个 impl 但因此客户端要么调用所有方法,要么只调用其中的一部分我不知道,直到实现实际初始化为真正的实现。

什么是好的重构它?如果我的容器类拥有一个包含所有方法的接口,这应该很好,但是我的第二个实现不需要所有方法,所以我有点搞不清楚该怎么做。

4

1 回答 1

1

如果您不想更改调用代码,我会选择:

  1. 创建一个包含所有方法的接口。这样,您就可以明确说明您的代码中隐含的内容,即遗留软件和您的信使之间的合同。
  2. MessengerB实现接口,除此之外的所有方法updateStatus都只是无操作(即什么都不做的空方法)。
  3. 如果您将拥有许多这些 messenger 实现,您可以创建一个实现接口的抽象类,其中所有方法都是无操作的,然后为每个特定的 messenger 创建一个覆盖适当方法的子类。

恕我直言,这是一个很好的第一步,主要是因为它很好地捕获了当前代码状态,非常清楚地说明了创建新信使需要实现什么,并且可以作为以后重构遗留代码的基础。

高温高压

于 2013-03-04T15:40:33.523 回答