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

我有一个方法: 


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()方法返回的对象中设置。如果我编写另一种方法,则检查空标签将在控制器中完成,如果没有,则该检查条件将在实用程序中进行。哪种方法更好?


另外,在同一上下文中重载方法怎么样?


墨色风雨
浏览 126回答 3
3回答

白衣染霜花

这个问题可能有很多很好的答案,根据您的具体用例,请记住设计模式(有时反模式是合理的)、最佳实践等,这将使您的代码更好。也就是说,Question应该有添加新标签的方法,因为它是具有tags属性的类(不是吗?)。您实施它的方式取决于您。它可能是这样的:public class Question {&nbsp; // ...&nbsp; public void addTags(Set<Tag> questionTagSet) {&nbsp; &nbsp; this.tags.addAll(questionTagSet);&nbsp; //...&nbsp; }}这样,无论您有一个类型的对象,Question您都可以添加这样的标签://...Set<Tag> tags = new HashSet<>();Question q = new Question();q.addTags(tags);//...从这一点来看,我认为没有“最佳”选择,而是“适合您的用例的最佳选择”。因此,一种选择是重载(有关详细说明,请参阅下面的方法重载),另一种选择是新方法(当然具有不同的签名)。方法重载:一种方法接收所有参数,另一种方法接收所有参数,但是questionTagSet,在该方法中,您只能通过提供默认值来调用接收所有参数的方法:null。现在,在接收questionTagSet参数的Question#addTags方法中,如果questionTagSet参数不是 ,您将调用该方法null。这将允许您使用相同的方法签名,但具有来自控制器的不同参数。因此,您不必检查每个控制器(可能很多),因为您只将检查移动到一个地方:createQuestionWithTags方法。像这样的东西:带有所有参数的方法,但 questionTagSetpublic Question createQuestionWithTags(String text, Project project, User createdUser, Date createdDate) {&nbsp; return createQuestionWithTags(text, project, createdUser, createdDate, null);}带有所有参数的方法public Question createQuestionWithTags(String text, Project project, User createdUser, Date createdDate,Set<Tag> questionTagSet) {&nbsp;Question q = new Question();&nbsp;//... some more additional logic here&nbsp;if (questionTagSet != null) { //<- logic for adding tags moved here&nbsp; &nbsp; q.addTags(questionTagSet);&nbsp;}&nbsp;return q;}如果您想对questionTagSet参数进行一些检查,则此实现可能会有所不同。这样做的优点:您可以createQuestionWithTags以不同的方式从不同的控制器调用该方法,而无需担心questionTagSet参数:utility.createQuestionWithTags("", new Project(), new User(), new Date(), new HashSet<Tag>())utility.createQuestionWithTags("", new Project(), new User(), new Date(), null)utility.createQuestionWithTags("", new Project(), new User(), new Date())缺点重载有时会很棘手且令人困惑在进行单元测试时,您需要确定正在测试哪种方法,因为签名几乎相同。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java