0

私のプロジェクトでは、さまざまなデータベース接続クラスのそれぞれに必要なメソッドを記述するためのインターフェイスを定義しました。これはと呼ばれIDatabaseConnectivityObjectます。私の各クラスはこのインターフェースを実装して、クエリの実行、接続の確立などのためにすべてのクラスに同じメソッドが含まれていることを確認します。

次のコードを検討してください。

IDatabaseConnectivityObject adoDataBaseConnection = new DbProviderFactoryConnection();

DbProviderFactoryConnection adoDataBaseConnection = new DbProviderFactoryConnection();

上記の行は両方とも同じように動作しますか?もしそうなら、なぜですか?そうでない場合は、なぜですか?両方の利点は何ですか?

それは本当にばかげた質問かもしれませんが、私は長い間インターフェースを使用したことがなく、1行目が何をするのかわかりません。インターフェイスは単に動作を定義するだけなので、インターフェイスのインスタンスを作成できないことは私の理解でしたが、その行はどのように可能ですか?

4

4 に答える 4

2

上記の行は両方とも同じように動作しますか?もしそうなら、なぜですか?

実行時にはい。違いは、型の変数を宣言するとIDatabaseConnectivityObject、コンパイル時に変数でこのインターフェイスのメンバーのみを表示できることです。一方、それを宣言するとDbProviderFactoryConnection、このクラスのすべてのメンバーが表示されます。

良い習慣として、変数(IDatabaseConnectivityObjectこの場合)を宣言するときは、階層内で可能な限り高いタイプで作業することをお勧めします。これにより、コンシューマーが必要とするすべてのメンバーにアクセスできます。

于 2012-05-23T11:01:05.117 に答える
1

インターフェースは、消費者が信頼できるコントラクトを定義します。必要に応じてAPIを定義します。インターフェイスに存在するメンバーを使用する場合、2つの行は機能的に同じです。

インターフェイスを使用すると、何かがどのように実装されているかは気にせず、コントラクトに実装されていることを表すだけです。インターフェイスは、緩い結合も促進します。

インターフェイスに対してプログラミングすることの利点は、「実行」ではなく「合意」に対してプログラミングしていること、または実装ではなく契約に対してプログラミングしていることです。これは、テスト中にインターフェイスをモックまたはスタブして、テストシナリオでの無関係な依存関係の数を減らすことができるため、テストに大きなプラスの影響を与えます。

上記と同様の利点は、ファクトリパターン、IoC、DIなどのインターフェイスとともにインターフェイスを使用して、インターフェイスのさまざまな実装をオンザフライで提供できることです。たとえば、さまざまな顧客にさまざまなビジネスロジックハン​​ドラを提供できます。

もう1つの利点は、多重継承の欠如を回避するのに役立つことです。ほとんどのものはインターフェースを介してうまく表現でき、クラスは複数のインターフェースを実装できます。

于 2012-05-23T11:03:22.243 に答える
1

IDatabaseConnectivityObject1つ目は、前進する別の実装に切り替えることができます。

これにより、システムが前進する変化に対してより抵抗力を持つことができるため、これは良い習慣です。変更のコストを低く抑えることが重要です。

于 2012-05-23T11:00:14.583 に答える
0

あなたは利益を求めてきました。

インターフェイスに対してプログラミングしている場合(およびファクトリを使用して具象型を作成している場合)、ロジック(ユニット)に配置されたインスタンスをモックできるため、ユニットテストが容易になります。

これは実際には「デザインパターンの原則」です。

「「実装」ではなく、「インターフェース」へのプログラム。」(ギャングオブフォー1995:18)

于 2012-05-23T11:01:01.067 に答える