如何在添加接口和添加属性之间进行选择

How to choose between adding an interface and adding an attribute

在我们的项目中,我们使用了 CQS 模式。因为我们的一些查询调用其他 web 服务,在我们的例子中这可能很慢,所以我们想要缓存这些结果。现在我找到了几种解决方法:

  1. 创建一个继承自 Query 对象的 CachedQuery。
  2. 向查询处理程序添加一个 'CacheResult' 属性,让装饰器检查该属性是否存在
  3. 向查询添加一个 'CacheResult' 属性,让装饰器检查该属性是否存在
  4. 实现一个'ICacheableQuery'接口,让装饰器检查这个接口的实现。

选项 1 因“组合优于继承”而被丢弃

选项 2 不是很灵活,例如不可能不缓存

可是3和4怎么取舍呢?添加一个属性不是继承(或者是?)所以这是平等的。两者都足够灵活,至少目前是这样。

我是否错过了一些令人信服的论点?或者是个人喜好问题,如果是你会选择做什么?

Adding an attribute is not inheritance (or is it?)

是否要继承您的自定义属性由您来实现。当您编写检查属性是否存在的代码时,您可以编写它,以便它也检查属性的基数 classes/interfaces。

正如评论者已经指出的那样,属性允许您添加可能有用的元数据,具体取决于您尝试实现的内容。

一般来说,我不喜欢为了区分类型而没有方法的接口。但最终...

Is it a matter of personal preference

是的。