【发布时间】: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提供的实现。现在我有两个选择:
- 在新类中使用
ISome,就像App使用它一样。这样做的问题是,新类并不真正依赖于整个接口,而只依赖于一种方法。 -
使用继承像这样拆分接口:
public interface INewSome { string MethodThree(); } public interface ISome : INewSome { void MethodOne(); int MethodTwo(); }
第二个选项的好处是:
- 新类将依赖于
INewSome -
Some仍然实现了整个接口,因此现有代码不会中断。 - 单元测试会更加清晰,因为我们知道我们只需要模拟/存根
INewSome中的一种方法
问题
- 除了不必引入新界面之外,我想不出选项 1 的好处。您知道选项 1 的好处吗?
- 您还有其他建议吗?
- 我是否忽略了任何东西,这是好的还是坏的设计?
【问题讨论】:
-
是时候了解SOLID中的
I了 -
@maccettura 谢谢,但我知道我在 SOLID 中。你能详细说明你想说什么吗?问题不是关于不同的实现,我希望从问题中可以清楚地看出这一点。
-
如果您了解 SOLID,特别是
I(接口隔离)。那你为什么这么问?你已经知道答案了…… -
删除那一行并不意味着它不是一个固执己见的问题;整个问题涉及要求其他人解释设计原则。它不涉及任何需要修复的“损坏”代码,这是 Stack Overflow 的一个关键。
-
另外,您可能期望得到的响应不是很清楚;特别是,您驳回了一个似乎完全合理的答案“我不要求另一个实现”,但答案中没有提供任何实现。