1

私のアプリケーションは、「モジュール」を (モジュール ポートを介して) 接続するためのエディターです。ポートにはポート タイプがあります。各ポート タイプには、関連付けられたコンパレータがあります。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) {...}
}

この問題をどのように解決しますか?

ご提案ありがとうございます。

4

2 に答える 2

1

IPortType 実装が他の IPortType 実装と互換性があるかどうかを判断するのは正しいとは思いません。それはその責任の一部ではありません。

簡単な解決策は、たとえばクラス PortTypeManager 内に、2 つの IPortType 実装に互換性があるかどうかを認識している単一の public static メソッドを作成することです。そうすれば、いつでも新しい型を追加でき、その新しい型に対応するために 1 か所のロジックを変更するだけで済みます。

ただし、最終的には、メソッドがカバーする必要があるケースの数が n^2 のように増加するため、これでも十分ではありません。2 つの実装に互換性があるかどうかを判断するには、各 IPortType 実装に getVersion() や getSignature() などのメソッドを提供する必要があります。これらのメソッドは、同様のデータと比較できるデータを返します。

于 2010-01-09T16:42:33.013 に答える
0

ポリモーフィズムで複雑さを処理できるようにすれば、実装をクリーンアップできるように思われます。

.compatibleTo()にメソッドを持つ方が簡単ではないでしょうIPortTypeか? これを行うことができれば、各実装は、サポートできるエンドポイントをサポートしていることを本質的に知ることができますか?

次のようなもの:

IPortType port1 = ...
IPortType port2 = ...

if (port.compatibleTo(port2)) {
    // do whatever
}
于 2010-01-09T16:44:51.373 に答える