注册表模式:使用或不使用

ezp*_*sso 5 c++ design-patterns

我正在考虑在我的应用程序中使用注册表模式来存储应用程序的一些窗口和窗格的弱指针.该应用程序的一般结构如下所示.

应用图

该应用程序有一个MainFrame顶级窗口,其中包含很少的子窗格.可以有许多基于TabPane类型的选项卡.我需要从我的所有TabPane选项卡中引用ParamsPane面板,所以我需要一个指向ParamsPane对象的指针存储在某处.可以有很多选项,但最明显的选择是(1)将指针存储在Application单例对象中,或(2)创建一个简单的注册表类.就像是:

class Registry {
public:
    static MainApp* application;
    static MainWindow* mainWindow;
};
Run Code Online (Sandbox Code Playgroud)

这是一个好习惯吗?这种方法有哪些好处和注意事项?

Dav*_*ser 0

就可测试性而言,使用注册表模式可能不是一个好主意。从这篇文章转发:

单元测试的前提是您正在测试不具有依赖性的小型离散代码单元。这要求开发人员尽一切努力删除依赖项或以某种方式模拟它们,从而消除依赖项作为被测试单元失败的贡献者。在 PHP 5 中,对象在分配时不会被复制;相反,它们在哈希表中的地址被复制。这意味着,如果您从注册表中检索一个对象,然后修改它,则随后从注册表中检索的每个对象都将反映该修改。

这会产生一个重大问题,因为它会阻止您测试离散的代码单元。现在,测试失败中的变量不再是一件事,而是两件事:正在测试的代码单元和它从注册表中检索的对象。每当出现不止一种失败的可能性时,单元测试的有效性就会降低。