在这个建筑难题中我一无所知,我很想听听一些批评或建议。
情况:
Entity 和 Relation 都具有共享(INode)和唯一方法(IEntity或IRelation)
一个类需要使用接口IEntity或IRelation了解共享方法和唯一方法。
问题:
尝试使用S.O.L.I.D&DRY原理进行编程时,体系结构是处于好还是坏做法之下?
附加信息:这个问题的主要原因是因为在第一个图中(当前已实现),实体和关系都两次实现了INode接口。
情况1:
情况2:
答案 0 :(得分:5)
您的图很好地说明了separation of concerns(概念上)和interface segregation(类设计)之间的细微差别。
在您的情况下,没有两个选项,但是有四个选项:
IEntity
和IRelation
是INode
的特化。 IEntity
总是INode
。您可以编写将实体和关系作为节点进行处理的代码,但是可重用性降低:IEntity
与INode
耦合,即使这是两个不同的无关概念。 IEntity
和IRelation
是通过界面查看时彼此无关的事物。两者现在已经解耦并且可以独立使用,但是您无法意识到它们具有某些共同点,因此必须将它们分开处理。 IEntity
将同时实现常规接口和特定接口。优点:您可以像2中那样进行接口隔离,但是关注点分离更好。麻烦之处在于IEntity
可能不再是自立的。 INode
分为两个独立的接口:常规INamedObject
和特定的图形接口INode
。然后IEntity
和IRelation
将从INamedObject
继承而不能从INode
继承。好处是您可以将关注点真正分离:不是出于技术原因而人为地分离事物,而是根据它们所代表的概念进行人为分离。 最后,即使我个人建议选择方案4,您也必须为自己的设计找到合适的平衡点。因为只有您才能知道打算如何使用您的接口和类以及您真正想要表示的概念。