服务层的API设计

时间:2013-01-31 12:11:49

标签: java api oop design-patterns

我是一名新手程序员,学习如何为我的模块设计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()));
    }

}

2 个答案:

答案 0 :(得分:1)

如果我必须选择,我会选择第二个例子,因为它包含较少的代码重复。在第一个中,每个方法都有相同的Document doc = getDocument(documentId);语句。所以,这里的一般原则是“不要重复自己”。

此外,在第一个版本中,您可以将任何垃圾作为字符串传递给方法。虽然您也可以在第二个版本中传递null,但检查null是否比无效ID更容易。

答案 1 :(得分:0)

取决于您的API的目标。

来电者总是是否有DocumentID从不 Document个实例?

  • ServiceA是可行的方式(抽象Document实例并仅返回状态)。

来电者有时是否有DocumentID有时 Document个实例?

  • ServiceB是一种可行的方式,因为您可以为调用者提供获取文档或获取状态的权限。
  • 在这种情况下,您最好修改Document课程以包含getStatus()方法。这样,如果来电者有Document个实例,他们可以拨打document.getStatus()而不是致电您的服务。