【问题标题】:API Design for Service Layer服务层API设计
【发布时间】:2013-01-15 12:55:39
【问题描述】:

我是一名新手程序员,正在学习如何为我的模块设计 API。我想到了 2 种服务类来提供 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()));
    }

}

【问题讨论】:

  • 我看不出第二个例子的重点。如果调用者已经有一个 Document 的实例,为什么还要调用一个服务来获取文档的状态呢?为什么不干脆做doc.isApproved()
  • 调用者将检索文档并将其传递给适当的方法以检查文档的状态等。
  • 我明白这一点。但它不必要地复杂。如果您有一个文档,请直接通过调用文档上的方法而不是调用服务上的其他方法来获取其状态。
  • 所有其他类重复相同的检查不是很重复吗?
  • 为什么总是调用doc.isApproved()而不是service.isApproved(doc)会太重复?

标签: java api oop design-patterns


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    取决于您的 API 的目标。

    调用者总是DocumentID从不Document实例吗?

    • ServiceA 是要走的路(抽象Document 实例,只返回一个状态)。

    调用者有时是否有一个DocumentID有时一个Document实例?

    • ServiceB 是您为调用者提供获取文档或获取状态的能力的方式。
    • 在这种情况下,最好修改Document 类以包含getStatus() 方法。这样,如果调用者有一个 Document 实例,他们就可以调用 document.getStatus() 而不是调用您的服务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-16
      • 2017-01-31
      • 1970-01-01
      • 2012-11-26
      • 1970-01-01
      • 1970-01-01
      • 2012-12-20
      • 2011-09-25
      相关资源
      最近更新 更多