Oop ISP和OCP之间有什么区别?
我不明白接口隔离原则和打开/关闭原则之间有什么区别Oop ISP和OCP之间有什么区别?,oop,solid-principles,design-principles,open-closed-principle,interface-segregation-principle,Oop,Solid Principles,Design Principles,Open Closed Principle,Interface Segregation Principle,我不明白接口隔离原则和打开/关闭原则之间有什么区别 我所理解的是,ISP必须使一切都依赖于接口,OCP依赖于类,我认为这两种方法都可以以相同的方式实现,但一种是使用接口,另一种是使用类。让我们从单元测试开发的角度来看看原则 如果你为一个接口/类编写了大量的单元测试,就好像你违反了ISP原则。接口太大了 如果您想在测试接口/类时重写某些方法,但由于该方法不是虚拟的,所以无法重写,这就好像您违反了OCP原则,并且您的类不允许扩展一样。让我们从单元测试开发的角度来看看这些原则 如果你为一个接口/类编写
我所理解的是,ISP必须使一切都依赖于接口,OCP依赖于类,我认为这两种方法都可以以相同的方式实现,但一种是使用接口,另一种是使用类。让我们从单元测试开发的角度来看看原则 如果你为一个接口/类编写了大量的单元测试,就好像你违反了ISP原则。接口太大了
如果您想在测试接口/类时重写某些方法,但由于该方法不是虚拟的,所以无法重写,这就好像您违反了OCP原则,并且您的类不允许扩展一样。让我们从单元测试开发的角度来看看这些原则 如果你为一个接口/类编写了大量的单元测试,就好像你违反了ISP原则。接口太大了
如果您想在测试接口/类时重写某些方法,但由于该方法不是虚拟的,所以无法重写,这就像您违反了OCP原则,您的类不允许扩展一样。
编程到接口
告诉我们,我们的代码应该依赖于接口,而ISP
指导我们不要创建有大量方法的god接口。大型接口会导致两个主要问题:
- 使用该接口的客户端依赖于它们不使用的方法
- 该接口的新实现必须实现每个方法,如果接口很大,则并不总是清楚如何正确实现该接口
OCP
指导我们编写无需修改现有代码即可扩展的代码。例如,假设您有以下接口:
公共接口ITask
{
void Execute();
}
然后创建实现ITask
接口的SendToEmailTask
类。
假设一段时间后出现新的需求,您需要将日志添加到SendToEmailTask
。根据OCP
的规定,您不应该修改现有代码,而应该添加新的LoggingTask
,该任务还实现了ITask
接口(使用Decorator
模式):
公共类日志任务:ITask
{
私有只读ITask任务;
公共日志任务(ITask任务)
{
//保护条款
this.task=任务;
}
public void Execute()
{
Logger.Log(“任务…”);
this.task.Execute();
}
}
正因为如此,您还实现了单一责任原则。
接口编程
告诉我们,我们的代码应该依赖于接口,而ISP
指导我们不要创建有大量方法的上帝接口。大型接口会导致两个主要问题:
- 使用该接口的客户端依赖于它们不使用的方法
- 该接口的新实现必须实现每个方法,如果接口很大,则并不总是清楚如何正确实现该接口
OCP
指导我们编写无需修改现有代码即可扩展的代码。例如,假设您有以下接口:
公共接口ITask
{
void Execute();
}
然后创建实现ITask
接口的SendToEmailTask
类。
假设一段时间后出现新的需求,您需要将日志添加到SendToEmailTask
。根据OCP
的规定,您不应该修改现有代码,而应该添加新的LoggingTask
,该任务还实现了ITask
接口(使用Decorator
模式):
公共类日志任务:ITask
{
私有只读ITask任务;
公共日志任务(ITask任务)
{
//保护条款
this.task=任务;
}
public void Execute()
{
Logger.Log(“任务…”);
this.task.Execute();
}
}
由于这一点,您还实现了
单一责任
原则。好吧,假设我有课程课和博士后课,有两个接口,分别是IFetchable和IUploadable,课程类只实现我的Fetchable和post都实现了,所以我创建了这个类来管理操作,我认为它可以基于OCP实现,因为使fetch类有fetch方法,upload类有upload方法,并使类看起来像这样来管理操作对不起,但这是我所理解的:/ok,假设我有课程类和博士后类有两个接口,IFetchable和IUploadable,课程类仅实现我的Fetchable和post都实现了,所以我创建了这个类来管理操作,我认为它可以基于OCP实现,因为使fetch类具有fetch方法,upload类具有upload方法,并使类看起来像这样来管理操作抱歉,但这是我所理解的:/