为了账号安全,请及时绑定邮箱和手机立即绑定

哪个更好,编写另一种方法还是向现有方法添加更多参数?

哪个更好,编写另一种方法还是向现有方法添加更多参数?

墨色风雨 2021-06-29 08:00:42
我有一个方法: public Question createQuestion(String text, Project project, User createdUser, Date createdDate)控制器正在使用此方法来创建问题。现在参数中没有标签。我想实现向问题添加标签的功能。要添加标签,我需要向它传递一个 tagSet,当用户在创建问题时未向问题添加标签时,该标签集也可以为空。那么,我应该再向它传递一个参数,然后if在将其添加到问题对象之前放置一个条件,还是应该编写一个单独的方法?public Question createQuestionWithTags(String text, Project project, User createdUser, Date createdDate,Set<Tag> questionTagSet) 它将调用createQuestion,然后questionTagSet在上述createQuestion()方法返回的对象中设置。如果我编写另一种方法,则检查空标签将在控制器中完成,如果没有,则该检查条件将在实用程序中进行。哪种方法更好?另外,在同一上下文中重载方法怎么样?
查看完整描述

3 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

这个问题可能有很多很好的答案,根据您的具体用例,请记住设计模式(有时反模式是合理的)、最佳实践等,这将使您的代码更好。


也就是说,Question应该有添加新标签的方法,因为它是具有tags属性的类(不是吗?)。您实施它的方式取决于您。它可能是这样的:


public class Question {

  // ...

  public void addTags(Set<Tag> questionTagSet) {

    this.tags.addAll(questionTagSet);

  //...

  }

}

这样,无论您有一个类型的对象,Question您都可以添加这样的标签:


//...

Set<Tag> tags = new HashSet<>();

Question q = new Question();

q.addTags(tags);

//...

从这一点来看,我认为没有“最佳”选择,而是“适合您的用例的最佳选择”。因此,一种选择是重载(有关详细说明,请参阅下面的方法重载),另一种选择是新方法(当然具有不同的签名)。


方法重载:一种方法接收所有参数,另一种方法接收所有参数,但是questionTagSet,在该方法中,您只能通过提供默认值来调用接收所有参数的方法:null。现在,在接收questionTagSet参数的Question#addTags方法中,如果questionTagSet参数不是 ,您将调用该方法null。这将允许您使用相同的方法签名,但具有来自控制器的不同参数。因此,您不必检查每个控制器(可能很多),因为您只将检查移动到一个地方:createQuestionWithTags方法。


像这样的东西:


带有所有参数的方法,但 questionTagSet


public Question createQuestionWithTags(String text, Project project, User createdUser, Date createdDate) {

  return createQuestionWithTags(text, project, createdUser, createdDate, null);

}

带有所有参数的方法


public Question createQuestionWithTags(String text, Project project, User createdUser, Date createdDate,Set<Tag> questionTagSet) {

 Question q = new Question();

 //... some more additional logic here

 if (questionTagSet != null) { //<- logic for adding tags moved here

    q.addTags(questionTagSet);

 }

 return q;

}

如果您想对questionTagSet参数进行一些检查,则此实现可能会有所不同。

这样做的优点:

  • 您可以createQuestionWithTags以不同的方式从不同的控制器调用该方法,而无需担心questionTagSet参数:

    1. utility.createQuestionWithTags("", new Project(), new User(), new Date(), new HashSet<Tag>())

    2. utility.createQuestionWithTags("", new Project(), new User(), new Date(), null)

    3. utility.createQuestionWithTags("", new Project(), new User(), new Date())

缺点

  • 重载有时会很棘手且令人困惑

  • 在进行单元测试时,您需要确定正在测试哪种方法,因为签名几乎相同。


查看完整回答
反对 回复 2021-07-07
  • 3 回答
  • 0 关注
  • 125 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信