1

我正在编写一个框架,jUnit用于在 Java 中编写脚本测试。

它是基于任务的,每个任务都按顺序执行。这是一个简化的视图:

所有任务使用的界面看起来像

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();
}

其中SomeExternalInterfaceSettings是框架和实现用户都使用的接口。

框架可能会使用threadPoolSizefrom Settings、'initialize()' 和 'cleanUp()'等成员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

如果用户可以拥有自己的设置和外部实现/接口,则必须允许。您的 api 必须能够设置/定义类型。

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

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

是一种可能性。用户可以实现抽象类并返回他自己的类型。

于 2012-07-02T10:13:58.270 回答
1

如果它完全是关于设置或更好的配置,你可以看看 Apache Hadoop 是如何处理这种情况的。他们有一个Context存放Configuration班级的地方。RuntimeEnvironment和你的一样Settings。在内部,Configuration该类使用Map所有配置,您可以通过您提供特定配置的键访问它们。请参阅:Hadoop 配置

于 2012-07-02T10:10:00.513 回答
1

您可以允许使用字符串获取/设置自定义设置:runtime.settings().set("wonky_time_unit");以便用户可以添加任意数量的属性,并且可以通过设置界面使用它们:runtime.settings().set("attemptToDefuseImminentExplotion") = true;.

于 2012-07-02T10:08:13.087 回答