私のアプリケーションは、「モジュール」を (モジュール ポートを介して) 接続するためのエディターです。ポートにはポート タイプがあります。各ポート タイプには、関連付けられたコンパレータがあります。2 つのタイプは、それらの属性がコンパレーターに実装されたルールを満たしている場合に互換性があります。
新しいポート タイプとそれらを接続する方法のルールを実装して (Eclipse 拡張ポイント インフラストラクチャを介して)、ユーザーにアプリケーションを拡張してもらいたいと考えています。
これは、実行時にポート タイプのインターフェイスとしか対話できないことを意味します。具体的なクラスは知られていません。すべての具体的な実装は、ファクトリによって返されます。
この 2 つのインターフェイスを実装しました。
public interface IPortType {
[many attributes]
}
public interface IComparator {
public boolean isCompatible(IPortType source, IPortType target);
// more interaction methods!
}
一般的な isCompatible(IPortType source, IPortType target) メソッドは一種のデリゲートであり、すべてのサブクラスで書き直す必要があるため、私の現在のソリューションは少し醜いです。ここでは、単に isCompatible() メソッドをオーバーロードするだけでは機能しません。
しかし、より大きな欠点は、open-closed-principle の違反です。新しい型をサポートする必要がある場合は、すべての具象 Comparator クラスを拡張する必要があります。しかし、変換などのタイプ間の相互作用が多い場合に、ルール クラスの数を低く抑えるにはどうすればよいでしょうか? 私の意図は、1 つのタイプのすべてのルールを 1 つのクラスに保持することでした。
具体的な Comparator の例:
public class ATypeComparator implements IComparator {
public boolean isCompatible(IPortType source, IPortType target) {
if (!(source instanceof AType))
return false;
if (target instanceof BType)
return isCompatible(source, (BType) target);
if (target instanceof CType)
return isCompatible(source, (CType) target);
}
public boolean isCompatible(AType source, BType target) {...}
public boolean isCompatible(AType source, CType target) {...}
}
この問題をどのように解決しますか?
ご提案ありがとうございます。