我正在编写一个围绕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();
}
其中SomeExternalInterface
和Settings
是框架和实施用户都使用的接口。
该框架可能会使用来自threadPoolSize
的{{1}}成员,以及Settings
中的'intialize()'和'cleanUp()'等成员
此类传递给任务的方式当前是通过实现任务类的构造函数。我不喜欢这个。与在SomeExternalInterface
接口中指定的RuntimeEnvironment相比,它产生了一个模糊的api
为什么不将它添加到你问的任务界面?像
Task
因为,运行public interface Task {
void run(Callback callback, RuntimeEnvironment runtime);
}
很好(因为它在界面中指定),但如果用户希望能够获得他或她指定的runtime.settings().getThreadPoolSize()
或runtime.settings().getWonkyTimeUnit()
该怎么办?各个接口的实现? runtime.settings()返回接口,而不是实现类。
所以......
答案 0 :(得分:1)
您可以允许使用字符串runtime.settings().set("wonky_time_unit");
来获取/设置自定义设置,以便用户可以添加任意数量的属性,并通过设置界面提供这些属性:runtime.settings().set("attemptToDefuseImminentExplotion") = true;
。
答案 1 :(得分:1)
如果全部关于设置或更好的配置,您可以看看Apache Hadoop如何处理这种情况。他们有Context
,他们存储Configuration
类。与您的RuntimeEnvironment
和Settings
相同。在内部,Configuration
类使用Map
所有配置,您可以通过您提供特定配置的密钥访问它们。请参阅:Hadoop Configuration
答案 2 :(得分:1)
如果用户可以拥有自己的“设置”和“外部”实现/接口,则必须允许。您的api必须能够设置/定义类型。
public abstract class RuntimeEnvironment<E, S extends Settings> {
...
E external();
S settings();
...
}
是一种可能性。用户可以实现抽象类并返回自己的类型。