【问题标题】:Code smell - only 1 concrete class and interface代码异味 - 只有 1 个具体的类和接口
【发布时间】:2015-12-13 14:16:03
【问题描述】:

我有一个界面:

interface DataExtractor {
  public function extractData($dataSource);
}

我最终只有一个具体的例子,它的通用性足以满足我所有的需求。

因此,我对具体类的命名存在疑问,这导致我问这是否是代码异味,我实际上不应该首先拥有接口。

  • 默认数据提取器
  • BaseDataExtractor
  • 将接口更改为 iDataExtractor 并将具体类更改为 DataExtractor

这些似乎都错了

【问题讨论】:

  • 离开接口,它可用于单元测试的模拟目的,也可用于依赖注入。通常最好编码到抽象而不是具体。
  • 因此,你会如何命名具体类?
  • 我将调用接口 IDataExtractor,因为这是接口的命名约定并调用类 DataExtractor。
  • 投反对票,因为“这个问题没有显示任何研究工作。”谷歌搜索提供了大量关于界面宗教辩论的示例,包括关于 SO 和 programmers.stackexchange 的多个示例。

标签: design-patterns interface


【解决方案1】:

我会选择第三个选项——删除接口。当你不需要间接时,你会在你所有的类上放置接口。这只是令人困惑。更少的代码是更好的代码。当您需要抽象时,您应该添加接口。届时,重构工具将使这项任务变得非常简单。

【讨论】:

    【解决方案2】:

    除了拥有多个实现之外的好处 -

    1. 测试 - 类可以密封公共方法,然后无法覆盖这些方法以支持正确的测试。
    2. 同一个类不同的接口 - 你的唯一一个实现可能需要从某个框架类继承,如果你的语言不允许多重继承,那么它就会成为一个问题。
    3. 分发 - 分别提供接口和实现。如果你的实现永远不会在一个系统中使用,但声明它的类会使用,那么只发送实现是没有用的。
    4. 内存消耗 - 一些运行时环境在减速时加载类对象。通过分离减速,接口将允许您推迟加载实现类,直到实际使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-14
      • 2018-11-23
      • 1970-01-01
      • 2019-10-12
      • 2012-02-24
      • 2017-06-18
      • 2015-01-09
      相关资源
      最近更新 更多