2

私が取り組んでいるwinformsアプリケーションでシングルトンパターンを使用することを検討していましたが、多くの人がシングルトンは悪だと思っているようです。シングルトンの「メインメニュー」フォームを作る予定でした。メインメニューの複数のインスタンスが必要になる理由は考えられません。常に最初に表示されるフォームになるため、不必要にインスタンス化された場合にリソースを浪費する心配はありません。

また、メインメニューのインスタンスが複数ある場合に問題が発生する可能性があります。たとえば、別のフォームに[メインメニュー]ボタンがあり、メインメニューのインスタンスが複数ある場合、どのインスタンスを表示するかの決定はあいまいに見えます。

また、プログラムの状態を調べてメインメニューのインスタンスが既に存在するかどうかを判断する必要がある別のWinFormがある場合、間違っているかもしれませんが、モジュール性を破っているような気がします。

この場合、シングルトンの使用を避けるべきですか、それともメインメニューを静的にする方が良いでしょうか?

数日前にc#を使い始めたばかりですが、ここ数年はOOPをあまり使用していません。そのため、これがばかげた質問である場合はお詫び申し上げます。

ありがとう

4

3 に答える 3

1

MainMenuいつも表示されていますか?そうでない場合は、閉じたときに古いインスタンスを解放し、開く必要があるたびに新しいインスタンスを作成するのが理にかなっています。このようにして、他のモジュールはそのインスタンスを知る必要がなく、開く必要があるときにインスタンスを作成するだけです。

于 2012-11-15T20:30:11.757 に答える
1

人々はグローバルな状態が好きです。それは明らかに理解しやすく、私たちにとって理にかなっています。すべて同じなので、使用しているバージョンを気にする必要はありません。

ただし、グローバルな状態ではあらゆる種類の奇妙なエラーが発生するため、一般的に推奨されません。C# では、グローバル ステートを使い逃しにくくするために、多くの設計上の決定が行われました。たとえば、静的変数は、それらを管理する必要があるクラスにのみ関連付けることができます。

シングルトンは、このグローバル状態を取得する別の方法ですが、問題を引き起こす可能性があるという点で似ています。画面の 1 つがメイン メニューの一部を設定し、そこに移行した場合、バックグラウンド プロセスが変更を元に戻したことに気付かず、奇妙なメイン メニューが表示された場合はどうなるでしょうか?

シングルトンに代わるもう 1 つの方法は、変数が必要な場所に確実に到達するようにすることです。これを行う 1 つの方法は、メニューのスタックを追跡することです。実際、Android は以下のように機能します。すべての UI は、その上にある親のセットを取得し、元に戻したい場合に切り替えることができます。最初の起動プロセスのみが最初のメイン メニュー画面を作成することを保証することで、1 つだけが作成されることを保証できますが、階層をチェックすることですべての画面にアクセスできます。

さらに、winform について話している場合は、この機能を提供するために使用できる階層システムが既に組み込まれています。

于 2012-11-15T20:28:29.240 に答える
0

あなたはほとんどすべてを乱用することができます。

シングルトンは、常にアクティブなオブジェクトのインスタンスが1つだけであることを保証する方法であり、オブジェクトへのアクセスを同期できます。静的クラスを使用すると、それを失うことになります。静的クラスにはいつでも誰でもアクセスできるため、同時実行の影響を受ける可能性のあることをメソッドが実行しないようにする必要があります。

それを超えて、私があなたを正しく読んでいるなら、あなたはあなたのメニューの唯一のインスタンスを持つ親フォームであるフォームを望みます、そして他のすべてのフォームはこれの子です。この場合は、WinformsでMDI(Multiple Document Interface)を確認する必要があります。これは、シナリオを適切にカバーするためです。

それ以外の場合、私が行うことは、親フォーム(メインメニューを持つクラス)のクラスを定義し、シングルトンにアクセスを公開させ、すべての子フォームに別の基本クラスを使用することです。

于 2012-11-15T20:28:58.607 に答える