【发布时间】:2015-09-07 13:32:04
【问题描述】:
我不明白接口隔离原则和开放/封闭原则有什么区别。
我的理解是,ISP 必须让一切都依赖于接口,而 OCP 则依赖于类,我发现它们都可以以相同的方式实现,但一种是接口,另一种是类。
【问题讨论】:
标签: oop solid-principles design-principles open-closed-principle interface-segregation-principle
我不明白接口隔离原则和开放/封闭原则有什么区别。
我的理解是,ISP 必须让一切都依赖于接口,而 OCP 则依赖于类,我发现它们都可以以相同的方式实现,但一种是接口,另一种是类。
【问题讨论】:
标签: oop solid-principles design-principles open-closed-principle interface-segregation-principle
Programming to interfaces 告诉我们我们的代码应该依赖于接口,而ISP 指导我们不要创建具有大量方法的神接口。大型接口会导致两个主要问题:
OCP 指导我们编写无需修改现有代码即可扩展的代码。因此,例如假设您有以下界面:
public interface ITask
{
void Execute();
}
然后创建实现ITask 接口的SendToEmailTask 类。
假设一段时间后出现新要求,您需要将日志记录添加到SendToEmailTask。根据OCP,您不应该修改现有代码,而是添加新的LoggingTask,它也实现了ITask 接口(使用Decorator 模式):
public class LoggingTask : ITask
{
private readonly ITask task;
public LoggingTask(ITask task)
{
//guard clause
this.task = task;
}
public void Execute()
{
Logger.Log("task...");
this.task.Execute();
}
}
感谢你也实现了Single Responsibility原则。
【讨论】:
让我们从单元测试开发的角度来看看原理。
如果您为单个接口/类编写大量单元测试,就好像您违反了 ISP 原则。界面太大了。
如果你想在测试接口/类中重写某个方法,但是由于这个方法不是虚拟的,你不能这样做,就好像你违反了OCP原则,你的类不允许扩展。
【讨论】: