目前,我的应用程序包含三种类型的类。它应该遵循面向数据的设计,如果不是,请纠正我。这是三种类型的类。代码示例并不那么重要,您可以根据需要跳过它们。他们只是在那里给人留下印象。我的问题是,我应该向我的类型类添加方法吗?
当前设计
类型只是保存值。
struct Person {
Person() : Walking(false), Jumping(false) {}
float Height, Mass;
bool Walking, Jumping;
};
每个模块实现一个独特的功能。他们可以访问所有类型,因为它们是全局存储的。
class Renderer : public Module {
public:
void Init() {
// init opengl and glew
// ...
}
void Update() {
// fetch all instances of one type
unordered_map<uint64_t, *Model> models = Entity->Get<Model>();
for (auto i : models) {
uint64_t id = i.first;
Model *model = i.second;
// fetch single instance by id
Transform *transform = Entity->Get<Transform>(id);
// transform model and draw
// ...
}
}
private:
float time;
};
管理Module
器是一种通过基类注入模块的助手。上面用到Entity
的是一个实体管理器的实例。其他管理器涵盖消息传递、文件访问、sql 存储等。简而言之,应该在模块之间共享的每个功能。
class ManagerEntity {
public:
uint64_t New() {
// generate and return new id
// ...
}
template <typename T>
void Add(uint64_t Id) {
// attach new property to given id
// ...
}
template <typename T>
T* Get(uint64_t Id) {
// return property attached to id
// ...
}
template <typename T>
std::unordered_map<uint64_t, T*> Get() {
// return unordered map of all instances of that type
// ...
}
};
有问题
现在你已经了解了我目前的设计。现在考虑一个类型需要更复杂的初始化的情况。例如,该Model
类型刚刚为其纹理和顶点缓冲区存储了 OpenGL id。实际数据必须先上传到显卡。
struct Model {
// vertex buffers
GLuint Positions, Normals, Texcoords, Elements;
// textures
GLuint Diffuse, Normal, Specular;
// further material properties
GLfloat Shininess;
};
目前,有一个Models
具有功能的模块Create()
,负责设置模型。但是这样,我只能从这个模块创建模型,而不能从其他模块创建。Model
我应该在复杂化的同时将其移至类型类吗?我之前认为类型定义只是一个接口。