0

私は現在、アプリケーションの大きな部分をリファクタリングするのに忙しいです。主な目的は、異なるモジュール間の依存関係を可能な限り取り除くことです。私は今、次の問題に遭遇しました:

私のアプリケーションには、インターフェイス IDataProvider を定義した GUI モジュールがあります。インターフェイスはアプリケーションによって実装される必要があり、GUI モジュールに「データを提供する」ために使用されます。たとえば、データ グリッドにこの IDataProvider を指定し、それを使用して、データ グリッドに表示する必要があるすべてのインスタンスをループし、それらのデータを取得できます。

今度は別のモジュール (実際にはもっと多くのモジュール) があり、それらはすべて似たようなもの (レポート モジュール、データベース統合モジュール、数学ソルバー モジュールなど) を必要とします。現時点で、私にできることが 2 つあります。

  • IDataProvider を GUI レイヤーからはるかに下位のレイヤーに移動し、他のすべてのモジュールでこの同じインターフェイスを再利用できます。
    • これには、アプリケーションがすべてのモジュールを簡単に使用できるという利点があります (データ プロバイダーを 1 回実装するだけで済みます)。
    • 欠点は、モジュールと中央の IDataProvider の間に依存関係を導入することです。誰かが 1 つのモジュールに必要な追加のメソッドで IDataProvider を拡張し始めると、他のモジュールも汚染し始めます。
  • もう 1 つの方法は、すべてのモジュールに独自のデータ プロバイダーを提供し、すべてのモジュールを使用する必要がある場合は、アプリケーションにすべてのデータ プロバイダーを強制的に実装させることです。
    • 利点は、モジュールが共通部分に依存していないことです
    • 欠点は、IGridDataProvider、IReportDataProvider、IDatabaseDataProvider、ISolverDataProvider になってしまうことです。

使用するための最良のアプローチは何ですか? [ほとんどまたは完全に] 同じ種類のインターフェイスが必要な場合、すべてのモジュールを同じ共通インターフェイスに依存させることは許容されますか?

同じ IDataProvider インターフェイスを使用すると、将来厄介な問題が発生する可能性がありますか (現時点では認識していません)。

4

4 に答える 4

1

インターフェイスが公開するすべてのメソッドを使用していなくても、1つのインターフェイスに応じて複数のモジュールを使用してもかまいません。また、意図されているモジュールではなく、インターフェイスの一部の意味をより深く考えることもできます。あなたが言及するモジュールのほとんどは、読み取りアクセスのみを必要とします。したがって、この方法で分離して、書き込みなどのために別のものを用意することができます。

データ層は、データが何に使用されているかを知る必要はありません(これはプレゼンテーション層の仕事です)。それを返す方法とそれを変更する方法を知る必要があるだけです。

さらに、UIとは関係のないビジネスロジック(データ整合性など)がすでに実装されている可能性があるため、データプロバイダー(コントローラーとしてラベル付けすることもできます)を下位レベルに移動してもまったく問題はありません。

于 2010-09-24T16:17:30.843 に答える
1

追加のメソッドがインターフェイスに適用されることが心配な場合は、アダプター パターンを使用できます。あれは:

class myFoo{
public:
    Bar getBar() =0;
}

そして他のモジュールでは:

class myBaz{
public:
    Bar getBar() =0;
}

次に、一方を他方と使用するには:

class MyAdaptor: public myBaz{
public:
    MyAdaptor(myFoo *_input){
        m_Foo = _input;
    }

    Bar getBar(){ return m_Foo->getBar(); }

private:
    myFoo* m_Foo;
}

そうすれば、インターフェイスにすべてを実装しmyBaz、接着剤を 1 か所に供給するだけで済みます。にはmyFoo追加のメソッドを必要な数だけ追加できます。アプリケーションの残りの部分はそれを認識したり気にしたりする必要はありません。

于 2010-09-24T16:13:26.643 に答える
1

IDataProvider を下位レベルのレイヤーに移動するために挙げた欠点の代替手段があります。

拡張インターフェイスが必要なモジュールは、それらの拡張機能を IDataProvider の独自のサブインターフェイスに配置できます。これらのサブインターフェイスを積極的に作成することで、これを促進できます。

于 2010-09-24T16:13:33.160 に答える
1

中間実装をしてみませんか?一部のクラスIDataProviderに、ファクタリングされたライブラリ (または他のレイヤー) で (最初のケースのように) の繰り返し部分を実装させます。また、誰もが独自のものを「実装」する必要がありますIDataProvider(2 番目のケースのように)。次に、実装をあらゆる場所で再利用IDataProviderし、派生クラスを作成してカスタム クラスに特定のメソッドを追加できます...

すなわち:

    // Common module.
class BasicDataProvider : IDataProvider
{
public:
    // common overrides...
};

    // For modules requiring no specific methods...
typedef BasicDataProvider ReportDataProvider;

    // Database module requires "special" handling.
class DatabaseDataProvider : BasicDataProvider
{
public:
    // custom overrides...
};
于 2010-09-24T16:55:56.260 に答える