2

私はビデオ ゲーム コース (残念ながら何も教えていません) のためにゲームを書いていますが、ゲーム エンティティと実際にゲームを実行するクラスとの間の相互作用を設計するのに問題があります。

私の問題はほとんどこれに帰着します: エンティティが位置を持っていると仮定すると、(ゲーム マネージャーがゲーム ステップを実行するのを待たなければならないのではなく) 直接変更することはできませんが、アクセスできるはずです。 AI チェックなどを実行します。

私の解決策は、とPosition友達であるクラスGameManagerを作成し、このようなエンティティクラスを作成することです

class Entity {
    public:
        Position & getPosition() { return pos_; }
    private:
        Position pos_;
};

そのため、マネージャーはエンティティの位置を変更できますが、他のクラスは観察することしかできません。ただし、この推論は他の多くのプロパティにも当てはまります。また、エンティティ クラスは実際には一連のサブクラスに派生し、そのサブクラスにはますます多くのプロパティが含まれているため、friendほぼすべての場所に属性を配置する必要があります。

この問題を解決するためのより良いアプローチは何でしょうか?

4

1 に答える 1

0

特定のクラスをフレンドとして識別し、特定のクラスを非フレンドとして識別するという考えは、多くの理由から良い考えではありません。これが意味することは、

このクラスがどのように使用されているかも、このクラスの関心事です。

しかし、これはまったく問題ではありません。このクラスは、検討中のクラスが何であれ、独自の責任を果たすように設計する必要があります。

さて、あなたのケースでは、まず、位置を変えるアクション/動作がどこに属するかを決定する必要があります。Entity、Entity Manager、または何か他のものに属していますか。たとえば、次の 2 つのケースのどちらがより理にかなっていますか。

  1. エンティティはその位置を x1 から x2 に変更します。
  2. Entity Manager は、Entity の位置を x1 から x2 に変更します。

この動作が実際にはエンティティ マネージャーではなく、エンティティに属していると判断したとします (ケース 1)。その場合、@bengoesboom のコメントで指摘されているように、クラスのユーザーがその位置を変更するために使用できるセッターを提供する必要があります。

このクラスが望ましくない方法で使用される可能性があると思われる場合は、このクラス内に制約とビジネス ルールを適用する必要があります。たとえば(単純な例です)、操作で特定の範囲の値のみを許可する場合。入力をチェックし、範囲外の場合は例外をスローします。

ルールと制約を適切に処理したら、このクラスを誰が使用するかは気にしなくなります。

于 2013-06-05T18:36:31.000 に答える