0

構成ファイル、レジストリ、およびデータベースのいずれかにさまざまなパラメーターを格納するプロジェクトを継承しました。これらのパラメーターのいずれかが必要な人は、ストアから直接読み取る (場合によっては書き込む) だけです。これは、またはもちろん、ばかげているので、最初に考えたのは、既存のコードをリファクタリングして、クライアントがパラメーターが格納されている場所を認識できないようにすることでした。各パラメーターのプロパティを持つ従来の AppSettings クラスを作成しました。ストアにはグローバル スコープが必要なので、スレッド セーフなシングルトンを作成しました。このクラスは、パラメーター値をフィールドに格納するのではなく、実際のストア (構成ファイル、レジストリ、またはデータベース) との間でパラメーター値を読み書きすることにより、アクセス ポイントとして機能します。最近では、シングルトンとグローバル状態の危険性についての話題を避けるのは困難です。

  1. 私のソリューションでは、テスト可能性以外にどのような問題が見られますか?
  2. 軽量の代替品は何ですか?パラメータを使用するオブジェクトごとにファクトリを作成することはできません (作業が多すぎます)。
  3. より重いリファクタリングを行う機会が得られるまで、シングルトンを使用することは許容できる妥協点として機能しませんか?
  4. シングルトン クラスのプロパティにゲッターしかない場合、それで問題ありませんか?

一部のパラメーターのストアが将来 (たとえば、レジ​​ストリからデータベースに) 変更されることが予想されるため、それがストアをシングルトン クラスの背後に隠す動機になりました。

4

3 に答える 3

2

これは少し答えになりませんが、参照としてシングルトンに関する c2wiki のページを強くお勧めしますhttp://c2.com/cgi/wiki?search=Singleton

また、ページhttp://c2.com/cgi/wiki?GlobalVariablesAreBad

一般的な評決は、グローバルな状態がシステムの非常に異なる部分間の結合を作成することであり、非常に慎重に検討および設計する必要があると思います。問題は、これらすべての設定が真にグローバルであり、システムのさまざまな部分で必要とされているかということです。そうでない場合、それらをより低いアクセスレベルで異なるモジュール内に存在できる小さな部分に分割する方法はありますか?

それが小規模なプロジェクトであれば、私はあまり気にしませんが、c2wiki のページには、大規模なプロジェクトではグローバルな状態とシングルトンが苦痛であるという多くの知恵があります。

于 2009-09-17T21:26:35.987 に答える
0

みんなありがとう。私はこれを中規模のプロジェクト (約 200KLOC) と考えており、C# です。問題は、このプロジェクトには長く問題のある歴史があり、多くのコーダーが取り組んできたことです。私は依存性注入を適切に学びたいと思っていますが (概念を理解し、同意しています)、締め切りが迫っているので、今はその時期ではありません。現在のシングルトン クラスを調べた後、それを 2 つのインスタンス クラスに分割することにしました。一部のパラメータは全体で使用されますが、一部は 1 つのアセンブリでのみ使用されます。Doug が言ったように、インスタンス クラスを使用することで、同じように簡単にスレッド セーフを実現できます。

さまざまな依存性注入フレームワークに関しては、問題は多すぎることです。Spring と Unity について簡単に説明しました。違いをまとめてみたいと思います。

再度、感謝します!

于 2009-09-18T07:00:07.167 に答える
0

構成データはグローバルであるため、特に読み取りのためにアクセスするにはグローバルシングルトンが必要であるという仮定に挑戦します。構成設定を読み取るために必要に応じて呼び出すことができる AppSettings クラスを作成することを検討してください。

スレッド セーフな方法で記述する必要がある場合は、AppSettings クラスの静的 (またはシングルトン) プライベート メンバーを作成して、書き込みのみを制御できます。したがって、AppSettings の任意のインスタンスが書き込み可能ですが、「グローバル」アクセスは実際には AppSettings クラスに制限されています。

于 2009-09-17T21:04:01.127 に答える