interface - Open-Closed SOLID 原则是否与对接口进行编码相同?
问题描述
对扩展开放和对修改关闭是否意味着代码到接口?
如果我对接口进行编码,以便可以通过实现接口来引入未来的具体实现,并且我们在不触及现有逻辑的情况下创建新类,它是否实现了我们尝试使用开放式扩展和封闭式解决的相同目标-修改SOLID原理?
解决方案
我会说代码到接口解决了开闭原则(OCP),但还有其他方法可以将代码转换为接口。
Code-to-an-interface 也可能意味着编码到像 InputStream 这样的抽象类。
此外,CDI 的使用可以允许 bean 对修改关闭和对扩展开放。
这意味着您不能使用接口,但您可以使用 OCP。
如果我对接口(...)进行编码,它是否实现(...)SOLID 原则?
是的,您遵循 SOLID 原则。但是接口的实现者可能不会。
通常接口分为方法签名和javadoc。方法签名指定您在技术上可以做什么,而 javadoc 应该指定实现应该做什么。两种方式,签名和文档都是确凿的事实,违反签名或 javadoc 的实现大多应该报告为错误。
因此,您可以使用现有接口来满足常见需求,也可以使用新接口来满足特定需求。如果您创建一个新接口,您可能会考虑 interface-segregation-principle 也是 SOLID-principle-collection 的一部分。
如果你设计这个接口,你必须对实现者的要求保持开放。例如,如果界面是这样的:
Date readDate(InputStream in);
实施者可能会提出一些您无法预见的要求:
- 在流关闭的情况下,您应该添加 IOException。
- 您应该添加一个字符集参数,因为字符集是 ASCII,这意味着位长是 7 位,而不是 8 位。
- 您应该添加一个时区,因为 Date 使用来自不同时区的流源的服务器时区。
- 您应该添加语言环境,因为年/月/日格式(英国)在不同的语言环境中可能是年-月-日格式(GER)。
这些要求可能会在您编码到接口之后出现。我会说对接口的这些要求会迫使您修改已关闭的代码到接口。你可以说,是的,这是一个违反封闭修改的修改。但是这些“接口要求”中没有一个真正需要修改代码到接口的行为。
推荐阅读
- python - Edabit 任务未显示正确结果
- azure-devops - Azure DevOps 项目管道无法从不同项目中的工件源访问 NuGet 包
- linux - 如何知道 Libreoffice 安装在 Docker 映像中的什么位置?
- kerberos - linux docker容器中的Windows身份验证
- c# - 带有 xamarin 的免费地图(商业用途)
- sql-server - 将 id 从一个表复制到另一个
- c# - 触发器不适用于自定义控件图像按钮 wpf
- html - 为什么在这里使用(本地文件)chrome不播放音频?
- c# - WPF - 在异步任务的回调中更改 UI 文化
- ios - (Swift)即使没有文本,如何在 searchBar 上显示取消按钮?