ISP和OCP有啥区别?

Posted

技术标签:

【中文标题】ISP和OCP有啥区别?【英文标题】:What is the difference between the ISP and the OCP?ISP和OCP有什么区别? 【发布时间】:2015-09-07 13:32:04 【问题描述】:

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

我的理解是,ISP 必须让一切都依赖于接口,而 OCP 则依赖于类,我发现它们都可以以相同的方式实现,但一种是接口,另一种是类。

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

好的,假设我有课程类和帖子类,并且有两个接口的 IFetchable ,IUploadable ,课程类只实现了我 Fetchable 和 post 实现了两者,所以我创建了这个类来管理操作pastebin.com/nJx6C38g 我认为它可以基于 OCP 实现,因为使 fetch 类具有 fetch 方法,upload 类具有上传方法,并使类看起来像这样来管理操作pastebin.com/9FRX2XK1 抱歉,但这就是我所理解的:/

以上是关于ISP和OCP有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

单片机中ISP和SPI的区别是啥?

ISP与IAP的区别

ISP屏幕和LCD屏幕的区别,以及AMOLEDSuper AMOLED和OLED

RV1108芯片Camera模块CIF和ISP的区别

单片机ISPIAP和ICP几种烧录方式的区别

SOC小知识: IAP与ISP 功能的区别