Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 服务层的API设计_Java_Api_Oop_Design Patterns - Fatal编程技术网

Java 服务层的API设计

Java 服务层的API设计,java,api,oop,design-patterns,Java,Api,Oop,Design Patterns,我是一个新手程序员,学习如何为我的模块设计API。我想到了两种类型的服务类来为其他类提供API 第一个示例通过参数处理逻辑,第二个示例通过对象方式处理 对于我来说,哪种方法/设计更适合提供业务方法供其他类使用 作为一般的经验法则,我应该使用哪一种 示例1-服务A public class ServiceA { private SampleDAO dao = new SampleDAO(); private static final String DRAFT_STATUS =

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

}

如果必须选择,我会选择第二个示例,因为它包含较少的代码重复。在第一个文档中,有相同的
documentdoc=getDocument(documentId)语句。因此,这里的一般原则是“不要重复你自己”


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

取决于API的目标

调用者是否总是有
文档ID
,而从来没有
文档
实例?

  • ServiceA是一种方式(抽象
    文档
    实例,只返回一个状态)
调用者有时是否有
DocumentID
,有时是否有
Document
实例

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

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