シングルトンが嫌われている理由を理解しようとしています。
シングルトン MyClass があるとしましょう:
class MyClass
{
public:
void doSomething();
static MyClass* getInstance();
private:
int whatever;
static MyClass* myClass;
MyClass();
};
それを参照するクラスがあります:
void A::B()
{
...
MyClass::getInstance()->doSomething();
}
私が読んだことは、クラス A が MyClass に依存するようになったことです。クラス A を効果的にテストすることは、同時に MyClass をテストすることを意味します。誰でもどこでも MyClass を同時に変更できるため、 A::B() の結果は予測できません。
しかし、なぜグローバルアクセシビリティがこの原因なのですか? 代わりに集計を使用するとどうなるでしょうか? クラス A が MyClass オブジェクトへのポインタまたは参照を持っていて、他のクラスも同じオブジェクトへのポインタまたは参照を持っているとしたら?
class A
{
public:
void B();
private:
MyClass* myClass;
};
void A::B()
{
...
myClass->doSomething();
}
他のクラスが同じ myClass オブジェクトを同時に変更しているため、 A::B() がそれに依存しているという同じ問題はありませんか? 問題は、複数の場所で同じものを参照するのは、ほとんど「グローバル状態」のようなものではないでしょうか?
(この質問が以前に投稿されたことは認識していますが、同じオブジェクトへの複数の参照がより優れている理由について、他の誰かが具体的に質問したとは思いません。)