任何不当使用接口的示例
本文关键字:接口 任何不 | 更新日期: 2023-09-27 17:56:45
我想避免在不需要时使用接口。比如有一个接口AAA
,有一个类AAAImpl
实现它,这个接口AAA
只由AAAImpl
实现,AAAImpl
只实现一个接口,就是这个AAA
。这样做的论点是代码是解耦的,单元测试会更容易,将来会有更多的选择来添加更多功能,等等。
这些论点是否有效?
一个类实现一个接口是设计类库的一个完全有效的策略,只要类的用户没有直接访问实现类。这是最好的信息隐藏:用户看到他们需要看到的内容,而你保持以更多方式重新设计实现的能力,而不是让用户直接访问实现类。
这也使用户能够灵活地测试其代码,而无需依赖接口定义之外的任何代码。
总的来说,这是一个没有缺点的双赢局面。
就接口的不良使用而言,有许多可能性:
- 尝试执行太多操作的接口 - 添加一个涵盖执行许多不同任务的类的每个方法的接口是一个坏主意,除了"基础结构接口",例如定义远程处理所需的接口。
- 尝试执行的操作太少的接口 - 此类接口涵盖了类的一小部分功能,而不允许在不引用实现类的情况下执行有意义的任务。 为
- 类的功能提供较差匹配的接口 - 例如,向可变类添加
IComparable<T>
或IEquitable<T>
。
接口
的一个不好的用法是当 iterface 比它需要的更多时,实现接口的类将不得不实现所有那些通常不应该实现的方法。
例如,我们有用于打印的界面,我们有许多不同的打印版本(从没有页脚的html文档,从带页脚的html文档,从pdf等)。
所以我们的界面将看起来像:
public interface IPrinter{
public void printHtmlWithFooter();
public void printHtmlWithoutFooter();
public void printPdf();
}
然后你有实现:
public class HtmlPrinter implements IPrinter{
public void printHtmlWithFooter(){
// some code, printing ....
}
public void printHtmlWithoutFooter(){
// some code, printing ....
}
public void printPdf(){}
}
public class PdfPrinter implements IPrinter{
public void printHtmlWithFooter(){}
public void printHtmlWithoutFooter(){}
public void printPdf(){
// some code, printing ....
}
}
如您所见,您需要在每个类中实现所有这些方法,即使它们完全为空。假设你有 10 个不同的类来实现 IPrinter 接口,并且你想在接口中添加一个额外的方法,所以你需要在每个类中执行实现。这将是您不应该使用接口的示例之一。
相反,您应该只有:
public interface IPrinter{
public void print();
}
然后客户不在乎它将如何打印以及什么,他只知道必须调用方法print(),仅此而已。具体类应该关注具体的实现。