1

私はレガシーコードをモジュール化しようとしていますが、そうすることでこの問題に遭遇しました:

同じモジュールに属する2つのクラスがあり、他の多くのクラスもあります。各クラスには、他の場所で使用される1つ以上のパブリックメソッドがあります。モジュールの一般的なインターフェイスを作成したいのですが、これを行う方法がわかりません。モジュール用に1つのインターフェイスを作成すると、そのインターフェイスを使用するすべてのクラスに空白のメソッドを実装する必要がありますが、これはあまり良くありません。ただし、モジュール内の特定のクラスで使用できる複数のインターフェイスを作成すると、型の参照に使用される1つのインターフェイス間でそれらをすべて組み合わせることができます。

/-------------\     /-------------\
| Interface A |     | Interface B |
\-------------/     \-------------/
/-------------\     /-------------\
|   Class A   |     |   Class B   |
\-------------/     \-------------/

/-------------\     /-------------\
| Interface A |     | Interface B |
\-------------/     \-------------/
            ^         ^
            |         |
        /------------------\
        | Module Interface |
        \------------------/

これに役立つデザインパターンはありますか、または特定のモジュールを構成するインターフェイスをサブインターフェイスに組み合わせて、モジュールタイプを表す正しい方法でこれを実現していますか?

4

2 に答える 2

3

私はあなたの問題を本当に理解しているかどうかはわかりませんが、継承を通じてインターフェースを1つのインターフェースに組み合わせることができます。つまり、インターフェースは多重継承をサポートします。

あなたに適用できるかもしれないパターンはアダプターパターンです:http://en.wikipedia.org/wiki/Adapter_pattern

また、インターフェースを作成するためにインターフェースを作成しないようにしてください。Javaには、他の実装が決してないもののためのインターフェースを作成しようとしたこの長年の歴史があります。APIを作成する場合を除いて、KISSを検討してください。

于 2012-04-17T11:35:48.867 に答える
1

共通のインターフェースを作成する場合、そのインターフェースのユーザーは、そのすべてのメソッドが機能することを期待します(使用方法のドキュメントに明示的に記載されていない限り)。

両方のモジュールが適切に機能するように、インターフェイスレベルで複雑なルールを指定する必要がある場合は、カスタムインターフェイスを作成するのが最善ではない場合があります。

ただし、両方のモジュールに他のモジュールとは異なるメソッドがいくつかあり、呼び出されても違いがモジュールを壊さない場合は、カスタムインターフェイスを作成してから、各モジュールのインターフェイスのデフォルトの抽象実装を提供できます。実際のモジュールが派生します。抽象実装は、共通インターフェースのすべてのメソッドのデフォルト(たとえば、何もしない)実装を定義できるため、具象モジュールクラスはそれらを具体的に実装する必要はありません。

interface AIface {
  void methodA();
}

interface BIface {
  void methodB();
}

interface CommonIface extends AIface, BIface {
}

abstract class CommonAbstract implements CommonIface {
  @Override
  void methodA() {}
  @Override
  void methodB() {}
}

class ModuleA extends CommonAbstract {
  @Override
  void methodA() {
    // A's implementation
  }
}

class ModuleB extends CommonAbstract {
  @Override
  void methodB() {
    // B's implementation
  }
}
于 2012-04-17T11:33:10.680 に答える