ISP和OCP有什么区别?

时间:2015-09-07 13:32:05

标签: oop solid-principles design-principles open-closed-principle interface-segregation-principle

我不明白界面隔离原则与开放/封闭原则之间的区别。

我的理解是ISP必须使所有东西都依赖于接口和类上的OCP,我发现它们都可以用相同的方式实现,但是一个有接口,一个有类。

2 个答案:

答案 0 :(得分:3)

Programming to interfaces告诉我们我们的代码应该依赖于接口,而ISP则指导我们不要创建具有大量方法的神接口。大型接口会导致两个主要问题:

  • 使用该接口的客户端依赖于他们不使用的方法
  • 该接口的新实现必须实现每个方法,如果接口很大,并不总是清楚如何正确实现该接口

OCP指导我们编写可以在不修改现有代码的情况下扩展的代码。因此,例如,假设您有以下界面:

public interface ITask
{
    void Execute();
} 

然后创建实现SendToEmailTask接口的ITask类。 假设在一段时间后出现新要求,您需要将记录添加到SendToEmailTask。根据{{​​1}},您不应修改现有代码,而应添加同时实现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(); } } 原则。

答案 1 :(得分:0)

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

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

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