3

「オブジェクト」ソース コード ファイル内の構造によってタイルが表される 2D タイル マップ ゲームを開発しています。地図に多次元配列を使用して、別のソース doe コード ファイルで世界地図を表現したいと考えています。

ただし、オブジェクトの実装の詳細を非表示にするには、マップ ソース コードがオブジェクト構造の詳細について何も認識しないようにし (サイズの要求は別として)、オブジェクト ソース コード ファイル内の特定の関数を呼び出して内部処理を行うのが最善のようです。オブジェクト処理。

これは、マップのソース コードにオブジェクト構造を含めたり、マップ コードから直接オブジェクトを操作したりするよりも優れた方法ですか?

この設計に対処するための 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 に答える