我正在开发一个 2D 瓦片地图游戏,其中瓦片由“对象”源代码文件中的结构表示。我想通过使用地图的多维数组在单独的源代码文件中表示世界地图。
然而,为了隐藏对象的实现细节,最好让地图源代码对对象结构的细节一无所知(除了请求大小),并调用对象源代码文件中的特定函数来做任何内部对象处理。
与使地图源代码包含对象结构或直接从地图代码中操作对象相比,这是一种更好的方法吗?
您认为 C 中处理这种设计的最佳方式是什么,以及为了更好的代码而将实现细节保密的问题?
谢谢你,理查德
通常,在 C 中封装代码的最佳方式是使用函数而不是直接访问数据结构。
例如,让我们考虑一个“人”数据结构。而不是在您的标题中公开它:
typedef struct {
int age;
int weight_lbs;
} person;
而是在您的公共标头中公开以下内容:
typedef void *person;
extern person person_create();
extern void person_destroy(person p);
extern int person_get_age(person p);
extern void person_set_age(person p, int age);
extern int person_get_weight(person p);
extern void person_set_weight(person p, int weight_lbs);
然后在您的 .c 或私有标头中定义实际的 person 结构。person_create() 和 person_destroy() 很重要,因为您必须提供一种方法来创建一个人,因为底层结构是隐藏的。
这提供了以下好处:
主要缺点是它更冗长并且性能损失最小。如果您有更复杂的内存管理问题(想要使用块池等),这也可能会更加困难,但仍然可以完成。