如何设计遵循 SOLID 的类而不在其他地方加载违反 SOLID 的内容?

Posted

技术标签:

【中文标题】如何设计遵循 SOLID 的类而不在其他地方加载违反 SOLID 的内容?【英文标题】:How can I design classes that follow SOLID without off loading violations of SOLID somewhere else? 【发布时间】:2017-12-22 03:41:30 【问题描述】:

我的控制器违反了开闭原则。我试图弄清楚如何在某些条件下解决这个问题。这是实现。

struct BasicRecording

  void show() 
  void hide() 
;

struct AdvanceRecording

  void show() 
  void hide() 
;

class NotSolidRecordingSettingsController

  BasicRecording br;
  AdvanceRecording ar;
public:
  void swithToAR();
  void swithToBR();
;

void NotSolidRecordingSettingsController::swithToAR()

  br.hide();
  ar.show();
;

void NotSolidRecordingSettingsController::swithToBR()

  ar.hide();
  br.show();
;

这里的问题是,如果我有新的录制设置,我需要返回设置控制器并添加新的录制设置。如果我在 NotSolidRecordingSettingsController 中注入 BasicRecording 和 AdvanceRecording,那么实例化 NotSolidRecordingSettingsController 的对象将需要对 BasicRecording 和 AdvanceRecording 进行实例化。但随后该对象违反了 OCP。必须有人创建对象。

如何在不将 Not OCP 部分加载到其他东西的情况下将其设计为 OCP?

这类问题有特定的设计模式吗?

【问题讨论】:

在控制器类上使用公共方法的类是什么样子的? 【参考方案1】:

在 SOLID 原则中,OCP 实际上是 SRP 的结果——一个类应该有一个单一的职责,并且它的代码应该只在其内部需求——与它的一项工作相关的需求——发生变化时发生变化。

特别是,一个类不应该因为它的客户改变而改变。它可能有很多客户,并且您不想每次获得新客户或现有客户需要做不同的事情时都弄乱它的代码。因此OCP。请注意,在 OCP 中,“关闭以供修改”意味着您在更改使用它的东西时不会弄乱它。当它自己的内部需求发生变化时,您确实对其进行修改。这只是维护。

所以 OCP 是关于类如何与其客户相关的,但是,有些类有 没有个客户。它们的工作不是服务,它们不被其他类使用或实现API等。这些类不需要担心OCP,因为它们自然没有理由改变,除了改变它们的内部需求。

这种类的一个很好的例子是有时被称为“组合根”(可谷歌搜索)。它的唯一职责是定义如何从其组件构建系统。这是创建所有对象并将它们注入到需要它们的任何地方的人。

您需要一个组合根,将设置窗格注入控制器(以及触发它们的任何东西,因为您不能再有一个名为 switchToAR 的方法)。这个类的工作是通过创建所需的对象来定义系统。当对象的排列需要改变的时候,那就是改变了它的内部需求,你可以继续修改它的代码而不违反SOLID。

(或者您可以改为从配置中读取所有内容,但这只是在配置中实现组合根而不是您的编程语言。有时这是个好主意,有时不是)

【讨论】:

以上是关于如何设计遵循 SOLID 的类而不在其他地方加载违反 SOLID 的内容?的主要内容,如果未能解决你的问题,请参考以下文章

JAVA 设计模式遵循的六大基本准则

设计模式之SOLID原则

设计模式之SOLID原则

我可以更改表单小部件类而不在 Django 中明确重新定义它吗?

我需要更改哪些内容才能正确实施 SOLID 设计?

如何使用类而能够在晚上安然入睡