我正在开发一个 2D 瓦片 map 游戏,其中瓦片由“对象”源代码文件中的结构表示。我想通过为 map 使用多维数组在单独的源 doe 代码文件中表示世界地图。
然而,要隐藏对象的实现细节,最好让 map 源代码对对象结构的细节一无所知(除了请求大小),并调用对象源代码文件中的特定函数来进行任何内部对象处理。
与使 map 源代码包含对象结构或直接从 map 代码中操作对象相比,这种方法是否更好?
您认为用 C 语言处理这种设计的最佳方式是什么,以及为了更好的代码而将实现细节保密的问题?
谢谢, 理查德
最佳答案
通常在 C 中封装代码的最佳方式是使用函数而不是直接访问数据结构。
例如,让我们考虑一个“人”数据结构。而不是在标题中公开它:
typedef struct {
int age;
int weight_lbs;
} person;
而是在您的公共(public) header 中公开以下内容:
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 或私有(private) header 中定义实际的 person 结构。 person_create() 和 person_destroy() 很重要,因为您现在必须提供一种方法来创建一个人,因为底层结构是隐藏的。
这提供了以下好处:
- 让您最大程度地控制客户如何访问您的数据
- 允许您在不破坏二进制兼容性的情况下修改数据结构
- 允许您对公开的函数使用符号版本控制
主要缺点是它比较冗长并且对性能的影响很小。如果您有更复杂的内存管理问题(想要使用 block 池等),它也可能会更加困难,但它仍然可以完成。
关于c - 查询结构的多维映射的设计,该结构的数据在 C 中的某些源代码文件中隐藏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13321482/