我有一个违反开放和封闭原则的控制器。我试图弄清楚如何在某些条件下解决这个问题。这是实施。
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?
这种问题是否有特定的设计模式?
答案 0 :(得分:0)
在SOLID原则中,OCP实际上是SRP的结果 - 一个类应该只有一个责任,并且它的代码只应在其内部要求(与其一个作业相关的要求)发生变化时才会发生变化。 p>
特别是,一个班级不应该因为客户的变化而改变。它可能有很多客户端,并且每次获得新客户端或现有客户端需要执行不同的操作时,您都不想弄乱其代码。因此OCP。请注意,在OCP中,"关闭以进行修改"意味着当你改变使用它的东西时你不会弄乱它。当自己的内部需求发生变化时, 进行修改。这只是维护。
所以OCP是关于类与客户的关系,但是,有些类具有 no 客户端。他们的工作不是服务,也不是其他类使用或实现API等。这些类不需要担心OCP,因为他们自然没有理由改变而不是改变他们的内部要求。
这样一个类的一个很好的例子就是有时被称为"组合根" (googlable)。它的唯一职责是定义系统如何从其组件构建。这就是创建所有对象并将它们注入到他们需要的任何地方的人。
你需要一个组合根,它将设置窗格注入控制器(以及触发它们的任何东西,因为你不能再使用一个名为switchToAR的方法)。这堂课'工作是通过创建所需对象来定义系统。当对象的排列需要改变时,那就是对其内部要求的改变,你可以继续修改它的代码而不违反SOLID。
(或者您可以从配置中读取所有内容,但这只是在配置中实现组合根而不是您的编程语言。有时这是一个好主意,有时不是)