0

私のモデルは実装されており、ビューに取り組んでいます。

コントローラの一部であるHelperという名前のクラスがあります。Helperクラスの目的は、モデルの「マスターコピー」を含めることです。他のクラスは、ヘルパーメソッドを呼び出して、モデルの独自のコピー(モデルの全体または特定の部分)を要求します。ヘルパーは、モデルに変更を加えることを許可する必要がある唯一のクラスでもあります。

私が取り組んでいるビューには、DrawingPanelというJPanelが含まれています。DrawingPanelのpaint()メソッドは、それ自体をペイントする前にHelperからモデルを取得するようにオーバーライドされます。

Helperクラスをシングルトンとして実装することがこれを達成するための最良の方法ですか、それとも私の目標を達成するためのより良い/より単純な/よりエレガントな方法がありますか?

シングルトンとしてのHelperの実装がスレッドセーフである必要があるかどうかも、事前に知っておく必要があると思います。GUIはSwingで設計されています。

4

5 に答える 5

5

大文字のS「シングルトン」が適切かどうかについては...これを自問してください...

2番目のインスタンスが私のプログラムの死を引き起こすことは確実ですか?

(私は「特定の」と「死」を意味します。「可能性が高い」だけでなく、どのインスタンスが「公式」のインスタンスであるかについての混乱だけではありません。プログラムがクラッシュしたり、崩壊したり、ワームホールを開いたり、あなたの犬など、完全に2番目のインスタンスが存在するため、答えは「はい」です。確信が持てない場合は、確かな証拠が得られるまで「いいえ」と想定してください。)

答えが「はい」の場合、シングルトンを使用するための有効なケースがある可能性があります。そうでない場合は、それを誤用しているので、より良い解決策 があります。2番目のインスタンスを作成しないでください。

シングルトンを使用する理由はいくつかあります。

  • 「オブジェクトをアプリ全体に渡さずに使用できるようにしたいと考えています。」何だと思う?あなたが持っているのは、栄光に満ちたグローバル変数です。そして、それがすべての世界に見えるように座っているよりも、あるクラスの腸に隠れているとき、それはさらに悪いことです。 グローバルを使用したい場合は、おかしなグローバルを使用してください。 ゲッターの後ろに隠して、人々が気付かないと思ってはいけません。

  • 「私はこれらのうちの1つだけが必要です。」上記を参照。 必要なのは1つだけですか?1つだけ作成します あなたが今それを必要としているかどうかにかかわらず、あなたはそこにちょうど1つになるように強制する正当な理由がありますか?将来、別のものが必要な場合はどうなりますか?別のクラスを作成するのに苦労しただけでなく、おそらく1つだけが存在できるようにクラスを構築しました。また、元に戻すための「設計」がたくさんあります。

  • 「言うことができるのは便利MySingleton.getInstance()です。」ええ、あなたがテストを気にし始めるまで。を参照してください。呼び出すたびにMySingleton.getInstance()、そのオブジェクトが存在できる唯一のタイプであるという仮定をもう1つ追加しました。単体テストをいじり始めた場合、テストはすべてその1つのインスタンスの動作、さらにはテストの実行順序に依存するため、ほとんど役に立ちません。グローバルでさえテスト容易性にとってそれほど悪くはありません、そしてそれはちょっとひどいです。(また、上記の「...アプリ全体に渡さずに」を参照してください。)

シングルトン問題の解決策は、一般的に依存性注入です。大きな言葉ですが、非常単純な前提です。フレームワーク以外のバージョンは、基本的に、「オブジェクトがその仕事をするために必要な外部のものですか?コンストラクターに渡します」です。これを単純化できるとされるDIコンテナライブラリ/パッケージがありますが、それはすべて、オブジェクトを動かして自分で何かを見つけるのではなく、オブジェクトに何を使用するかを指示することを意味します。したがって、1つのインスタンスをそれを必要とするオブジェクトに渡すと、何も言う必要はありません。あるいは、そのオブジェクトがシングルトンであるかどうかMySingleton.さえ気にする必要はありません。

于 2012-08-10T22:33:37.633 に答える
3

クラスのインスタンスを 1 つだけ持ちたい場合はHelper、シングルトンがそれを強制する方法です。ヘルパー クラスに非グローバル状態が含まれている場合、シングルトンはおそらく適切ではありません。単一のマスター モデルを共有するヘルパーの複数のインスタンスを持つこともできます。

ただし、コードがすぐにいっぱいになる可能性があるため、シングルトンには注意してください。

MySingleton.getInstance()

これをテスト用にモックすることも困難です ( http://jeffastorey.blogspot.com/2009/08/spring-managed-singletons-for.htmlを参照)。依存性注入フレームワークを使用している場合は、関連するクラスにシングルトンを注入することをお勧めします (または、レジストリ パターンhttp://martinfowler.com/eaaCatalog/registry.htmlのようなものを使用してシングルトン オブジェクトを検索し、引き続きモックできるようにします)。テスト用です)。

ここでの私の答えは単なるガイダンスです。本当の答えは、多くのソフトウェアに関する質問が「場合による」というものです。

于 2012-08-10T20:55:45.940 に答える
1

はい、シングルトンにしたいようです。また、複数のスレッドを使用している場合は、スレッドセーフにする必要があります。もう1つ、名前を変更してください。「ヘルパー」はクラスの恐ろしい名前です。それが何をするかに名前を付けます。

于 2012-08-10T20:57:04.993 に答える
0

いいえ、「サービスへのグローバルアクセス」を提供するシングルトンの使用は避けるべきです。

以下のリンクと例外を参照してください。

http://blogs.msdn.com/b/scottdensmore/archive/2004/05/25/140827.aspx

最終的には、設計の依存関係がコード内に隠され、クラスやメソッドのインターフェースを調べても見えないということになります。

于 2012-08-10T20:57:00.000 に答える
-1

Helper クラスをシングルトンとして実装するのがこれを達成するための最良の方法ですか、それとも私の目標を達成するためのより良い/単純な/よりエレガントな方法はありますか?

あなたの意図がHelperすべてのアプリで単一のものを使用することである場合は、はいシングルトンが適しています。

また、Helper をシングルトンとして実装する場合、スレッド セーフにする必要があるかどうかも事前に知っておく必要があると思います。

複数のスレッドからアクセスされる場合は、スレッドセーフである必要があります

于 2012-08-10T20:55:22.260 に答える