需要有关接口重构的建议

时间:2010-08-02 01:54:44

标签: interface refactoring

我继承了一个声明了一个非常大的接口的项目(让我们称之为IDataProvider)。应用程序的所有方面都有方法在文件中聚集。并不是说这是一个很大的问题,但我宁愿把它们分成带有描述性名称的小文件。重构接口并在多个接口中分解它(比如说IVehicleProvider,IDriverProvider等......)将需要大量的代码重构,因为有很多类实现了接口。我正在考虑另外两种排序方法:1)为应用程序的每个方面创建多个文件,并使界面部分或2)创建多个接口,如IVehicleProvider,IDriverProvider,并从中获取IDataProvider接口。

您更愿意做以上哪项以及为什么?或者,如果你能想到更好的方法,请告诉你。

由于

4 个答案:

答案 0 :(得分:2)

This book表明接口属于提供者,而不属于接口的客户端。也就是说,您应该根据用户而不是实现它们的类来定义它们。适用于您的情况,IDataProvider的用户每个(可能)只使用该大接口的一小部分功能。选择其中一个客户。将其使用的功能子集提取到新接口,并从IDataProvider中删除该功能(但如果您想让IDataProvider扩展您的新界面以保留现有行为,请随意)。重复直到完成 - 然后摆脱IDataProvider。

答案 1 :(得分:0)

是否正确的是,大多数(如果不是所有)实现这个单一大接口的类都有很多方法可以做任何事情或者抛出异常?

如果情况并非如此,并且你有很多大型课程,其中包含许多不同的问题,那么你将进行一次痛苦的重构,但我认为现在处理这种重构是最好的方法 - 替代你建议只是让你进入不同的不良情况,推迟痛苦,但收益微薄。

可以做的一件事是将多个接口应用于单个类(在大多数语言中),这样您就可以创建新的接口并将单个大接口替换为多个较小的接口:

public class BigNastyClass : IBigNastyInterface
{
}

转到:

public class BigNastyClass : ISmallerInferface1, ISmallerInterface2 ...
{
}

如果你没有实现整个界面的庞大类,我会逐个类地解决这个问题。对于实现这个大接口的每个类,只为该类引入一个新的特定接口。

这样,您只需要一次重构一个类的代码库。

例如,

DriverProvider将来自:

public class DriverProvider : IBigNastyInterface
{
}

要:

public class DriverProvider : IDriverProvider
{
}

现在你只需删除除了满足大接口之外没有做任何事情的所有未使用的方法,并修复任何需要传递DriverProvider的方法。

答案 2 :(得分:0)

如果没有任何标签或信息告诉我们您正在使用的技术或技术,这很难回答。

假设.NET,最初的重构应该非常小。

实现原始接口的类已经完全实现了它。

创建较小的界面后,您只需更改:

public class SomeProvider : IAmAHugeInterface { … }

使用:

public class SomeProvider : IProvideA, IProvideB, IProvideC, IProvideD { … }

...并且您的代码完全按照以前的方式运行,只要您没有添加或删除任何成员就可以开始使用。

从那里,您可以根据需要或遇到的方式减少类,并从声明中删除额外的方法和接口。

答案 3 :(得分:0)

我会做后者。制作单独的,较小的接口,然后将“大”接口作为它们的聚合。

在此之后,您可以根据需要在其消费者中重构大型界面。