两次实现一个接口是不好的做法吗?

时间:2020-02-13 16:42:10

标签: architecture uml dry class-design solid-principles

在这个建筑难题中我一无所知,我很想听听一些批评或建议。

情况:

Entity Relation 都具有共享(INode)和唯一方法(IEntity或IRelation)

一个类需要使用接口IEntity或IRelation了解共享方法和唯一方法。

问题:

尝试使用S.O.L.I.D&DRY原理进行编程时,体系结构是处于好还是坏做法之下?

附加信息:这个问题的主要原因是因为在第一个图中(当前已实现),实体和关系都两次实现了INode接口。

情况1:

situation 1

情况2:

situation 2

1 个答案:

答案 0 :(得分:5)

您的图很好地说明了separation of concerns(概念上)和interface segregation(类设计)之间的细微差别。

在您的情况下,没有两个选项,但是有四个选项:

  1. 您的第一个图说IEntityIRelationINode的特化。 IEntity总是INode。您可以编写将实体和关系作为节点进行处理的代码,但是可重用性降低:IEntityINode耦合,即使这是两个不同的无关概念。
  2. 您的第二张图显示IEntityIRelation是通过界面查看时彼此无关的事物。两者现在已经解耦并且可以独立使用,但是您无法意识到它们具有某些共同点,因此必须将它们分开处理。
  3. 另一个变体是解决方案1,但在接口之间没有继承。在这种方法中,您具有独立的接口:IEntity将同时实现常规接口和特定接口。优点:您可以像2中那样进行接口隔离,但是关注点分离更好。麻烦之处在于IEntity可能不再是自立的。
  4. 另一个变体(我的最爱)是将INode分为两个独立的接口:常规INamedObject和特定的图形接口INode。然后IEntityIRelation将从INamedObject继承而不能从INode继承。好处是您可以将关注点真正分离:不是出于技术原因而人为地分离事物,而是根据它们所代表的概念进行人为分离。

最后,即使我个人建议选择方案4,您也必须为自己的设计找到合适的平衡点。因为只有您才能知道打算如何使用您的接口和类以及您真正想要表示的概念。

enter image description here

相关问题