C ++中的数据持久性 - 建议更好的方法

时间:2011-02-14 16:55:10

标签: c++ design-patterns class-design

我们正在开发一种复制工具,它可以定期将不同的文件夹从客户端计算机复制到服务器计算机。

当必须复制特定文件夹时,在客户端创建(通过我们的服务模块)复制对象,该对象通过网络将文件夹中存在的文件的内容发送到服务器。在服务器上,创建相应的接收对象(由我们的服务模块),接收文件。

果壳:

客户端抽象 - 复制对象(在自己的线程中运行),其职责是发送文件。 服务器端抽象 - 接收对象(在自己的线程中运行),责任是接收内容并创建/更新文件。

现在我们需要一些额外的要求,我们需要某些计数器,例如发送的总字节数,接收的总字节数,最后一次复制时间,......对于每个复制的文件夹。只要我们的服务正在运行,这些计数器就需要保持不变(不需要在我们的服务/机器重新启动时保持这种状态)。

为了纳入这些变化,我们正在讨论两种方法。

请注意 - 需要跨复制周期维护计数器。

Approach1 :对象重用

使计数器成为复制的一部分,接收对象并使接收和复制对象保持活动状态,只要服务处于活动状态即可。 现在,对于该主题,可以采取以下任何一种方法。

  1. 保持对象和线程处于活动状态(线程进入休眠状态)。现在,在下一个复制周期中,重用对象和线程(唤醒线程)。

  2. 允许线程退出,持久保存复制的接收对象。现在在下一个复制周期中;复制,接收对象重新创建一个线程或从线程池中获取一个线程。

  3. Approach2 :封装

    将计数器封装在单独的类中。现在每当实例化接收/复制对象以复制文件夹时。

    1. 传递反击物体,corr。将文件夹作为Receiving / Replicating对象构造函数的参数。
    2. OR

      1. 接收/复制对象要求Manager将计数器对象corr发送到该文件夹​​。
      2. 在approach1&方法2更好,为什么?

1 个答案:

答案 0 :(得分:0)

我会选择第二种方法。考虑一次复制多个文件的情况。您当前的设计已经支持此功能,只是使用其复制对象生成另一个线程。

如果你选择第二个路径,你仍然可以让计数器对象保留在主线程中,从工作线程接收信号以更新计数器。但是,第一种方法不支持这种情况。

另一种情况:计数的实时视图。如果你有一个gui或任何提供当前数据速率等的东西,它不应该在工作线程中运行。无论如何,你必须向gui线程发出信号。在那个地方完成计数已经很方便。

总结一下:对我而言,在你的情况下,第二种方法似乎是更灵活的方法。它也是对当前设计引入较少更改的那个(您仍然可以丢弃对象并保持每个复制都有自己的对象范例)。