最近、シングルトンに対する何らかの革命がありましたが、それらがステートレスである場合、シングルトンに何か問題がありますか?
私は酷使の話とすべてを知っています...これはシングルトンだけでなくすべてに適用されます。
最近、シングルトンに対する何らかの革命がありましたが、それらがステートレスである場合、シングルトンに何か問題がありますか?
私は酷使の話とすべてを知っています...これはシングルトンだけでなくすべてに適用されます。
回答:
> Are immutable/stateless singletons bad?
詳細については、-onion-architectureを参照してください
シングルトンを使用しない他の理由はわかりません。
それは常に使用法に依存します。私はすべてのプログラマは、このパターンを学習することを、革命は事実から来ていると思いますオブジェクト指向のパターン。ほとんどの人は、それが理にかなっている場所とそうでない場所について考えることを忘れています。
もちろん、これはすべてのパターンに当てはまります。パターンを使用するだけでは、優れたコードや優れたソフトウェアを作成できません。
ステートレスシングルトンがある場合、静的メソッドのみを提供するクラスを使用する(または静的クラスを使用する)のはなぜですか?
ここでは、一般的なグローバル変数とシングルトンに関する投稿があります。
私は著者ほど厳しくはありませんが、シングルトンが必要だと思われるほとんどの場合、それは本当に必要ないことを示しています。
静的なクラスができない不変のステートレスシングルトンができることは何もありません。
-> Instance()が作成する余分なレベルの複雑さを追加する理由はまったくありませんが、静的メソッドの単純な呼び出しはより明確で、リソースの面でより保守的で、おそらくより高速になります。
間違っているわけではありません。それを行うためのより良い方法があるということです。通常の(「ステートフル」)シングルトンが正しい方法であるシナリオがあります。シングルトンの悪さは、グローバル変数と同じ悪い結果でしばしば悪用されることですが、シングルトンの使用が単に正しい場合があります。ステートレスの場合にはそのようなケースはありません。
シングルトンの主な問題は、横断的関心事のシナリオで使用される場合、依存性と結合を特に隠蔽することです。詳細については、「シングルトンは病理学的嘘つきである」または「シングルトンが悪である理由」を参照してください。
反対側から、シングルトンの少ない状態は、乱用されていない場合に役立ち、パフォーマンスを改善します。例を考えてみましょう:
interface Interface
{
void Method();
}
class StatelessSingleton : Interface
{
public static readonly StatelessSingleton Instance = new StatelessSingleton();
private StatelessSingleton() { }
public void Method() { }
}
class User
{
public User(Interface i) { /* ... */ }
}
ここで、StatelessSingletonはInterfaceのデフォルト実装として機能し、Userコンストラクターに配置されます。ハードコーディングされたカップリングや非表示の依存関係はありません。基礎となるインターフェースのために静的クラスを使用することはできませんが、デフォルトのインスタンスを複数作成する理由はありません。そのため、ステートレスシングルトンが適切な選択のようです。
ただし、デフォルトの実装には別のパターンを使用する必要があります。
class Implementation : Interface
{
private readonly Action _method;
public Implementation()
{
_method = new Action(() => { /* default */ });
}
public Implementation(Action custom)
{
_method = custom;
}
public void Method()
{
_method();
}
}
StatelessSingletonに関してはパフォーマンスに影響しますが、インターフェイスの一般的な実装を構成します。IProgressインターフェイスでも同様のソリューションが使用されます。
繰り返しますが、なぜデフォルトの振る舞いの実装を複数作成できるのですか?ただし、次の2つを組み合わせることができます。
class Implementation : Interface
{
public readonly Implementation Default = new Implementation();
private readonly Action _method;
private Implementation()
{
_method = new Action(() => { /* default */ });
}
public Implementation(Action custom)
{
_method = custom;
}
public void Method()
{
_method();
}
}
結論として、シングルトンが役立つ場所(デフォルトとして示されている)があると思います。シングルトンの主な定義では、クラスの複数のインスタンスを作成することは許可されていません。それは原子力です。エネルギーまたは爆弾を生成できます。それは人間次第です。