2013-01-31 121 views
0

我是一位初學程序員,學習如何爲我的模塊設計API。我想到了兩種類型的服務類來提供其他類使用的API。服務層的API設計

第一個例子通過參數來處理邏輯,第二個例子通過對象方式來處理。

哪一個更好的方法/設計爲我提供其他類使用的業務方法?

作爲我應該使用的一般經驗法則?

實施例1 - 服務A

public class ServiceA { 

    private SampleDAO dao = new SampleDAO(); 
    private static final String DRAFT_STATUS = "DRAFT"; 
    private static final String APPROVED_STATUS = "APPROVED"; 
    private static final String SUBMITTED_STATUS = "SUBMITTED"; 


    public boolean isDocumentApprove(String documentId) { 
     Document doc = getDocument(documentId); 

     return (APPROVED_STATUS.equals(doc.getStatus())); 
    } 

    public boolean isDocumentDraft(String documentId) { 
     Document doc = getDocument(documentId); 

     return (DRAFT_STATUS.equals(doc.getStatus())); 
    } 

    public boolean isDocumentSubmited(String documentId) { 
     Document doc = getDocument(documentId); 

     return (SUBMITTED_STATUS.equals(doc.getStatus())); 
    } 


    private Document getDocument(String documentId) { 
     return (dao.getByDocumentId(documentId)); 
    } 
} 

實施例2 - 服務B

public class ServiceB { 

    private SampleDAO dao = new SampleDAO(); 
    private static final String DRAFT_STATUS = "DRAFT"; 
    private static final String APPROVED_STATUS = "APPROVED"; 
    private static final String SUBMITTED_STATUS = "SUBMITTED"; 


    public Document getDocument(String documentId) { 
     return (dao.getByDocumentId(documentId)); 
    } 

    public boolean isDocumentApprove(Document doc) {  
     return (APPROVED_STATUS.equals(doc.getStatus())); 
    } 

    public boolean isDocumentDraft(Document doc) { 
     return (DRAFT_STATUS.equals(doc.getStatus())); 
    } 

    public boolean isDocumentSubmited(Document doc) { 
     return (SUBMITTED_STATUS.equals(doc.getStatus())); 
    } 

} 
+1

我沒有看到第二個例子的要點。如果調用者已經有一個Document實例,爲什麼它會調用一個服務來獲取文檔的狀態?爲什麼不簡單地執行'doc.isApproved()'? –

+0

調用者將檢索文檔並將其傳遞給相應的方法以檢查文檔的狀態等。 – youcanlearnanything

+0

我明白這一點。但這不必要的複雜。如果您有文檔,請直接通過調用文檔中的方法來獲取其狀態,而不是在服務上調用其他方法。 –

回答

1

如果我不得不選擇,我會選第二示例中,因爲它含有較少的代碼重複。在第一種方法中,每種方法都有相同的Document doc = getDocument(documentId);聲明。所以,這裏的一般原則是「不要重複你自己」。

此外,在第一個版本中,您可以將任何垃圾作爲字符串傳遞給方法。雖然您也可以在第二個版本中傳遞null,但檢查null比檢查無效的id更容易。

0

取決於您的API的目標。

是否來電總是DocumentID從未一個Document實例?

  • ServiceA是要走的路(抽象Document實例並僅返回狀態)。

是否來電有時DocumentID有時一個Document實例?

  • ServiceB是您提供呼叫者獲取文檔或獲取狀態的能力的途徑。
  • 在這種情況下,您最好修改Document類以包含getStatus()方法。這樣,如果調用者有Document實例,他們可以撥打document.getStatus()而不是調用您的服務。