我不明白接口隔离原则和开放/封闭原则之间有什么区别。
我的理解是,ISP 必须使一切都依赖于接口和类上的 OCP,我看到它们都可以以相同的方式实现,但一种是接口,另一种是类。
我不明白接口隔离原则和开放/封闭原则之间有什么区别。
我的理解是,ISP 必须使一切都依赖于接口和类上的 OCP,我看到它们都可以以相同的方式实现,但一种是接口,另一种是类。
Programming to interfaces
告诉我们代码应该依赖接口,同时ISP
指导我们不要创建具有大量方法的神接口。大接口会导致两个主要问题:
OCP
指导我们编写无需修改现有代码即可扩展的代码。因此,例如,假设您具有以下界面:
public interface ITask
{
void Execute();
}
然后创建SendToEmailTask
实现ITask
接口的类。假设一段时间后出现新要求,您需要将日志记录添加到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 原则并且你的类不允许扩展。