为什么此页面上接口隔离原则的“励志海报”会说“你想让我把它插在哪里?”
接口隔离原则说
不应强迫客户依赖他们不使用的接口。
我不确定图像和标语如何与这一原则联系起来。这似乎更像是一个座右铭——尽管含糊不清——对于依赖倒置原则,高级对象不应该依赖于低级实现(插件不需要知道被插入设备的细节)
我知道这些说法是在开玩笑,但考虑到其他说法对原则的说明多么可爱,我不想误解 ISP 的这张特殊海报。
如果重要的流程 A 引用了不那么重要的流程 B,那么您现在已经使流程 A 依赖于流程 B,即使流程 A 并不真正需要流程 B 做任何事情。
“客户不应该被迫依赖他们不使用的接口”应该阅读——客户、类、模块、系统,人们不应该知道、引用、依赖于其他不需要满足其功能的东西要求。
因此,假设您有一个高级重要的东西,例如用于发射一些核武器的开关/按钮。如果您将咖啡机插入其中,那么您就有可能炸毁所有东西,因为您使重要的导弹发射器取决于您的咖啡机是否正常工作。
这是一个现实生活中的例子:
Web 客户端与 Web 服务器通信。Web 服务器与数据库通信。
如果 Web 客户端能够直接访问数据库,那么如果客户端失控并每秒发送 1000 个请求会发生什么?
在这种情况下,Web 服务器通过调解客户端和数据库之间的通信来充当接口。客户端和数据库都依赖于并了解 Web 服务器,但彼此不了解。因为客户端不知道(没有插入)数据库,所以数据库不能被客户端搞砸。为什么数据库要依赖于客户端?它自己工作得很好。
在海报中,那个按钮看起来很重要。因此,作为 SOLID 程序员,当有人要求您将咖啡机或任何不需要的东西插入导弹发射器时,您需要说“不”。
海报似乎暗示胖接口更难理解和使用,这是事实,但不是接口隔离的重点。
ISP 关注管理应用程序中的耦合和内聚的一个方面。小型、有凝聚力的 API 通过只为一个客户端提供服务来避免将不同的客户端相互耦合。在这方面,接口隔离与单一职责重叠,所以我发现关于单一职责失败的巨大瑞士军刀海报在描述接口隔离失败时同样有意义。
与一些他们不需要的工具耦合的用户无论如何都要为这些工具付出代价,尤其是那些不必要的工具对整体设计的影响。有用的工具必须容纳无用的工具,而这种容纳会影响用户体验。
在软件方面,这可以像 API 中的无用部分一样简单,它会引入用户不需要的第三方库。
有关更多背景信息,请参阅标签信息。