【问题标题】:Is the Open-Closed SOLID principle the same as Coding to an Interface?Open-Closed SOLID 原则是否与对接口进行编码相同?
【发布时间】:2020-04-22 01:38:21
【问题描述】:

对扩展开放和对修改关闭是否意味着代码到接口?

如果我对接口进行编码,以便可以通过实现接口来引入未来的具体实现,并且我们在不触及现有逻辑的情况下创建新类,它是否实现了我们尝试使用 open-for-extension 和封闭修改SOLID原理?

【问题讨论】:

标签: interface solid-principles open-closed-principle dependency-inversion


【解决方案1】:

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

Code-to-an-interface 也可能意味着编码到像 InputStream 这样的抽象类。

CDI 的使用还可以允许 bean 对修改关闭和对扩展开放。

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

如果我对接口进行编码 (...) 是否实现了 (...) SOLID 原则?

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

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

因此,您既可以将现有接口用于常见需求,也可以将新接口用于特定需求。如果您创建一个新接口,您可能会考虑 interface-segregation-principle,它也是 SOLID-principle-collection 的一部分。

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

Date readDate(InputStream in);

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

  1. 您应该在流关闭的情况下添加 IOException。
  2. 您应该添加一个字符集参数,因为字符集是 ASCII,这意味着位长是 7 位,而不是 8 位。
  3. 您应该添加一个时区,因为 Date 使用来自不同时区的流源的服务器时区。
  4. 您应该添加语言环境,因为年/月/日格式 (UK) 在不同的语言环境中可能是年-月-日格式 (GER)。

这些要求可能会在您编码到接口之后出现。我会说对接口的这些要求会迫使您修改已关闭的代码到接口。你可以说,是的,这是一个违反封闭修改的修改。但是这些“接口要求”中没有一个真正需要修改代码到接口的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多