0

我不明白接口隔离原则和开放/封闭原则之间有什么区别。

我的理解是,ISP 必须使一切都依赖于接口和类上的 OCP,我看到它们都可以以相同的方式实现,但一种是接口,另一种是类。

4

2 回答 2

4

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原则。

于 2015-09-07T19:10:00.663 回答
0

让我们从单元测试开发的角度来看原理。

如果您为单个接口/类编写大量单元测试,就好像您违反了 ISP 原则。界面太大了。

如果你想在测试接口/类中重写一些方法,但是你不能这样做,因为这个方法不是虚拟的,这就像你违反了 OCP 原则并且你的类不允许扩展。

于 2015-09-07T13:45:41.593 回答