2010-08-02 39 views
0

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

以上哪些情况您宁愿做,为什么?或者如果你能想到更好的方式,请告诉。

感谢

回答

2

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

0

它是正确的,如果不是所有这些实现这个单一大接口的类的有很多这要么什么都不做或抛出异常的方法呢?

如果情况并非如此,并且您拥有很多大型班级,并且存在许多不同的问题,那么您将面临一场痛苦的重构,但我认为现在处理这种重构是最好的方法 - 备选方案你建议你简单地把你推到不同的不好的情况,推迟痛苦,以获得小的收益。

一两件事可以做的是应用多个接口,一个类(在大多数语言),所以你可以创建新的接口,并与多个较小的替代单一大接口:

public class BigNastyClass : IBigNastyInterface 
{ 
} 

去到:

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

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

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

DriverProvider例如将走向:

public class DriverProvider : IBigNastyInterface 
{ 
} 

要:

public class DriverProvider : IDriverProvider 
{ 
} 

现在,您只需删除所有没有做任何超越了简单的满足大接口未使用的方法,并修复需要传递DriverProvider的任何方法。

+0

谢谢大家的回答。由于我不想花费任何时间重构所有的重构(至少目前不是),我只需将大接口分解为多个较小的接口,然后使用继承将它们聚合为一个接口,从而使聚合接口的名称保持不变作为一个大的。 – Dimitri 2010-08-02 17:26:50

0

这是困难的,没有任何标记或信息,告诉我们您正在使用的技术或技术来回答。

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

实现原来的接口已经全部实现它的类。

一旦创建了更小的接口,你只需要改变:

public class SomeProvider : IAmAHugeInterface { … } 

有:

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

...和你的代码运行它到底之前的方式,只要你有没有添加或删除从那里开始的任何成员。

从那里,你可以削减的类在需要的或遇到的基础和移除声明额外的方法和接口。

0

我会选择后者。制作单独的较小的界面,然后使“大”界面成为它们的集合。

之后,你可以重构的大界面消失在消费者也适用。