繁体   English   中英

如何处理胖接口?

[英]How can I deal with a fat interface?

假设我有一个大接口 IShape,它继承自 Circle、Square、Triangle...。

IShape 变得非常大,并且具有处理无关主题的功能:例如,许多用于尺寸计算,其他用于移动和动画,其他用于着色等。

这违反了接口隔离和单一职责原则,所以我试图找到更适合我的情况的设计模式,但我不确定什么是我继续进行的最佳方式。

我正在考虑在更小的界面中打破 IShape:IDimensions、IMovement、IColour ......然后让 Circle、Square 和 Triangle 从它们继承。 这将解决胖接口的问题(尽管实现仍然非常大)。

我应该遵循什么方法?

一种方法是保持对象(IShape)相当“哑”(仅跟踪其内部状态,加上样板访问函数),然后添加以更复杂的方式作用于它的独立函数。 在某些情况下,将这些函数集成到它们自己的类接口中可能很有用(特别是如果功能可以很好地分组并且需要一些内部状态),但根据我的观点和经验,独立库没有任何问题作用于对象的函数。 例如,请注意大部分 STL 是由非类函数组成的。

编辑:请注意,独立功能基本上是自动可重入的(线程安全)。 对于成员函数,您必须更加注意对象状态不会改变,您可能必须锁定某些部分,等等。

编辑2:我通常尝试支持对象的组合(对象A“具有”对象B)而不是继承(对象A“是”对象B的一种)。 当您考虑它时,正方形(“是”一种形状)可能“具有”一种颜色,但它“不是”一种颜色。 此外,请认真考虑您在哪个级别构成对象:是否每个 Shape 都有颜色和/或尺寸(在这种情况下,Shape 基类应该具有 Color 和 Size/Polygon/Geometry/BoundingBox/... 成员),或者做你想在你的代码生态系统中保持 Shape 接口更加抽象(在这种情况下,具体的几何形状继承自(抽象)Shape,并且还具有进一步的具体属性,例如大小和颜色)? 这(以及例如大小/几何的具体实现)主要取决于您想要对形状类似的对象做什么。

我支持丹尼尔的回答,也想补充一些花絮。

我认为适用的第三个原则是关注点分离( https://en.wikipedia.org/wiki/Separation_of_concerns )。 它说明了一切,什么也没有,而且还需要很多时间才能保持精神状态。 我缺乏关于您的应用程序的很多信息,所以我在黑暗中拍摄,但是,作为推理的一个例子:

为什么要将圆形和正方形关联起来? 他们的共同点是什么? 除了具有环绕 2D 区域的线之外,它们没有太多共同点。 圆有半径,正方形没有。 在正方形中,腿之间的角度是 90 度 - 圆形没有这种情况。 您无法使用完全相同的一组明确的、定义明确的变量来描述这两者。

那么,为什么要把它们放在同一个篮子里呢? 当你有答案,或者更可能的答案是为什么不让它们在同一个胖界面中时,我认为你正在理解你的设计的好方法。

希望你能找到自己的方式! /尼尔斯

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM