保持实施同步的模式

时间:2019-07-08 08:49:27

标签: c++ caching design-patterns synchronization

在我的3D绘图系统中,我有两个类:代表已通过第三方库导入的3D模型的模型类,以及代表要序列化为二进制缓存的模型数据的模型缓存类(其中也包含一些我需要的额外信息。

我当前正在解决的问题是缓存无效。鉴于在缓存文件之后修改了模型文件,我正在检查是否已从缓存中更改了网格或场景图(节点结构)。检查缓存数据是否有效的类为新导入的模型和缓存数据计算哈希。

问题是,如果由于某种原因,缓存数据无效化的实现发生了变化(即,如果我决定在哈希过程中包括一些额外的数据),那么这些变化也必须反映在模型哈希中。 / p>

由于我目前正在与这个项目中的多个人一起工作,所以有人将来可能会通过更改来破坏这部分代码。是否有一种设计模式可以使缓存和模型的哈希保持同步,或者使它变得显而易见,您必须确保更改无效部分(缓存和模型)。

所有这些的实现都是在C ++中实现的,这纯粹是一个理论问题,因为我觉得我之前已经遇到过几次。

1 个答案:

答案 0 :(得分:0)

我认为您需要封装缓存行为。这可以通过使用组合(通过继承进行组合以提供自然的数据结构和方便的使用)来实现。这样,ModelModelCache紧密耦合。您可以封装缓存操作,然后将其移至通用基类。这将强制所有子类型使用相同的缓存操作或缓存行为:

class 3dDrawingModelBase
{
  private:
    DrawingModelCache* modelCache;

  public:   
    3dDrawingModelBase(DrawingModelCache cache) : modelCache(cache) {}

    void invalidateCache() 
    {
      // Cache invalidation implementation
    }  

    BinaryDrawingModelCache serializeToBinaryCache() 
    {
      return this.modelCache.Serialize();
    } 

    size_t toHashCode() 
    {
      // hashing implementation
      // also uses this.modelCache.ToHashCode()
    }   

    list<mesh> getMeshes()
    {
      // return underlying meshes
    }


    void addMesh(Mesh mesh)
    {
      // return underlying meshes
    }
};

缓存抽象:

class DrawingModelCache
{
  public:   
    virtual void ToHashCode() = 0; 
    virtual BinaryDrawingModelCache Serialize() = 0;

    list<mesh> getMeshes()
    {
      // return underlying meshes
    }


    void addMesh(Mesh mesh)
    {
      // return underlying meshes
    }
};

现在只有一个地方需要进行修改。由于所有模型都必须实现3dDrawingModelBase,所以更改将反映到整个应用程序中的所有实现。您的团队成员将自动使用修改后的版本。只要您不向基类中引入新的(抽象的)成员,而仅修改基础行为,那么修改就不会破坏更改。