1

jUnitJava でテストをスクリプト化するために構築されたフレームワークを作成しています。

これはタスク ベースであり、各タスクは順番に実行されます。簡略化したビューを次に示します。

すべてのタスクが使用するインターフェースは次のようになります

public interface Task {
    void run(Callback callback);
}

Callbackタスクが終了したことを実行者に伝える方法をタスクに提供するインターフェイスを使用します。

public interface Callback {
    void done();
    void failed(String wtf);
}

また、エグゼキューター、外部 (物理) インターフェース、および設定クラスへのインターフェースをユーザーに提供しています。私はこれをランタイム環境と呼び、抽象的に実装されています。

public abstract class RuntimeEnvironment {
    void execute(Task task) { ... }
    void schedule(Task task, long delay) { ... }
    SomeExternalInterface external();
    Settings settings();
}

whereSomeExternalInterfaceSettingsは、フレームワークと実装ユーザーの両方によって使用されるインターフェイスです。

threadPoolSizeフレームワークはfrom Settings、および 'initialize()' と 'cleanUp()' from のようなメンバーを使用する場合があります。SomeExternalInterface

このクラスがタスクに渡される方法は、現在、実装するタスク クラスのコンストラクターを介して行われます。私はこれが好きではありません。Taskインターフェイスで RuntimeEnvironment を指定する場合と比較して、あいまいな API になります。

あなたが尋ねるタスクインターフェースにそれを追加してみませんか? お気に入り

public interface Task {
    void run(Callback callback, RuntimeEnvironment runtime);
}

なぜなら、実行runtime.settings().getThreadPoolSize()は問題ありません (インターフェイスで指定されているため) が、ユーザーが取得できるようにしたい場合、runtime.settings().getWonkyTimeUnit()またはruntime.external().attemptToDefuseImminentExplotion()それぞれのインターフェイスの実装で指定した場合はどうなるでしょうか? runtime.settings() は、実装クラスではなく、インターフェースを返します。

そう ...

API の一般化と明確さを損なうことなく、API ユーザーが自分 (または彼女) 自身の実装を指定できるようにするにはどうすればよいですか?

4

3 に答える 3

1

設定がすべてであるか、構成が優れている場合は、ApacheHadoopがそのような状況をどのように処理しているかを確認できます。彼らはクラスContextを保存する場所を持っています。あなたとConfiguration同じように。内部的には、クラスはすべての構成でを使用し、特定の構成を指定したキーを介してそれらにアクセスできます。参照:Hadoop構成RuntimeEnvironmentSettingsConfigurationMap

于 2012-07-02T10:10:00.513 に答える
1

ユーザーが設定と外部の独自の実装/インターフェースを持つことができる場合は、それを許可する必要があります。APIには、タイプを設定/定義する可能性が必要です。

public abstract class RuntimeEnvironment<E, S extends Settings> {
...

   E external();
   S settings();
...
}

1つの可能性です。ユーザーは抽象クラスを実装し、自分の型を返すことができます。

于 2012-07-02T10:13:58.270 に答える
1

文字列を使用してカスタム設定を取得/設定できるようにすることができます。runtime.settings().set("wonky_time_unit");これにより、ユーザーは必要な数のプロパティを追加でき、設定インターフェイスを通じて利用できるようになりますruntime.settings().set("attemptToDefuseImminentExplotion") = true;

于 2012-07-02T10:08:13.087 に答える