2013-04-25 103 views
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的設計,它有一個作爲異步服務或as執行的標誌一個同步服務:

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

所以現在的實現將知道如何運行基於該標誌。

我知道第一個設計更好,但我需要利弊來解釋原因。

回答

1

我去的第一種方法,因爲

1碼清潔AsyncInex類只具有與異步調用代碼和syncIndex將有它自己的代碼。 2 - 你能避免否則,如果

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

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

你與界面「IndexService」工作,你可以隨時更改實施不改變客戶端的代碼。 特別是如果你使用DI框架,你可以踢它;)。

這對於不允許客戶端代碼瞭解實現如此重要。假設你在索引數據庫的情況下。 您希望在數據很大時執行異步索引,或者在數據很小時執行同步索引。 調用者應該不知道調用索引的方式。這樣你可以在不改變呼叫者代碼的情況下在不同的情況下有不同的策略。如果你採取第二種方法,你必須做一些額外的工作。

1

我說都有。

假設您打算使用第二種方法。你implmentation可能看起來像:

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

} 

這就是說,你打算寫這段指數法或SyncOrAsyncIndex類中實現。這可能最終會變得難以管理。 因此,指數法可能最終會是這樣的:

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。