Java 什么';将参数传递给服务方法的好方法是什么?整个对象还是它的一些参数?

Java 什么';将参数传递给服务方法的好方法是什么?整个对象还是它的一些参数?,java,jakarta-ee,design-patterns,Java,Jakarta Ee,Design Patterns,伙计们,我是JavaEE新手,现在正在设计服务层。我很困惑应该从我的控制器层传递给方法什么参数,整个对象?还是仅仅是它的基本参数 例如,如果我想创建一篇文章,下面是代码 第一条路 public void createArticle(Article article) { articleDAO.create(article); } 第二条路 public void createArticle(String title, String subtitle) { Article arti

伙计们,我是JavaEE新手,现在正在设计服务层。我很困惑应该从我的控制器层传递给方法什么参数,整个对象?还是仅仅是它的基本参数

例如,如果我想创建一篇文章,下面是代码

第一条路

public void createArticle(Article article) {
    articleDAO.create(article);
}
第二条路

public void createArticle(String title, String subtitle) {
    Article article = new Article();
    article.setTitle(title);
    article.setSubtitle1(subtitle);
    articleDAO.create(article);
}

所以请帮帮我,我该走哪条路?我很困惑,谢谢

那要看情况了。如果您认为在将来,
文章
类将扩展,并且可以有更多的字段,如
发布日期
作者
,等等,那么我认为最好采用第一种方法

public void createArticle(Article article) {
    articleDAO.create(article);
}

另外,使用第二种方法将增加代码中的行数。代码应该简短

我认为传递对象是一种很好的策略,尤其是当需要向方法传递大量变量时。与其传递所有这些变量,不如传递对象的实例来整理方法签名

服务层实现/专用于业务逻辑目的

两者都是有效的,没有任何伤害。他们工作。还要考虑到服务方法中有15个参数的情况。说到模式,我建议您改变数据传输的方式。通常,我们从客户机/其他to收到的都是DTO,服务层将它们转换为DAO可理解的实体,服务再次将它们转换回DTO,以进一步隐藏您的实际实体

public void createArticle(ArticleDTO dto) {
    Article article = new Article();
    // some business logic.
    article.setTitle(dto.getTitle());
    article.setSubtitle1(dto.getSubTitle());
   // more business may be.
    articleDAO.create(article);
}

似乎这两种方法都能正常工作。
想一想你以后想用这个方法做什么:

当您已经有一个文章实例时,检索参数是没有意义的(稍后可能还会有一个作者和更多的参数,因此您必须重新编写方法2的方法,而方法1仍然有效)

但是,如果您想创建关于方法调用的文章,那么最好使用方法2

因此,您可以看到:在大多数情况下,方法1更好,因为它更灵活。
试着用吻的原则:保持简单,愚蠢!(有些人可能知道KISS也叫“保持简短、简单”)


这个问题很好。实际上,你不能直接说哪种方法是好是坏,这取决于你必须在代码中满足的要求。让我们讨论每种方法


第一种方法

public void createArticle(Article article) {
    articleDAO.create(article);
}
public void createArticle(String title, String subtitle) {
    Article article = new Article();
    article.setTitle(title);
    article.setSubtitle1(subtitle);
    articleDAO.create(article);
}
通常,当我们需要 对象,当它被推送到另一个服务时或当我们几乎需要时 该对象的所有参数或我们需要的参数计数 那个物体太高了

第二种方法

public void createArticle(Article article) {
    articleDAO.create(article);
}
public void createArticle(String title, String subtitle) {
    Article article = new Article();
    article.setTitle(title);
    article.setSubtitle1(subtitle);
    articleDAO.create(article);
}
在第二个方法中,您通常通过此方法传递参数 当您只需要对象的某些参数而不需要 完整对象或参数的数量在小计数中,以便 对于开发人员来说,每次传递所有参数并不单调


您可以同时使用这两个参数,一个好的做法是不超过4或5个参数


更好的做法是使用DTO(数据传输对象,如文章类),因为它易于阅读,并为扩展新数据的功能提供了更好的支持。未来的你(或你的团队)会很感激避免重构你的代码

最后,您的问题是:您的控制器是应该创建结构化对象并将其传递给服务,还是应该在接收数据时将数据分别传递给服务

一般来说,尽可能快地传递结构化对象会产生比在方法中传递多个参数并等待下一层聚合对象更干净的代码。

想象一下这样一种方法:

public void createArticle(String title, String subtitle, String category, String authorFirstName, String authorLastName, etc...) {
  ....
}
这显然是笨拙和容易出错的。

出于何种原因,您希望控制器将每个信息单独提供给服务?
我至少看到了一种情况:当我们需要在创建
文章
对象之前应用规则检查,并且希望在服务层中执行此操作时。
但是,我们并不是被迫按照这个顺序来做的。我们可以使用
文章
实例检查
文章
规则。

就我个人而言,我认为没有什么好的理由延迟
文章
实例的创建

这似乎很好:

public void createArticle(Article article) {
    articleDAO.create(article);
}

选择一种方法,总体上保持一致。

在您的创建方法中,您正在传递对象,那么为什么不传递完整的对象,这样看起来会更漂亮、更干净。如果您想添加一些额外的字段,然后还可以使用对象上的setter,在调用create方法之前,您可以这样做。不要期望对此有明确的规则。@AmitK谢谢,所以最好在我的控制器层中构造完整的对象,对吗?@Kayaman lol,我似乎很期待一个所谓的最佳实践。我还注意到,在SpringMVC的@Controller类中,该方法可能包含一个名为“Model”的参数,它喜欢DTO吗?哦,对不起,也许我应该先用谷歌搜索一下。非常感谢@MarcusLin如果您使用的是Spring MVC,则控制器将为您提供DTO。我发现它非常无聊,需要反复调用setter,是否有自动映射工具?非常感谢。