7

関数は、オブジェクト自体ではなく、インターフェイスをパラメーターとして使用する必要があることを同僚に納得させようとしています。小さなオブジェクトは渡しても問題ないと思いますが、大きなオブジェクトの場合は、インターフェイスを与えて、すべてではなく、単に i/f を渡します。

これらの大きなクラスは 1 つしか存在しないことに注意してください。i/f が別のオブジェクトに使用されることはありません。これは単にオブジェクトの実装を隠すためのものです。

大きなクラスをインターフェースに分離することは良い習慣だと思いますか?
これを行うことの欠点はありますか?

例:

public interface class IVeryLargeClass
{
    void DoSomething();
    ...
};

public ref class VeryLargeClass : public IVeryLargeClass
{
public:
    virtual void DoSomething() { ... }
    ...
};

public ref class AnotherClass
{
public:
    AnotherClass(VeryLargeClass^ vlc)  { vlc->DoSomething(); }
 // OR
    AnotherClass(IVeryLargeClass^ vlc) { vlc->DoSomething(); }
};
4

5 に答える 5

13

OO 開発で最初に学ぶ原則の 1 つ:

実装ではなく、インターフェイスにプログラムします。

「これらの大きなクラスの 1 つだけが存在することになります。i/f は別のオブジェクトに使用されることはありません」。これはあなたの場合に当てはまるかもしれませんが、そのような発言が間違っていることが判明するたびに、5 セント硬貨があればいいのにと思います。

インターフェイスに複数の実装があるかどうかを検討するだけでなく、具体的なオブジェクトが、インターフェイスで宣言された操作と論理的な類似性を共有しない追加のメソッドをエクスポートする (またはエクスポートする可能性がある) かどうかも検討する必要があります。このような場合、追加の操作を 1 つ以上の追加のインターフェイスで宣言するだけです。したがって、クライアントは、関心のある操作をエクスポートするインターフェースと結合するだけで済みます。

簡単に言えば、インターフェイスは、クライアントとプロバイダー間の結合を管理する手段を提供します。

于 2009-06-16T18:04:08.970 に答える
9

依存性逆転の原則は次のように要約できます。

ほとんどの場合、具体的なクラスを渡すよりもインターフェイスを渡す方が適切です。

そうは言っても、特定のモジュール内では内部型に対する高い凝集性は問題ありませんが、具体的なオブジェクトをいつ、どのように渡す必要があるかについては非常に主観的です。

于 2009-06-16T18:02:00.393 に答える
3

実装を渡すと、インターフェイスを使用する利点の 1 つが失われ、実際の実装からロジックが分離されます。

ソフトウェア モジュール A のインターフェイスは、そのモジュールの実装から意図的に分離されています。後者には、インターフェースで記述されたプロシージャーとメソッドの実際のコード、およびその他の「プライベート」変数、プロシージャーなどが含まれます。 A はインターフェイスを介してのみそうするように強制されます。この配置の実際的な利点の 1 つは、A の実装をインターフェイスの同じ仕様を満たす別のものに置き換えても、B が失敗することはないということです — A の使用がインターフェイスの仕様に準拠している限り (Liskov 置換も参照してください)。原理)。

http://en.wikipedia.org/wiki/Interface_(computer_science)

于 2009-06-16T18:05:26.067 に答える
3

インターフェイスを作成するために、インターフェイスを作成することは避けたいと思います。そのインターフェイスを複数の場所で使用できる場合、またはこれがパブリック関数とクラスであり、特に単純化したい場合は勝者です。

于 2009-06-16T18:06:12.073 に答える
1

もう 1 つの問題は、クラス自体が非常に大きいことです。これはあなたがやっていることの範囲内ではないかもしれませんが、クラスが非常に大きいということは、そもそもやりすぎている可能性があることを意味します。呼び出している関数内で必要な情報が独自の小さなクラスにカプセル化されている小さなクラスにリファクタリングできますか? そのクラスに対してインターフェースを作成すると、現在持っている非常に大きなクラスに対してよりもはるかに再利用しやすいことがわかるでしょう。

于 2009-06-17T10:20:12.243 に答える