重构遗留代码,从一个具有小实现的巨型接口中提取小接口

时间:2013-03-04 15:00:32

标签: oop refactoring

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

SkypeAvailabilityManager.java

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

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

现在我需要与skype同步或与其他服务同步让我们说MessengerB

但是使用messengerB我不需要init,start,connect等,我只需要updateStatus方法。

所以我想到了这个重构(对我来说听起来不错,我会解释原因

Interface: ExternalStatusFetcher

方法:

.updateStatus

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

所以我的局限性:

  1. 重用SkypeAvailabilityManager.java
  2. 传统代码从代码中的许多地方调用.start .stop ...我不知道要改变什么,这是一个巨大的遗产。
  3. 我想在我的代码中使用一个通用接口,我想以同样的方式处理impl,但是客户端要么调用所有方法,要么只调用其中的一部分,直到执行实际初始化为止。 / LI>

    什么是好的重构呢? 如果我的容器类拥有一个包含所有方法的接口,那么这个方法很好,但是我的第二个实现并不需要所有的方法,所以我有点混淆该做什么。

1 个答案:

答案 0 :(得分:1)

如果您不想更改主叫代码,我会选择:

  1. 使用所有方法创建一个界面。有了这个,你明确地说明了你在代码中隐含的内容,即遗留软件和你的信使之间的契约。
  2. MessengerB实现接口,除了updateStatus之外的所有方法都只是无操作(即无效的空方法)。
  3. 如果您要使用许多这些信使实现,您可以创建一个实现接口的抽象类,其中所有方法都是no-ops,然后为每个特定信使创建一个子类,覆盖适当的方法。 / LI>

    恕我直言,这是一个很好的第一步,主要是因为它很好地捕获了当前的代码状态,很清楚你需要实现什么来创建新的信使,如果你想稍后重构遗留代码,可以作为基础

    HTH