一度だけインスタンス化されるクラスを作成するのは悪いコーディングの実践/設計ですか?
私はいくつかの変数と関数をクラスの下でグループ化して「見栄え」を良くするために(より良い説明がないため)いくつかの変数と関数を持っていますが、それらは単にグローバル変数とグローバル関数にすることができます。
(ところで、私はJavaScript、AngularJS、Express、MongoDBを使用しています。)
一度だけインスタンス化されるクラスを作成するのは悪いコーディングの実践/設計ですか?
私はいくつかの変数と関数をクラスの下でグループ化して「見栄え」を良くするために(より良い説明がないため)いくつかの変数と関数を持っていますが、それらは単にグローバル変数とグローバル関数にすることができます。
(ところで、私はJavaScript、AngularJS、Express、MongoDBを使用しています。)
回答:
オブジェクトがイーサネット接続やオペレーティングシステムのタスクマネージャーなどの単一のリソースを表す場合、クラスの単一のインスタンスは意味があります。
関数は、そのクラスのインスタンスの変数に作用する場合にのみクラスに入れられます。そうでない場合、メンテナはそのクラスの意図について混乱します。
通常、アプリにグローバル変数があるのには十分な理由があります。それらの共通の目的を見つけて、この目的を中心にクラスを設計してください。それはデザインを明確にするだけでなく、あなたの心も明らかにします。
インスタンス化が1回だけ終了するクラスを作成しても問題はありません。
いくつかの変数と関数をクラス内にまとめることが理にかなっている場合、意味論的な価値がある場合、またはコードの読み取りと操作が簡単な場合は、メンテナに感謝します。
ただし、非常に間違っている可能性があるのは、内部から一意性を強制することです。
多くの人は、何かのインスタンスが1つだけ必要になると思ったらすぐにシングルトンパターンを起動する傾向があります。たとえば、コンテキストを詳細に説明していない方法を参照してください。それでも、ほとんどの回答はシングルトンを使用することをすでに提案しています。そして、何らかの理由である時点で別のインスタンスが必要になった場合、クラスは多くのコードを変更せずにインスタンスを実行できないため、設計が失敗する可能性があります。
結論として、1つのインスタンスで問題ありませんが、次のことを確認してください。
Dictionary<TKey,KTValue>
が区別されるとはどういう意味かを検討してください。インスタンスのすべてのインスタンスがDictionary<TKey,KTValue>
同じを使用するIEqualityComparer
場合、あいまいさはありませんが、それらが異なる同値関係を定義する異なるコンパレーターを使用できる場合、a.ContentsDistinctFrom(b)
常に等しいように慎重に定義することが可能であることを知りませんb.ContentsDistinctFrom(a)
。
一度だけインスタンス化されるクラスを作成するのは悪いコーディングの実践/設計ですか?
いいえ、インスタンス化が1回だけであっても、そのためのクラスが必要です。ただし、現在および将来、常に 1つのインスタンスのみが必要になるとは限りません。
ゲームを作成し、プレーヤークラスがあるとします。
class Player {
...
}
ゲームで1つのプレーヤークラスをインスタンス化し、常に同じオブジェクトを使用します。何も問題はありません。
ただし、シングルトンで作成しないでください。今日、あなたはあなたのゲームを設計し、「まあ、それは常に 1人用のゲームになるでしょう。私は私のプレーヤーにシングルトンを使用します」と考えています。しかし、バージョン2では、マルチプレイヤーを実装したい場合があります-そして、あなたはトラブルに巻き込まれています。デザインは複数のプレーヤーのインスタンス化をサポートしていないため、多くのコードを書き直して適応させる必要があります。
キャッシュについても同様です。またはロガー。またはネットワークインターフェース。今日、あなたは確かに必ず1つだけ必要だと思います。しかし、将来のバージョンでは、秒を追加する必要があります。この状況に注意してください。
シングルトンパターンは一般的です。クラスの単一インスタンスを強制することができます。
しかし、一部では一般的すぎるため、アンチパターンになります。これは、グローバルな状態と実質的に同じだからです。また、グローバルな状態は、モックやテストが困難であり、デバッグも困難です。ただし、同時に、コード内のすべての場所でこの1つのインスタンスを明示的に渡す必要があるため、コードが大きく膨らむ可能性があります。しかし、これは適切なアーキテクチャについて考えるようになります。多数のクラスがこの1つのシングルトンを使用している場合、それらが何らかの形で関連していて、それらの共通の祖先を作成すると、この1つのインスタンスがカプセル化されます。