c# - 为每个类提取一个接口(interface)是最佳实践吗?

标签 c# interface software-design

我看过代码,其中每个类都有一个它实现的接口(interface)。

有时它们没有通用的接口(interface)。

它们就在那里,它们被用来代替具体的物体。

它们不为两个类提供通用接口(interface),而是特定于该类解决的问题领域。

有什么理由这样做吗?

最佳答案

没有。

接口(interface)适用于具有复杂行为的类,如果您希望能够创建该接口(interface)的模拟或假实现类以用于单元测试,则接口(interface)特别方便。

但是,有些类没有很多行为,可以更像值一样对待,通常由一组数据字段组成。为这样的类创建接口(interface)没有什么意义,因为这样做会引入不必要的开销,而模拟或提供接口(interface)的替代实现毫无意义。例如,考虑一个类:

class Coordinate
{
  public Coordinate( int x, int y);
  public int X { get; }
  public int y { get; }
}

您不太可能希望接口(interface) ICoordinate 与此类一起使用,因为除了简单地获取和设置 XY 值。

但是,类

class RoutePlanner
{
   // Return a new list of coordinates ordered to be the shortest route that
   // can be taken through all of the passed in coordinates.
   public List<Coordinate> GetShortestRoute( List<Coordinate> waypoints );
}

您可能需要 RoutePlannerIRoutePlanner 接口(interface),因为有许多不同的算法可用于规划路线。

此外,如果您有第三堂课:

class RobotTank
{
   public RobotTank( IRoutePlanner );
   public void DriveRoute( List<Coordinate> points );
}

通过为 RoutePlanner 提供一个接口(interface),您可以为 RobotTank 编写一个测试方法,该方法创建一个带有仅返回列表的模拟 RoutePlanner坐标没有特别的顺序。这将允许测试方法检查坦克是否在坐标之间正确导航,而无需同时测试路线规划器。这意味着您可以编写仅测试一个单元(坦克)的测试,而无需同时测试路线规划器。

不过您会看到,将真实的坐标输入到这样的测试中非常容易,而无需将它们隐藏在 ICoordinate 界面后面。

关于c# - 为每个类提取一个接口(interface)是最佳实践吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3036749/

相关文章:

c# - 如何使用 C# 访问内存中的地址?

c# - HttpClient GetAsync 和 ReadAsStringAsync 需要反序列化复杂 JSON 响应的一部分

linux - 使用通用国际象棋界面

php - 为什么 PHP Trait 不能实现接口(interface)?

java - 注释来解决接口(interface)未实现方法的所有错误?

java - 如何让黑莓手机的背景变黑?

language-agnostic - 在正式软件设计中处理非晶子系统

c# - VS 2008 Professional,Smart Device .NET C# 项目 - 构建缓慢

c# - 多个 Entity Framework 表破坏 WCF

java - 跟踪 Java Swing 应用程序中未保存的更改