5

私が1日に1回呼び出す関数があります:

new SubmitLogs().mail(IP, date_time_UTC, date_time_IST , pageVisited , userCountry , userRegion , city , userAgent);

関数の引数は増え続けます。最初は次のようでした:

new SubmitLogs().mail(IP, date_time_UTC, userAgent);

そして今、それはさらに5つの引数を持っています。1週間でより多くの引数が含まれると予想されますが、今はこれが好きではありません。非常に多くの引数を持つ関数を維持することは、私にとって良いことではないようです。これに対する回避策はありますか?関数が大きくなり続ける場合は、50個の引数を関数に送信したくありません。呼び出しは、短いメッセージと短い件名で引数の詳細を電子メールで送信します。

4

6 に答える 6

10

本当に2つのオプションがあります

  1. いくつかのパラメータを1つのオブジェクトにグループ化してみてください。これにより、類似したものが一緒にカプセル化されます。たとえば、userRegion、userCountry、cityを一緒にLocationオブジェクトに入れることができます

  2. あるいは、Builderパターンが適切です。JoshBlochのEffectiveJavaには、優れた章があります。

于 2012-09-13T10:24:50.493 に答える
3

これは次のように聞こえます:

  1. カプセル化の問題。引数を1つ以上の論理的コヒーレントオブジェクトにグループ化します
  2. スコープの問題。あなたの方法はやりすぎですか?または、このインスタンスタイプの情報は、含まれているオブジェクトで構成できます。

私の友人はかつて私に言った。

関数に10個の引数がある場合、それは通常、別の5個の引数を忘れたことを示しています。

于 2012-09-13T10:29:33.047 に答える
1

関連するオブジェクトのグループを表すには、さらに多くのオブジェクトが必要なようです。

new SubmitLogs().mail(IP, date_time_UTC, date_time_IST , pageVisited , userCountry , userRegion , city , userAgent);

出てくるのを待っているオブジェクトがいくつかあるようです。

public class UserLocation { 
    private string userCountry; 
    private string userRegion;
    private string city;
    // ...
}

今、あなたはそれを少し単純化しました

new SubmitLogs().mail(IP, data_time_UTC, date_time_IST, pageVisited, userLocation, userAgent);

あなたのドメインはわかりませんが、他のデータグループを見つけてこれらをまとめることができるかもしれません。

データをまとめると、メソッドが自然にそれらのクラスに移動し始めることがあります。たとえば、UserLocationには、その情報をストリームに書き出すメソッドがある場合があります。

于 2012-09-13T10:27:47.510 に答える
0

値オブジェクトを作成し、代わりにその値オブジェクトを渡します。リモート呼び出しなどの場合は、Serializableを実装することを忘れないでください。

class MailParams {

    String ip;
    String dateTimeUTC;
    String dateTimeIST;
    // .... and so on
}
于 2012-09-13T10:27:11.350 に答える
0

このメソッドへの引数として電子メールを送信するために必要な必須パラメーターのみがあり、すべてのオプションパラメーターはマップを介して提供されます。このマップのキーは、可能なオプションパラメーターとそのタイプのリストを含む列挙型になります。 valueは、特定の呼び出しに対するそのプロパティの値です。

new SubmitLogs().mail(sender, receiver, subject, body, ImmutableMap.<SubmitLogMailParams, Object>of(<param1>, <value1>, <param2>, <value2>, ...);
于 2012-09-13T10:27:52.357 に答える
0

メソッドのさまざまな実装を提供します。mail()に3つのパラメーター、mail()に10のパラメーターなどを指定して、最適なものを使用できるようにします。

于 2012-09-13T10:27:57.427 に答える