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

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

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

【问题讨论】:

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


    【解决方案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 抱歉,但这就是我所理解的:/
      猜你喜欢
      • 2010-10-02
      • 2011-12-12
      • 2010-09-16
      • 2012-03-14
      • 2012-02-06
      • 2011-02-25
      • 2011-11-22
      • 2015-03-26
      • 2013-08-19
      相关资源
      最近更新 更多