5

私はかなり単純なゲームエンジンを持っています。いくつかのシングルトンを使用します (それらのいくつかを列挙します)。

Resource Manager
Render Engine
Events Manager
Factory
etc

これらのシングルトンには、互いに多くの呼び出しがあります。Events Manager の使用例を取り上げます。

  1. Listener から派生した任意のオブジェクトは、このようにいくつかのイベントのリスナーとして itsel を追加できますEventsManager->RegisterListener(this, &SomeClass::SomeMethod);(イベント タイプは SomeMethod パラメータによって推定されます)。
  2. 他のオブジェクトは、このようなイベントを発生させることができますEventsManager->PushEvent(SomeEvent);

いくつかの同期の後、イベントはすべてのリスナーに到達します。シングルトンの場合、これは EventsManager の非常に単純な使用法です。

同様の動作は、他のシングルトンにも当てはまります。シングルトンを削除したいのですが、私の主な問題は、現在のように「ユーザーの視点」からコードを使いやすくしたいということです。これを行うためのいくつかのテクニックを読みましたが、ほとんどの場合、クラスの初期化/使用がより複雑になります。このトピックが SO で何度も議論されたことは知っていますが、すべてをできるだけシンプルに保つという私のプログラミング哲学に適した答えはありません。

次のようなクラスの複雑な定義/初期化はしたくありません。

SomeClass<EventManager, RenderEngine,...>

また

SomeClass::SomeClass(EventsManager, RenderEngine...)

このトピックについてアドバイスをお願いできますか?

4

3 に答える 3

2

現在シングルトンである各クラスのインスタンスを作成するグローバルな「ゲーム」オブジェクトを持つことができます。

EventManagerの特定の例については; リスナー基本クラスは、派生クラスが呼び出すことができるレジスタメソッドとプッシュメソッドの実装を提供できます。

スケルトンの定義:

class Listener
{
public:
    virtual void ReceiveMessage( ... ) = 0;

protected:
    void Register()
    {
        GetEventManagerSomehow()->RegisterListener( this, etc );
    }

    void PushEvent( etc )
    {
        GetEventManagerSomehow()->PushEvent( etc );
    }

}
于 2012-11-29T15:37:21.977 に答える
1

シングルトンでリソース リークを検出するという特定の問題を解決するには、インスタンスを破棄するシャットダウン メソッドを各シングルトン クラスに与えます。

class Singleton
{
    // ...
    static Singleton * GetInstance()
    {
        if (instance == NULL)
            instance = new Singleton;
        return instance;
    }
    static void Shutdown()
    {
        delete instance;
        instance = NULL;
    }
    static Singleton * instance;
};

Singleton * Singleton::instance = NULL;
于 2012-11-29T15:42:49.113 に答える
0

本当の答えではありませんが、コメントするには長すぎるかもしれません。

依存性注入は、シングルトンの非常に優れた代替手段です。プログラムのメイン関数でインスタンスを作成し、それらを「モジュール」(メイン クラス) に渡すことで、それらをローカルで使用できるようにします。これは、これらのクラスに対して、不要な「複雑な」コンストラクターが含まれることを意味します。
ただし、複雑さは一部のクラスにのみ限定されるべきであり、いくつかの依存する「モジュール」を渡すことは、私の観点ではそれほど複雑ではありません。おまけとして、コンストラクターまたはメイン関数を見るだけで、モジュール間の依存関係を見つけることができます。

依存性注入は、非常に限られた複雑さを追加するだけで、見ている問題 (および単体テストなど) を解決するため、よく使用されます。

于 2012-11-29T15:53:51.590 に答える