0

ファクトリパターンのコンストラクタがあります。私は多くのパラメータを渡しています。それをリファクタリングする方法。

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;
    }
 }
4

5 に答える 5

1

複数のセッターメソッドをオンにすることができserverFactory、それらを呼び出す前に呼び出す必要がありますgetResults

それらが呼び出されない場合はgetResults、例外をスローする必要があります。

シーケンスは次のようになります。

serverFactory.setServerDetails(servername, locale);
serverFactory.setCalendarDetails(day, week, month, vdate, yearmonthday, weekmonthday);
...
...
serverFactory.getResults(results);
于 2012-11-05T06:08:37.777 に答える
1

これらのすべてのパラメーターが使用されるすべてのコード(私が推測する)を表示していないため、わかりにくいです。

ただし、考慮すべき点がいくつかあります。

  • プリミティブ型の引数を値オブジェクトに置き換えます。これにより、どのパラメーターがどの位置で期待されるかがはるかに明確になります。

  • 複数の関連する引数を組み合わせて値オブジェクトを作成します。明らかと思われる1つの例は、upperLimit、endLimit(およびおそらくinc)であり、これらはIntervallと呼ばれるオブジェクトで終わる可能性があります。

  • ブール値を別の方法に置き換えます。多くの場合、ブール値はさまざまなアルゴリズムを実行するために使用されます。その場合は、ブール値を削除して、代わりに別のメソッドを作成してください。

  • まだ多くの、そして紛らわしい議論がある場合は、ビルダーパターンを使用することをお勧めします。これと次のブログ投稿が役立つかもしれません:http://blog.schauderhaft.de/2012/07/29/named-parameters-in-java/

于 2012-11-05T06:19:59.933 に答える
0

すべての文字列パラメーターを文字列化し、コンストラクターに分割します。しかし、私はあなたがそれをしている現在の方法をお勧めします。読みやすくなっています。

于 2012-11-05T06:00:05.587 に答える
0

非常に多くのパラメーターを送信する代わりに、Value Objectクラスを作成し、それをインスタンス化して、そのインスタンスをパラメーターとして送信することを検討してください。

于 2012-11-05T06:06:57.143 に答える
0

もう1つの方法のコードは、すべての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);

ある程度の単純化。

于 2012-11-05T06:12:58.403 に答える