理解接口隔离原则的励志海报

Understanding the motivational poster for the Interface Segregation Principle

为什么this page上接口隔离原则的`"motivational poster"说"You want me to plug this in, where?"

接口隔离原则says

Clients should not be forced to depend upon interfaces that they don't use.

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

我知道这些话是开玩笑的,但考虑到另一个话是多么可爱 说说明原则,我不想误解这个特定的ISP海报。

如果重要的进程 A 引用了不太重要的进程 B,您现在已经使进程 A 依赖于进程 B,即使进程 A 并不真正需要进程 B 来做任何事情。

"Clients should not be forced to depend upon interfaces they don't use" 应该阅读 - 客户端,类,模块,系统,人们不应该知道,参考,依赖于不需要满足其功能需求的其他事物。

所以假设你有一个高级重要的东西,比如 switch/button 来发射一些核武器。如果你将咖啡机插入其中,那么你 运行 炸毁一切的可能性,因为你制造了重要的导弹发射器,这取决于你的咖啡机是否正常工作。

这是一个真实的例子:

Web 客户端与 Web 服务器通信。 Web 服务器与数据库通信。

如果 Web 客户端能够直接访问数据库,那么如果客户端失控并每秒发送 1000 个请求会怎样?

在这种情况下,Web 服务器通过调解客户端和数据库之间的通信充当接口。客户端和数据库都依赖于 Web 服务器,但彼此不了解。因为客户端不知道(没有插入)数据库,所以数据库不能被客户端搞砸。为什么数据库要依赖于客户端?它自己工作得很好。

在海报中,那个按钮看起来很重要。因此,作为 SOLID 程序员,当有人要求您将咖啡机或任何不需要的东西插入导弹发射器时,您需要说不。

张贴者似乎暗示胖接口更难理解和使用,这是事实,但这不是接口隔离的重点。

ISP 关注管理应用程序中的耦合和内聚的一个方面。小型、有凝聚力的 API 通过每个客户端仅服务一个客户端来避免将不同的客户端彼此耦合。在这方面,接口隔离与单一职责重叠,所以我发现 giant Swiss Army Knife 单一职责失败的海报在描述接口隔离失败时同样有意义。

与一些他们不需要的工具耦合的用户无论如何都会为这些工具付出代价,特别是在那些不必要的工具对整体设计的影响方面。有用的工具必须容纳无用的工具,而这种容纳会影响用户体验。

在软件方面,这可以像 API 拉入用户不需要的 third-party 库的无用部分一样简单。

查看 tag info 了解更多背景信息。