0

グローバルは悪ですよね?少なくとも私が読んだものはすべてそう言っています。なぜなら、何かがいつでもグローバルの状態を変更する可能性があるからです。

ただし、クラスパラメーターに関しては少し厄介なDBオブジェクトがあります。以下のプロパティは、MS Access または SQL で自動的に機能するラッパー クラスのインスタンスです。そのため、EF やその他の ORM ではないのです。

Public Property db As New DBI.DBI(DBI.DBI.modeenum.access, String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0} ;Persist Security Info=True;Jet OLEDB:Database Password=""lkjhgfds8928""", GetRpcd("c:\cms")))

コード自体には例外処理用の PostSharp があるため、条件付きで oledb エラーをログに記録し、Null の場合は DB を再初期化することで処理できると考えています。

これまでの解決策は、db をパラメータとして必要なすべてのクラスに継続的に渡すことでした。ほとんどのデータ クラスには、変更された inotifyproperty を個別に実装する構造から構築された共有の監視可能なコレクションがあります。これらの 1 つは、非同期的にビルドされます。コレクション プロパティは、非公開の Async buildCollection サブルーチンを起動する前に空かどうかをチェックします。

私はそれを学ぶ必要があるので、依存性注入を(まだ)使用していないことを考えると。グローバルプロパティはそんなに悪いですか?データが取り込まれたり保存されたりするすべての場所で Db が必要です。まったく必要のない唯一の場所は、View とそのコード ビハインドです。

これは顧客向けのプロジェクトではありませんが、堅固である必要があります。

どんなアドバイスもありがたく受け取った!!

4

1 に答える 1

2

DB 接続をパラメーターとしてクラスに渡すことは、依存性注入を使用しています。おそらく、そのように認識していないだけでしょう。呼び出し元で接続文字列をハード コーディングしても依存関係がないわけではありませんが、少なくともデータベース アクセサー自体はグローバル接続に依存していません。

グローバルは予告なしに変更されるため、単に悪ではありません。これは、設計の選択が不適切であることに起因する影響の 1 つにすぎません。それらを使用したデザインはもろいので、それらは悪です。グローバルに依存するコードは、それを呼び出す前に目に見えないものを正しく設定する必要があり、無関係なコード間の相互依存につながります。目に見えないものは非常に重要なものになります。内部でグローバルを使用するモジュールのインターフェースだけを読んで、呼び出す前に SetupGlobalThing() メソッドを呼び出す必要があることをどのように知ることができますか? ユーザーが選択した関数に応じて、さまざまな順序で IncrementGlobalThing() と DecrementGlobalThing() と MultiplyGlobalThing() を呼び出すとどうなりますか?

代わりに、変更して使用するすべてのものを渡すステートレス メソッドを優先します。 IncrementThing(Integer thing) は、隠されたセットアップ手順に依存しません。明らかに 1 つのことを行います: 渡されたものをインクリメントします。

単体テストの観点から考えると役立つ場合があります。コードの特定のモジュールが機能することを証明する単体テストを作成する場合、実際のデータベース接続を渡す必要がありますか (ハード*)、またはテストのニーズを満たす偽のデータベース参照を簡単に渡すことができますか? ?

ロジックをテストする最善の方法は、単体テストを行うことです。クラス インターフェイスとメソッド構造をテストする最善の方法は、それらを呼び出す単体テストを作成することです。クラスのテストが難しい場合は、外部のもの (グローバル、シングルトン、データベース、不適切なメンバー変数など) への依存が原因である可能性があります。

  • 私が実際のデータベースの使用を「難しい」と呼んだ理由は、単体テストを簡単かつ迅速に実行する必要があるためです。遅い、壊れやすい、または複雑な外部のものに依存するべきではありません。ネットワーク接続なしで、バス上でソフトウェアの単体テストを行うことを考えてみてください。ダミー データベースを作成するのにどれだけの作業が必要かを考えてみてください。ユーザーを追加し、適切なバージョンのスキーマが必要であり、インストールし、適切な種類のテスト データを入力する必要があります。ネットワーク接続が必要な場合、これらすべてがテストの信頼性を低下させる可能性があります。代わりに、単体テストでは、テスト対象のコードを実行する値を返すだけのモック データベースを渡します。
于 2013-01-16T17:28:44.493 に答える