【问题标题】:Should we split an interface if only some methods of the interface are needed [closed]如果只需要接口的某些方法,我们是否应该拆分接口[关闭]
【发布时间】:2017-12-25 08:47:40
【问题描述】:

假设我们有一个如下所示的界面:

public interface ISome
{
    void MethodOne();
    int MethodTwo();
    string MethodThree();
}

一个类实现了接口:

public class Some : ISome
{
    // Implementation...
}

它的使用方法如下:

public class App
{
    public App(ISome)
    {
        // This class needs the whole interface: All three methods
    }
}

我有一个新需求,它只需要一个方法:MethodThree,它可以使用Some提供的实现。现在我有两个选择:

  1. 在新类中使用ISome,就像App 使用它一样。这样做的问题是,新类并不真正依赖于整个接口,而只依赖于一种方法。
  2. 使用继承像这样拆分接口:

    public interface INewSome
    {
        string MethodThree();
    }
    
    public interface ISome : INewSome
    {
        void MethodOne();
        int MethodTwo();
    }
    

第二个选项的好处是:

  1. 新类将依赖于INewSome
  2. Some 仍然实现了整个接口,因此现有代码不会中断。
  3. 单元测试会更加清晰,因为我们知道我们只需要模拟/存根INewSome 中的一种方法

问题

  1. 除了不必引入新界面之外,我想不出选项 1 的好处。您知道选项 1 的好处吗?
  2. 您还有其他建议吗?
  3. 我是否忽略了任何东西,这是好的还是坏的设计?

【问题讨论】:

  • 是时候了解SOLID中的I
  • @maccettura 谢谢,但我知道我在 SOLID 中。你能详细说明你想说什么吗?问题不是关于不同的实现,我希望从问题中可以清楚地看出这一点。
  • 如果您了解 SOLID,特别是 I(接口隔离)。那你为什么这么问?你已经知道答案了……
  • 删除那一行并不意味着它不是一个固执己见的问题;整个问题涉及要求其他人解释设计原则。它不涉及任何需要修复的“损坏”代码,这是 Stack Overflow 的一个关键。
  • 另外,您可能期望得到的响应不是很清楚;特别是,您驳回了一个似乎完全合理的答案“我不要求另一个实现”,但答案中没有提供任何实现。

标签: c# oop


【解决方案1】:

您在选项 2 中所做的是正确的,并且与第四个目标即接口隔离原则完美契合 来自维基百科many client-specific interfaces are better than one general-purpose interface

【讨论】:

  • 抱歉,这不是问题所在:我不是要求其他实现。
  • @CodingYoshi 你能说清楚一点
猜你喜欢
  • 2013-04-10
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
  • 2015-06-20
  • 2017-11-10
相关资源
最近更新 更多