1

我需要索引项目。此服务应运行同步或异步。

我开始设计一个界面

public interface IndexService{
    public void index();
}

还有两种实现,一种用于异步索引:

public class AsyncIndex implements IndexService {

    public void index(){
        //... Creates a Thread and index the items
    }

}

另一个是同步索引

public class SyncIndex implements IndexService {

    public void index(){
        //... Creates a Thread and index the items
    }

}

但是现在有另一种设计,它有一个 IndexService,它有一个标志可以作为异步服务或同步服务执行:

public interface IndexService{
    public void index(int mode);
}

所以现在实现将知道如何基于该标志运行。

我知道第一个设计更好,但我需要利弊来解释原因。

4

2 回答 2

1

我说两个。

假设您计划使用第二种方法。您的实现可能如下所示:

public SyncOrAsyncIndex implements IndexService {
public void index(int mode) {
    if(mode == 0) {
        //sync processing code
    } else if (mode == 1) {
        //async procesisng code
    }

}

也就是说,您是否要在此索引方法或 SyncOrAsyncIndex 类中编写所有实现。这最终可能会变得无法管理。因此, index 方法可能会像这样结束:

public void index(int mode) {
    if(mode == 0) {
        new SyncIndex().index(); //for example
    } else if (mode == ) {
        new AsyncIndex().index(); //for example
    }
}

假设,您决定支持第三种模式。想象一下索引方法或 SyncOrAsyncIndex 类的困境。因此,需要第一种方法。

因此,根据“接口代码”策略,建议使用第一种方法。如果调用者知道索引的类型,他们就可以实例化特定类型并使用它。

否则,与第一种方法一起,可能需要第二种方法作为工厂或策略来根据传递的参数计算要使用的索引类型。然后调用者将通过 SyncOrAsyncIndex 使用 SyncIndex 或 AsyncIndex。

于 2013-04-26T02:54:33.703 回答
1

我选择第一种方法是因为

1- 代码更简洁 AsyncInex 类只有与异步调用相关的代码,而 syncIndex 有自己的代码。2-你可以避免 else if

...
public void runService(IndexService service) {
     service.index()
}

// some where in your code
runService(new AsyncIndex());
// or
runService(new SyncIndex());

当您使用接口“IndexService”时,您可以随时更改实现而不更改客户端代码。特别是如果您使用的是 DI 框架,则可以使用它;)。

这对于不允许客户端代码了解实现非常重要。假设您正在索引的情况,例如数据库。你想在数据很大时做异步索引,或者在数据很小时做同步索引。调用者应该不知道索引的调用方式。这样,您可以在不同情况下采用不同的策略,而无需更改调用者代码。如果你采用第二种方法,你必须做一些额外的工作。

于 2013-04-26T09:22:28.637 回答