问题标签 [interface-segregation-principle]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2737 浏览

python - 接口隔离原则可以应用于 Python 对象吗?

为了将SOLID原则应用于有机增长且需要重构的 Python 项目,我试图了解接口隔离原则如何应用于Python语言,当接口不存在时语言功能?

0 投票
2 回答
63 浏览

oop - 接口隔离原理及方便/辅助方法

接口隔离原则如何应用于便利/辅助方法?例如:

我想创建一个代表业务合作伙伴的界面。我需要的最低限度是一个 setter 和一个 getter 方法,它们可以设置或获取整个合作伙伴列表:

我还想要一个 contains() 方法来告诉我某个人是否包含在合作伙伴列表中。我认为这是一个帮助或便利方法,因为它所做的一切都是调用 getPartners() 然后检查给定的人是否在该列表中。

我对接口隔离原则的理解是我应该将我的 contains() 方法分离到一个单独的接口中,因为有人可能想要实现我的 Partners 接口而不为这个不必要的辅助方法提供实现。在我的示例中,这没什么大不了的,但是辅助方法的列表会很快变长(addPartner、addPartnerByID、addPartnerByUserid 等),所以这是一个实际问题。

我担心的是,我发现很难为一个接口选择一个名称来保存我的 contains() 方法,这听起来并不麻烦,而且我认为任何时候你在命名某些东西时遇到这么多麻烦,这是一个危险信号你的设计有问题。拥有一个名为 PartnersSupportingSetInclusionChecks 的接口似乎并不合适,拥有一个仅名为 PartnerHelperMethods 的接口似乎也不好。

如何将接口隔离原则应用于此类方法?

0 投票
1 回答
219 浏览

c# - 接口隔离原则 - 如何决定隔离什么?

我相信这个问题是不言自明的。我宁愿把更多的注意力放在例子上来支持问题。

很明显,它IEnumerable是分开的,只允许循环遍历集合。但我不明白他们为什么保持ICollectionIList分开?即使它们是一个,IList 也不会变胖,因为任何集合总是需要这种行为?

我遇到了这篇IEnumerable文章,它说如果客户端只需要循环项目,ICollection如果只需要只读访问等等,你的 API 就会返回。

MSFT 为何如此完美地应用 ISP,以至于这些年来从未引起任何问题?

应用 ISP 是基于客户端代码需求的持续过程还是一次性应用程序?如果 ISP 只应用一次,那么我的问题在于帖子标题本身。

0 投票
4 回答
760 浏览

java - Java 8 中的接口隔离原则和默认方法

根据接口隔离原则

不应强迫客户端实现接口的不需要的方法

...因此我们应该定义接口以进行逻辑分离。

但是defaultJava 8 中引入的方法提供了在 Java 接口中实现方法的灵活性。似乎 Java 8 提供了增强接口的可行性,使其具有一些与其核心逻辑无关的方法,但具有一些默认或空实现。

它不违反ISP吗?

0 投票
1 回答
601 浏览

java - 违反 ISP

我问了一个关于使用策略模式和 LSP 的问题,但答案参差不齐,从长远来看,这不是一个好主意。然而,我的问题底部的评论指出,虽然我没有违反 LSP,但我违反了接口隔离原则,该原则指出

客户端不应该被迫实现他们不使用的接口。代替一个胖接口,许多基于方法组的小接口是首选的,每个接口服务一个子模块。

假设我有一个这样的武器类:

接口与实现:

利用:

我有两种武器,它们的行为都不同,虽然都可以用来攻击,但每种武器都有不同的动作。例如,Sword不应该并且根据我的收藏逻辑,无论如何都不能调用或实现重新加载。

在我的文字冒险游戏中,如果您将“reload”传递给sword.standardAction("reload"),内部逻辑将检查 List 是否包含 reload 对象,如果有,则执行,如果没有,则武器不可用,因此不能,所以它忽略它。

我是否违反了 ISP?

我的剑永远不会实现reload,除非客户决定实现它,否则我不会强迫客户接受 aSword知道Reload他们永远不会使用的方法。

0 投票
3 回答
5444 浏览

interface - liskov替换原理和界面隔离原理的区别

Liskov替换原则(LSP)和接口隔离原则(ISP)之间有什么核心区别吗?最终,两者都保证设计具有通用功能的界面,并在您有特殊用途的功能时引入新界面。

0 投票
2 回答
129 浏览

solid-principles - 了解接口隔离原则的励志海报

为什么此页面上接口隔离原则的“励志海报”会说“你想让我把它插在哪里?”

在此处输入图像描述

接口隔离原则

不应强迫客户依赖他们不使用的接口。

我不确定图像和标语如何与这一原则联系起来。这似乎更像是一个座右铭——尽管含糊不清——对于依赖倒置原则,高级对象不应该依赖于低级实现(插件不需要知道被插入设备的细节)

我知道这些说法是在开玩笑,但考虑到其他说法对原则的说明多么可爱,我不想误解 ISP 的这张特殊海报。

0 投票
1 回答
212 浏览

c++ - 如何在 C++ 中使用智能指针实现接口隔离原则?

我来自 Delphi 和 C# 背景,所以我从他们的角度理解接口。我已经做 C++ 几年了,仍然从它的角度学习接口。

在我的应用程序中,我需要实现多个接口的类(即继承多个纯抽象类)来指示每个类支持的各种行为。这不完全是 ISP,但它足够接近,它是同样的问题。

行为接口不相互继承。没有等级制度。

Delphi 和 C# 做到这一点时不会喘不过气来,但我试图弄清楚这是如何在 C++ 中完成的。(另外,目前,我仅限于 C++11。)

我探索了 dynamic_pointer_cast、static_pointer_cast 但它们需要继承层次结构。

我查看了 reinterpret_pointer_cast,但它在 C++11 中不可用。

我尝试使用我的行为接口继承的根接口(类似于 COM 中的 IUnknown 或 Delphi 中的 IInterface),创建继承层次结构,但后来我遇到了菱形问题。

我已经看到了一些建议,将方法添加到基接口以返回对每个行为接口的引用,但这是我真的不想要的一种耦合,因为我可能需要添加其他实现它们的行为和类。

这是一些我尚未编译的代码,显示了我正在尝试做的一个简单示例。

我试图弄清楚 SOME_KIND_OF_CAST 占位符在 ProcessAllBehaviorA 方法中的位置。

我确信我不能成为第一个尝试这样做的人。

其他人如何使用 C++ 中的智能指针实现接口隔离原则(或类似我的模式)?

0 投票
2 回答
119 浏览

java - 如何有效控制实现多接口的类对象?

方法的目标:ClientProgram::deleteObject() 是删除目标对象。它会在删除对象之前显示对象的详细信息。

当具体类从抽象基类(如下#2,#3)或具有多方法的接口扩展时,这是可行的。

但是一旦所有的方法都被隔离到四个不同的接口中,如#4(应用了 ISP),您只能使用隔离接口中的任何一个来控制具体对象,并且不能同时调用 getInfo() 和 delete() .

使用像#4 这样的 ISPed 类创建像 deleteObject() 这样的方法的最佳/常见做法是什么?

0 投票
1 回答
473 浏览

java - Liskov 替换原则 VS 接口隔离原则

我在理解这两个原则时遇到了一些麻烦。这是一个有点长的阅读问题,所以请耐心等待。

假设我们有一个类

和界面

然后我们创建两个子类

现在我们将制作Shape工具SideCountable

并改变儿童班

并为此结构创建测试函数(遵循 LSP):

在这里我想停下来,因为实际上在下一步我被卡住了。如果我们要创建第三类Circle怎么办?

圆没有边,所以SideCountable为这个孩子执行听起来很荒谬。好的,我们只能将实现移动到四边形和三角形,但在这种情况下,LSP 将不再工作。有人可以描述我应该做的最好的方法吗?

  • SideCountableShape归0为Circle打破接口隔离原则?
  • 迁移SideCountableQuad打破TriangleLSP原理?