如何在不在其他地方卸载SOLID的情况下设计遵循SOLID的类?

时间:2017-12-22 03:41:31

标签: c++11 solid-principles open-closed-principle

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

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的Object将需要实例化BasicRecording和AdvanceRecording。但那个Object然后违反了OCP。有人必须创建对象。

如果不将Not OCP部分加载到其他东西上,我怎样才能将其设计为OCP?

这种问题是否有特定的设计模式?

1 个答案:

答案 0 :(得分:0)

在SOLID原则中,OCP实际上是SRP的结果 - 一个类应该只有一个责任,并且它的代码只应在其内部要求(与其一个作业相关的要求)发生变化时才会发生变化。 p>

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

所以OCP是关于类与客户的关系,但是,有些类具有 no 客户端。他们的工作不是服务,也不是其他类使用或实现API等。这些类不需要担心OCP,因为他们自然没有理由改变而不是改变他们的内部要求。

这样一个类的一个很好的例子就是有时被称为"组合根" (googlable)。它的唯一职责是定义系统如何​​从其组件构建。这就是创建所有对象并将它们注入到他们需要的任何地方的人。

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

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