保持实施同步的模式

Pattern to keep implementation synchronized

本文关键字:同步 模式 施同步      更新时间:2023-10-16

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

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

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

当我目前与该项目中的多个人合作时,有人有可能通过将来的更改来破坏该代码的这一部分。是否有一个设计模式可以使缓存和模型同步的散列模式保持明显的,您必须确保您必须确保更改无效的两个部分(缓存和模型(。

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

我认为您需要封装缓存行为。这可以通过使用构图(遗传上的构图提供自然数据结构和方便使用(来实现。这样,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,因此这些更改将反映出整个应用程序中的所有实现。您的团队成员将自动使用修改版本。只要您不将新的(摘要(成员介绍到基础类中,而仅修改基本行为,则修改不会破坏更改。