Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop ISP和OCP之间有什么区别?_Oop_Solid Principles_Design Principles_Open Closed Principle_Interface Segregation Principle - Fatal编程技术网

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方法,并使类看起来像这样来管理操作抱歉,但这是我所理解的:/