我的代码段如下:
public void execute(Parameters params) {
Long requestType = params.getRequestType();
// Based on the requestType the name of the project would be different
getName(requestType);
// Same as above
getDescription(requestType)
// Project here is a collection of different requests
Long projectId = createProject(name, description)
RequestContents requestContents = params.getRequestContents();
for(RequestContent requestcontent : requestcontents) {
Long requestId = createRequest(name, description, projectId);
updateRequest(requestId, requestContent1);
}
// Based on the requestType, mail content would differ
String mailContent = getMailContent(requestType, projectId)
sendMail(mailContent);
}
函数sendMail
,createProject
,createRequest
的输出取决于requestType
,因此这些函数最终会有多个if-else
条件。
为避免这种情况,对这个类进行建模的正确方法是什么?
答案 0 :(得分:3)
一种方法是创建一个抽象类AbstractRequest
,它有抽象方法sendMail
,createProject
等,然后有几个具体的子类RequestType1
RequestType2
等有sendMail
等不同的实现。我猜他们称之为策略模式。
答案 1 :(得分:1)
public class Sender {
public void sendMail(RequestType1 requestType, String mailContent) {
// some impl
}
public void sendMail(RequestType2 requestType, String mailContent) {
// some impl
}
public void sendMail(RequestType3 requestType, String mailContent) {
// some impl
}
}
然后
sender.sendMail(requestType, mailContent);
调用的实际方法是在运行时根据requestType
对象的类型确定的。看来不是“如果”。
您可以在本地简单地实现这些方法,但这会令人困惑并且难以阅读。最好将这个问题分成一个单独的类。
答案 2 :(得分:0)
如果requestType是一组有限的String值,则可以为它创建匹配的Enum。
enum RequestType{
type1,type2,...;
}
然后,您可以将if-else转换为更紧凑的switch-case:
switch (RequestType.valueOf(requestType)){
case type1:
....
break;
case type2:
...
break;
...
default:
}
从代码中,requestType很长,你可以直接打开它:
switch (requestType){
case type1:
....
break;
case type2:
...
break;
...
default:
}
答案 3 :(得分:0)
为什么不将if-else条件放在execute()方法本身中,并基于该调用其他方法并传递相关参数。这样您就可以创建sendmail,createproject,createrequest的通用函数。