在我的3D绘图系统中,我有两个类:代表已通过第三方库导入的3D模型的模型类,以及代表要序列化为二进制缓存的模型数据的模型缓存类(其中也包含一些我需要的额外信息。
我当前正在解决的问题是缓存无效。鉴于在缓存文件之后修改了模型文件,我正在检查是否已从缓存中更改了网格或场景图(节点结构)。检查缓存数据是否有效的类为新导入的模型和缓存数据计算哈希。
问题是,如果由于某种原因,缓存数据无效化的实现发生了变化(即,如果我决定在哈希过程中包括一些额外的数据),那么这些变化也必须反映在模型哈希中。 / p>
由于我目前正在与这个项目中的多个人一起工作,所以有人将来可能会通过更改来破坏这部分代码。是否有一种设计模式可以使缓存和模型的哈希保持同步,或者使它变得显而易见,您必须确保更改无效部分(缓存和模型)。
所有这些的实现都是在C ++中实现的,这纯粹是一个理论问题,因为我觉得我之前已经遇到过几次。
答案 0 :(得分:0)
我认为您需要封装缓存行为。这可以通过使用组合(通过继承进行组合以提供自然的数据结构和方便的使用)来实现。这样,Model
与ModelCache
紧密耦合。您可以封装缓存操作,然后将其移至通用基类。这将强制所有子类型使用相同的缓存操作或缓存行为:
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
,所以更改将反映到整个应用程序中的所有实现。您的团队成员将自动使用修改后的版本。只要您不向基类中引入新的(抽象的)成员,而仅修改基础行为,那么修改就不会破坏更改。