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
参数: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())
缺点
重载有时会很棘手且令人困惑
在进行单元测试时,您需要确定正在测试哪种方法,因为签名几乎相同。
添加回答
举报