Open-Closed SOLID 原则是否与接口编码相同?

Is the Open-Closed SOLID principle the same as Coding to an Interface?

open-for-extension 和 closed-for-modification 是否意味着代码到接口?

如果我对一个接口进行编码,以便可以通过实现该接口来引入未来的具体实现,并且我们在不触及现有逻辑的情况下创建新的 类,它是否实现了我们尝试使用对扩展开放和对修改关闭 SOLID 原则?

我会说代码到接口解决了开闭原则 (OCP) 但还有其他方法来代码到接口。

代码到接口也可能意味着编码到抽象-class,如 InputStream。

另外,使用 CDI 可以允许 bean 为修改而关闭,为扩展而打开。

这意味着您不能使用接口,但可以使用 OCP。

If I code to an interface (...) does it achieve (...) SOLID principle?

是的,您遵循 SOLID 原则。但是接口的实现者可能不会。

通常接口分为方法签名和javadoc。方法签名指定您在技术上可以做什么,javadoc 应该指定实现应该做什么。两种方式,签名和文档都是铁的事实,违反签名或 javadoc 的实现大多应该报告为错误。

因此,您既可以使用现有界面来满足常见需求,也可以使用新界面来满足特定需求。如果您创建一个新界面,您可能会考虑界面隔离原则,它也是 SOLID 原则集合的一部分。

如果你设计这个接口,你必须对实现者的要求开放。例如,如果界面是这样的:

Date readDate(InputStream in);

实施者可能会提出一些您永远无法预见的要求:

  1. 您应该在流关闭的情况下添加 IOException。
  2. 您应该添加一个字符集参数,因为字符集是 ASCII,这意味着位长是 7 位,而不是 8 位。
  3. 您应该添加一个时区,因为 Date 使用服务器的时区来处理来自不同时区的流源。
  4. 您应该添加区域设置,因为 year/month/day 格式(英国)在不同的区域设置中可能是年月日格式(德国)。

这些要求可能会在您编码到界面后出现。我会说对接口的那些要求迫使你修改你的代码到一个关闭的接口。你可以说,是的,这是一个违反封闭修改的修改。但是 none 这些“接口要求”确实需要修改代码到接口的行为。