c - 查询结构的多维映射的设计,该结构的数据在 C 中的某些源代码文件中隐藏

标签 c arrays map structure private

我正在开发一个 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/

相关文章:

java - ConcurrentModificationException 在 Java 中递归使用 Maps

Go 中的结构映射与结构数组

c - 从文本文件C中读取

arrays - 字典追加的 Swift 数组

c - 在 C 中定义 "between"宏的最佳方式

Android动态数组ListPreference

c - 在c中初始化指针数组

java - 按原始顺序打印结果

c - x86汇编代码混淆

c - 在结构中使用 gettext 时初始值设定项无效