3

我正在开发一个 2D 瓦片地图游戏,其中瓦片由“对象”源代码文件中的结构表示。我想通过使用地图的多维数组在单独的源代码文件中表示世界地图。

然而,为了隐藏对象的实现细节,最好让地图源代码对对象结构的细节一无所知(除了请求大小),并调用对象源代码文件中的特定函数来做任何内部对象处理。

与使地图源代码包含对象结构或直接从地图代码中操作对象相比,这是一种更好的方法吗?

您认为 C 中处理这种设计的最佳方式是什么,以及为了更好的代码而将实现细节保密的问题?

谢谢你,理查德

4

1 回答 1

1

通常,在 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() 很重要,因为您必须提供一种方法来创建一个人,因为底层结构是隐藏的。

这提供了以下好处:

  • 让您最大程度地控制客户如何访问您的数据
  • 允许您在不破坏二进制兼容性的情况下修改数据结构
  • 允许您对公开的函数使用符号版本控制

主要缺点是它更冗长并且性能损失最小。如果您有更复杂的内存管理问题(想要使用块池等),这也可能会更加困难,但仍然可以完成。

于 2012-11-27T01:59:11.357 回答