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

时间:2011-03-24 20:16:59

标签: c++ design-patterns

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

Application diagram

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

class Registry {
public:
    static MainApp* application;
    static MainWindow* mainWindow;
};

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

3 个答案:

答案 0 :(得分:2)

这取决于您要引用ParamsPane的原因。我可以想到两个原因和两个不同的解决方案。

您希望更新ParamsPane中的数据,因为TabPane中的数据已更改。

如果此数据与视图完全分开,您应该做的就是将其分开。这意味着遵循Model-View-Controller模式。 ParamsPaneTabPane个实例都可以分别访问模型。所以两者之间没有直接的参考。

两者之间存在一些强大的联系,与数据无关。

如果前面提到的点不相关,并且两个面板之间存在非常强大的链接,您可以考虑编写一个特定的TabPane类,该类存储对ParamsPane类的引用。 / p>

我觉得这两种解决方案都优于Singleton或'Registry'方法。请注意我以前没有听说过这种模式,但我相信我理解它的意图。关于为什么全局状态对象(更具体地说是单身人士)是一种不良做法的更多信息can be found here

答案 1 :(得分:0)

在可测试性方面,使用注册表模式可能不是一个好主意。要从this article重新发布:

  

单元测试的前提是您正在测试没有依赖关系的小型离散代码单元。这要求开发人员尽其所能去除依赖关系或以这样的方式模拟它们,即依赖关系被中和为导致被测单元失败的因素。在PHP 5中,分配时不复制对象;相反,它们在哈希表中的地址被复制。这意味着,如果从注册表中检索对象,然后对其进行修改,则每次从注册表中检索都将反映该修改。

     

这会产生重大问题的原因是它会阻止您测试离散的代码单元。现在,有两个是测试失败中的变量,而不是一个:测试的代码单元和从注册表中检索的对象。任何时候失败的可能性都不止一次,单位测试的有效性就会降低。

答案 2 :(得分:0)

您的Registry类和Singleton是全局变量的OO方式。更喜欢在MainFrame中创建Params窗格并将其作为对tab-pane的引用传递。