2

私は OO Design の初心者で、Singleton デザイン パターンの使用について疑問に思っています。シングルトンが悪い理由についての記事をいくつか読みましたが、シングルトンが必要かどうかはまだわかりません。なるべく避けたいところです。

私の場合、C++ で API を介して制御および参照できる OceanOptics Spectrometers を使用しています。

分光計を管理するすべてのコード (検出、パラメーターの設定または取得、データの取得) を 1 つのクラスにまとめましたSpectrometerProxy

そして、このクラスがシングルトンであるかどうかを知りたいです。それを正当化できる理由がいくつかあると思います。

  • ハードウェアを管理します

  • 分光器の数に関係なく、このクラスを通じてすべて制御および参照されます

  • 正確な順序で 1 回だけ実行する必要がある特定の手順があります (分光計を開き、いくつかの変数をチェックし、プログラムが停止したときに分光計を閉じます)。

次に、このクラスをシングルトンにするよりも良い実装方法があるかどうかはわかりません。私が考えたもう1つの解決策は、それを通常のクラスとして保持し、コピーを防止し(コピーコンストラクターと代入演算子をプライベートに宣言することにより)、それを必要とするクラスへのポインターを渡すことでした:それは複数の作成を妨げませんSpectrometerProxy。それを避けたい。

また、すべてを静的にすることも考えましたが、クライアントコードに依存して正しい静的メンバー関数を正しい順序で呼び出すことになり (分光計への接続を正しく閉じることを忘れないでください)、エラーが発生しやすくなります。 RAII の原則に反します。

では、シングルトンはこの問題に対する適切な設計アプローチになるのでしょうか、それとも除外して他の方法を探すべきでしょうか?

4

3 に答える 3

4

それは主に宗教的なテーマです: シングルトーンを使うか使わないかです。ハードウェアを扱った私の経験 (10 年以上) によると、私はそれらを使用したくないと考えています。まず、マーフィーの法則によると、明日は複数の分光計を使用する必要があります。第二に、ハードウェアと対話し、それから継承し、実際にハードウェアを扱うコードを書くために必要なメソッドを備えた仮想抽象インターフェイスを作成することをお勧めします。この方法は、ハードウェアにアクセスできないがアプリをデバッグする必要がある場合に便利です。この場合、そのインターフェイスをサブクラス化し、エミュレート関数 (または、以前に記録されたファイルからハードウェアから取得したデータを含む実際のデータを読み取るより優れた関数) を作成するだけですが、プログラムの残りの部分は変更されません。

于 2013-05-13T10:04:14.483 に答える
2

あなたが自分自身に問うべき質問は、どの場所でも(たとえばコストのために)分光計が1つしかないと思われる場合以外に、シングルトンクラスが必要な理由であると思います。その場合、それは偶然にもどのソフトウェアよりもシングルトンです設計上の理由。On Design Patterns: When to use the Singleton?でシングルトンをカバーしたい理由 また、シングルトンのマイナス面については、シングルトンの何がそんなに悪いのか? で説明されています。. 個人的には、ソフトウェアの観点から状況が実際にそれを必要とする場合を除いて、シングルトン パターンの大ファンではありません。

于 2013-05-13T09:55:13.413 に答える