识别违反 SOLID 设计原则的行为

Identifying violations of the SOLID design principles

我正在尝试了解 SOLID 设计模式和设计原则。想象一下创建一个通知程序,其父 class 具有一个称为发送通知的方法。现在父 class 有子 class 用于不同的通知类型,如短信、电话和电子邮件。创建程序后,我想通过允许它组合多种通知类型来扩展其功能,因此我创建了一个名为 SMS+Email 的子 class 来处理与 SMS 和电子邮件相关的通知我还创建了另一个子class 处理结合电话和电子邮件的通知。

我知道一个好的设计策略是装饰器策略,而不是每次我想组合通知时都必须创建一个全新的子class我可以只创建一个包装器class 就是这样。

但我无法识别任何设计问题。每个 class 都有一个特定的功能,所以当我想添加一个新功能时,它不能是一个单一的责任原则我可以很容易地创建一个 subclass 这样我就不会修改代码只是扩展所以我不觉得它违反了开闭原则。想到的唯一原则是依赖倒置原则和接口隔离原则,但我不太确定。

我觉得它违反了设计原则,因为它可以使用设计策略来实现,但我不太确定。

并不是每个问题都是违反 SOLID 的,并且有可能在 SOLID 的范围内做得非常糟糕。特别是,很多软件设计都包括确定所有“单一职责”应该是什么。

记录每个 class 的用途并修复您不喜欢的。

当您已经拥有 SMS class 和 EMail class 时,为什么要单独维护一个“SMS+EMail”class?当你看到你应该担心你必须为每个可能的组合做一个 class,并且通过 配置 而不是编码来选择组合将很困难。

对于您的特定问题,听起来更好的解决方案是创建 CompositeNotifier class。它会有一个其他通知者的列表,并会向所有通知者分发通知。这是一个可靠的解决方案:

  • S:向多个目标分发通知
  • O:任何类型的目标通知器都可以添加到每个实例 after/during 构造中。
  • L:它遵守它实现的通知程序接口的约定
  • 我:我假设你的父通知程序接口不包含任何不相关的东西
  • D:它仅取决于目标的通知程序抽象。注入特定类型的目标。 (依赖倒置通常是实现 Open/Closed 原则的方法)。