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有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章