0

私は C++/Java などのさまざまな言語を使用しており、現在は AS3 を使用しています。ほとんどのアプリケーションは、コンピューター ビジョンと小さな 2D コンピューター ゲームでした。私が働いたことのあるほとんどの企業は、AS3 のような言語でシングルトンを使用して、要素やクラスを簡単に取得しています。彼らの問題は基本的に、いくつかの変数を必要とするか、他のクラスから他の関数​​を呼び出すことです。AS3 のような言語では、プライベート コンストラクターは存在せず、新しいインスタンスを防ぐためにハッキーなコードを記述します。

Java と C++ では、他のクラスのメンバーを使用したり、異なるクラスでそれらの関数を呼び出したりする必要があるという状況にも直面しました。

問題は、シングルトンを使用せずに他のクラスが相互に対話できるようにするためのより良い設計または別の設計があるかということです。構成が答えだと思いますが、より詳細な解決策またはデザインの提案が必要です。

4

1 に答える 1

3

Singleton パターンは、2 つの問題を誤って混同しています (または、観察された使用のほとんどまたはすべてがそうであると言うべきでしょう)。

  • グローバル変数が必要です
  • プログラム内に存在する特定のクラスのインスタンスの数を 1 に制限する必要があります。

ミュータブルなグローバル状態は、プログラムの推論を困難にします。でも、時にはそれはあなたが望むものです。あなたはそれを行うことができますが、それを誇りに思ってはいけません。言語によっては、グローバル状態に依存するユニットをテスト目的で分離するために、いくつかのばかげたトリックを引き出す必要がある場合があります。

後者の制限を行う正当な理由はほとんどありません。クラスのインスタンスを 1 つだけ使用したい場合は、インスタンスを 1 つだけ作成してください。特別なクラスを作成して、クラスを 1 つだけ作成するように指示する必要はありません。

したがって、クラスのグローバルインスタンスが必要な場合は、シングルトンと同じように作成しますが、他のインスタンスが作成されるのを妨げようとしないでください。

クラスのすべてのインスタンスを同じように動作させたい場合は、「Borg パターン」を検討してください。インスタンスが独自の状態を持たず、代わりにすべてのインスタンスがグローバル状態で動作するクラスを作成します。

そのタイプに固有のオブジェクトが本当に必要であると判断した場合でも、グローバルにアクセスすることが適切かどうか、またはそれを使用するコンポーネントの注入された依存関係であるべきかどうかを適切に評価する必要があります。

私が考えることができる唯一の特別なケースについては、実装で特別なトリックを可能にするために、言語にとって特別な意味を持つ値の型が合法的にシングルトンである可能性があるということです。たとえばNone、Python では、型がNoneType. そのような場合はすべて、型は不変になると思います。

于 2013-10-21T09:51:26.783 に答える