4

ゲーム エンジンとゲームにかなり長い間使用してきたデザインについて疑問に思っていました。Object クラスがあるとしましょう

class Object
{
    public: 
        const std::string& getName() { return m_name; }

    private:
        std::string m_name;
}

次に、Object のインスタンスを保持する ObjectManager というクラスがあります。ここで、そのインスタンスを ObjectManager で非公開にし、コードを複製して getName() を呼び出せるようにするか、カプセル化の概念を無効にするオブジェクトを公開にするかを考えていました。皆さんはどちらのデザインが良いと思いますか?

助けてくれてありがとう!

4

4 に答える 4

1

クラスに他のユーザーが使用できるオブジェクトが含まれている場合は、それを公開します。カプセル化は、何かを行うために必要な変数を隠すことを目的としています。特定のデータ メンバーはこれに当てはまりません。

例:

人トム;

    tom.getEyes().getColor();
    tom.getMouth().eat(tomato);
    tom.legs().walk();

人はすべてを隠すことができますが、面倒です:

    tom.getEyesColor(); // accessor for every eye feature
    tom.eat(tomato);   
    tom.walkAndEat();   // every possible combination of actions

さらなる例:

    grid.row(3).col(5).setText("hello"); 

ここで、列クラスは、グリッド クラスに触れなくても多くのメソッドを公開できます。これがオブジェクト指向プログラミングの醍醐味です。

クラスに ObjectManager という名前を付けた場合、他のオブジェクトのインスタンスを管理しているように感じるので、それを公開する必要があります。継承を使用する別のアイデアも有効です。

    class ObjectManager : public Object
    {
    };
于 2013-08-03T01:15:29.717 に答える
0

それはあなたが何をしているかによります。私があなたの質問を正しく理解していれば、個人的には、オブジェクトを ObjectManager のプライベート メンバーにし、Object::getName() のプロキシとして機能する関数を ObjectManager に追加することにもっと傾倒します。(これはあなたの質問ですか?)しかし、あなたが特に薄くラップしているだけで、特に技術的なことやあなたが何をしようとしていないのであれば、私は別の答えをしたくなるかもしれません. それは場合によりますが、多くの場合、先に進んで非公開にし、余分な機能を追加してください。この回答は、ここで継承を多用するという前提に基づいていることに注意してください。

于 2013-08-03T00:56:30.490 に答える
0

状況によります(答えられなくてごめんなさい!)。強力なカプセル化をサポートしたい場合は、おそらく ObjectManager を次のようにする必要があります。

public class ObjectManager
{
    private:
        Object obj;
    public:
        string GetNameOfInnerObject();
}

ご覧のとおり、メソッド ヘッダーを ObjectManager に関して説明的なものに変更しました。このタイプのメソッド命名は、オブジェクト内のより複雑な相互作用を抽象化するのに役立ちます。

編集: ObjectManager が何をすべきかを教えていただけると助かります。内部オブジェクトに直接対応しないメソッドはありますか?

于 2013-08-03T01:00:25.017 に答える
0

インターフェイスをメソッドのみに制限したい場合は、オブジェクトをプライベートに保ち、プライベート オブジェクトへの const 参照 (および必要に応じて非 const) を返すアクセサー メソッドを使用します。

また、継承は、該当する場合に適したオプションです。

于 2013-08-03T00:44:12.213 に答える