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

问题描述 投票:0回答:1

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

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。有人必须创建对象。

如何将此设计为OCP而不仅仅将Not OCP部分加载到其他东西?

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

c++11 solid-principles open-closed-principle
1个回答
0
投票

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

特别是,一个类不应该改变,因为它的客户端会发生变化。它可能有很多客户端,并且您不希望每次获得新客户端或现有客户端需要执行不同的操作时都会弄乱其代码。因此OCP。请注意,在OCP中,“关闭以进行修改”意味着当您更改使用它的内容时,您不会弄乱它。当内部需求发生变化时,您可以对其进行修改。那只是维护。

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.