如何构建应用程序目录层次结构中的接口

use*_*348 2 .net c# interface application-design

将它们全部放在一个单独的文件夹结构中,还是与实现它们的类一起放入?

Mar*_*ann 6

您永远不应该将接口与实现它们的类放在一起(除非这些类满足下面的要求).这样做会在接口和实现者之间引入紧密耦合,如果没有同时引用实现者,您将无法创建接口的其他实现.

你基本上有两个选择:

  • 将接口与使用它们的类放在一起.这仍然会产生紧密耦合,但这种耦合问题较少,因为消费者经常住在提供相关类型的库中.在这种情况下,如果您在此库中有实现者,他们可以实现接口而不引入任何其他耦合.
  • 为了最终松散耦合,将接口放在一个单独的库中.这为您提供了更大的灵活性,但也可能需要额外的工作.

  • @Mark Seemann - 我不明白你的紧耦合问题.例如,如果在Java中我有一个公共接口,并且它的package-private默认实现在同一个包中,那么这个设置如何将两者相结合?我也想念你所指的"下面的要求". (3认同)
  • @Péter Török:要实现接口,您必须引用它。如果实施者在同一个库中,则沿该实施者拖动。在某些情况下,这似乎无关紧要,但如果实现者很大或引用其他特定于实现的库,则实现会泄漏。即使情况并非如此,它仍然是错误的,因为它会迫使消费者拥有对实现者的引用,而不仅仅是接口,从而与它紧密耦合。 (2认同)
  • 我明白了,谢谢.我普遍同意,虽然我考虑的情况是,当一个人发布作为库的一部分的接口时,例外而不是规范.虽然分离仍然没有伤害(除了它使包层次结构复杂一点). (2认同)