api中接口和实现的分离

时间:2012-07-02 10:01:09

标签: java api

我正在编写一个围绕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是框架和实施用户都使用的接口。

该框架可能会使用来自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()返回接口,而不是实现类。

所以......

如何让api-user指定hes(或她)自己的实现而不影响api的泛化和明确性?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

如果全部关于设置或更好的配置,您可以看看Apache Hadoop如何处理这种情况。他们有Context,他们存储Configuration类。与您的RuntimeEnvironmentSettings相同。在内部,Configuration类使用Map所有配置,您可以通过您提供特定配置的密钥访问它们。请参阅:Hadoop Configuration

答案 2 :(得分:1)

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

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

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

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