2011-01-20 2 views
2

最近、私のプロジェクトのリファクタリングコードがあります。シングルトンオブジェクトがたくさんあることがわかりました。プロジェクト内のシングルトンオブジェクトを減らす

例えば、CPeriodTaskと呼ばれるクラスがあり、ScanPeriodTaskThreadProcというスレッド関数とタスクを保存するメンバ変数があり、CPeriodTaskはシングルトンオブジェクトです。

私のプロジェクトには多くのシングルトンオブジェクトがあり、シングルトンオブジェクトのいくつかは 他のシングルトンオブジェクトを参照しています。

今シングルトンの使用を減らし、シングルトンの参照を破棄したいと思います。 提案、ありがとうございます。

+1

あなたが変更しようとしていることをカバーする単位テストと受け入れテストがあることを確認してください。事実の後にこれらのものを掘り起こすことは、乱雑になる可能性があります。 –

答えて

1

シングルトンを減らす1つの方法は、いくつかのgod-classを作成することです。SingletonManagerは、他のシングルトンをすべてインスタンスメンバーとして含めることができます。つまり、プロジェクト内の既存のシングルトンのシングルトンの動作を削除し、これらのオブジェクトのいくつかが互いに依存関係にあると述べたので、このマネージャは正しい順序でこれらのオブジェクトを作成/破棄します。

メインの上部で、SingletonManagerを作成し、残りのコードがこれらの元シングルトンオブジェクトで取得できるようにこのオブジェクトへの参照を公開します。また、重要なのは、メインの一番下にあるマネージャーをシャットダウンします。マネージャーは、これらのオブジェクトを正しい順序で確定的に破棄します。これは、これらのオブジェクト間の相互依存関係と、スレッドを含む少なくとも1つのシングルトンについて述べたので重要です。

1

シングルトンはしばしば過度に使用されます。最初に、シングルトンがどれだけ本物であるかという点を見てみましょう。つまり、シングルトンのうちの1つだけを持つことが可能であるという意味で本物です。例えば、これらはデバイスに関連付けられている可能性があります。シングルトンは、インスタンスの数とオブジェクトへのナビゲーションという2つの問題を解決します。私。彼らは本当に単なるグローバルです。したがって、グローバルを削除するには、オブジェクトへのナビゲーションを許可するなど、新しいオブジェクトモデルがどのようなものになるかを把握する必要があります。シングルトンがたくさんある場合は、それらのうちの1つをオブジェクト階層のルートとして保持することで、残りの部分をオブジェクト階層から切り離すことができます。このように考えて、さまざまなオブジェクトの複数のインスタンスが必要な理由と、それらが常に関連しているかどうかを尋ねます。

And:将来的には、本当に価値のある場所を除くシングルトン/グローバルを避けてください。

1

単純な答えは、それらをシングルトンにしないことです。プログラムの存続期間がある場合は、メインプログラムで作成してください。誰かがそのオブジェクトで何かをする必要がある場合、明示的な依存関係にしてください。

は、ここでは、別のオプション

int main() 
{ 
    // Create something so my program can use periodic tasks 
    CPeriodTask* pMyPeriodicTasks = new CPeriodTask(); 

    // Object foo needs to do periodic tasks, lets pass this functionality in 
    CFoo* myProgramsFoo = new CFoo(pMyPeriodicTasks); 
} 

をCPeriodTaskために、例の共有リソースへのプロキシを公開し、舞台裏でリソースを処理:

class CMyPeriodicTask 
{ 
public: 
     // obtain resource 
     CMyPeriodicTask(/*function ptr*/); 

     // release resource 
     ~CMyPeriodicTask(); 
}; 

このコードの中で、どのようなシステムとのインタフェース定期的なタスクを開始するために必要なコード。その後CFooは、単にそれを使用しています。

class CFoo 
{ 
private: 
     CMyPeriodicTask periodicTask; 
... 
}; 

私は誰もが機能性と機能が頻繁に使用される後者のケースを必要とするとき前者を使用してお勧めしたいです。

関連する問題