我有一个带有Factory模式的构造函数。我传递给很多参数。如何重构它。
ServerFactory serverFactory = new ServerFactory();
CalendarResults calResults= serverFactory.getResults(serverName,locale, Day, week,
month,vdate,results,uri, EmailShare, inc, upperLimit,
endLimit,exchWD, YearMonthDay,WeekMonthDate);
results=calResults.serverNameDay(serverName,locale, Day, week, month,vdate,
results,uri, EmailShare, inc, upperLimit, endLimit, exchWD, YearMonthDay);
public class ServerFactory {
public CalendarResults getResults(String serverName,String locale, String day,
String week, String month,
boolean vdate, ArrayList<CalendarOutput> results, String uri,
List<String> emailShare, int inc, int upperLimit,
int endLimit, NexWebDav exchWD, String yearMonth, boolean
weekMonthDate){
CalendarResults calresults=null;
if(serverName.equals("www.google.com")){
calresults=new Google();
}else{
calresults=new Exchange();
}
return calresults;
}
}
答案 0 :(得分:1)
您可以在serverFactory
上设置多个setter方法,并且必须在调用getResults
之前调用这些方法。
如果没有调用它们,getResults
应该抛出异常。
序列如下:
serverFactory.setServerDetails(servername, locale);
serverFactory.setCalendarDetails(day, week, month, vdate, yearmonthday, weekmonthday);
...
...
serverFactory.getResults(results);
答案 1 :(得分:1)
很难说,因为你没有显示使用所有这些参数的所有代码(我假设)。
但是有些事情需要考虑:
用值对象替换基本类型的参数,这使得在什么位置预期什么参数更清楚。
将多个相关参数组合到值对象。一个显而易见的例子是upperLimit,endLimit(也许是inc),它可能最终出现在一个名为Intervall的对象中。
用不同的方法替换布尔值。通常使用布尔值来执行不同的算法。如果是这样的话,那么布尔人就会采用单独的方法。
如果你还有许多人和令人困惑的论点,你可能想要使用Builder模式。以下博文可能会有所帮助:http://blog.schauderhaft.de/2012/07/29/named-parameters-in-java/
答案 2 :(得分:0)
对所有String参数进行字符串化并将它们拆分为构造函数。但我建议您采用当前的方式。它更具可读性。
答案 3 :(得分:0)
不要发送这么多参数,而是考虑创建一个Value Object类,将其实例化并将该实例作为参数发送。
答案 4 :(得分:0)
另一种方式代码是对所有String
类型参数使用String [],其位置交换很少,如下所示:
public CalendarResults getResults(boolean vdate, ArrayList<CalendarOutput> results,
List<String> emailShare, int inc, int upperLimit,
int endLimit, NexWebDav exchWD, boolean weekMonthDate,
String... stringParams){
//You may get your string params as
//stringParams[0] -> serverName
//stringParams[1] -> locale
//stringParams[2] -> day
//stringParams[3] -> week
//stringParams[4] -> month
//stringParams[5] -> uri
//stringParams[6] -> yearMonth
....
虽然您现在可以使用工厂模式,但只更改所有字符串类型参数都会移动到最后,例如。
CalendarResults calResults= serverFactory.getResults(vdate,results,
EmailShare, inc, upperLimit, endLimit,exchWD, WeekMonthDate,
serverName, locale, Day, week, month, uri,YearMonthDay);
某种程度的简化。