私はあなたが前にそれをした方法に固執すると言うでしょう。あなたの例のパラメータの数は多くはありませんが、代替案ははるかに恐ろしいものです。
マップ-あなたが言及した効率の問題がありますが、ここでのより大きな問題は次のとおりです。
- 発信者は、他の何かを参照せずに何を送信すればよいかわかりません...
使用されているキーと値を
正確に示すjavadocsがありますか?
もしそうなら(これは素晴らしいことです)、たくさんのパラメーターを持つことも問題ではありません。
- 異なる引数タイプを受け入れることは非常に困難になります。入力パラメーターを単一の型に制限するか、Map <String、Object>を使用してすべての値をキャストすることができます。ほとんどの場合、どちらのオプションもひどいものです。
ラッパーオブジェクト-最初にラッパーオブジェクトを埋める必要があるため、これは問題を移動するだけです-メソッドに直接ではなく、パラメーターオブジェクトのコンストラクターになります。問題の移動が適切かどうかを判断するには、そのオブジェクトを再利用する必要があります。例えば:
使用しない:最初の呼び出しで1回だけ使用されるため、1行を処理するための追加のコードがたくさんあります...?
{
AnObject h = obj.callMyMethod(a, b, c, d, e, f, g);
SomeObject i = obj2.callAnotherMethod(a, b, c, h);
FinalResult j = obj3.callAFinalMethod(c, e, f, h, i);
}
それを使用するかもしれません:ここでは、それはもう少しすることができます。まず、3つのメソッド呼び出しのパラメーターを因数分解できます。それ自体で他の2行を実行することもできます...したがって、ある意味で状態変数になります...
{
AnObject h = obj.callMyMethod(a, b, c, d, e, f, g);
e = h.resultOfSomeTransformation();
SomeObject i = obj2.callAnotherMethod(a, b, c, d, e, f, g);
f = i.somethingElse();
FinalResult j = obj3.callAFinalMethod(a, b, c, d, e, f, g, h, i);
}
- ビルダーパターン-これは私の見解ではアンチパターンです。最も望ましいエラー処理メカニズムは、後でではなく、早期に検出することです。しかし、ビルダーパターンでは、必須パラメーターが欠落している(プログラマーはそれを含めるとは考えていませんでした)呼び出しは、コンパイル時から実行時に移動されます。もちろん、プログラマーが意図的にnullなどをスロットに入れた場合、それはランタイムになりますが、それでも早期にいくつかのエラーをキャッチすることは、呼び出しているメソッドのパラメーター名を見ることを拒否するプログラマーに対応するためのはるかに大きな利点です。多数のオプションパラメータを処理する場合にのみ適切であると思いますが、それでも、メリットはせいぜいわずかです。私はビルダーの「パターン」に非常に反対しています。
人々が考慮することを忘れている他のことは、これらすべてにおけるIDEの役割です。メソッドにパラメーターがある場合、IDEはほとんどのコードを生成し、何を提供/設定する必要があるかを示す赤い線が表示されます。オプション3を使用すると、これは完全に失われます。今ではそれを正しくするのはプログラマー次第であり、コーディングやコンパイル時に手がかりはありません...プログラマーはそれをテストして見つける必要があります。
さらに、オプション2と3は、不必要に広く採用された場合、大量の重複コードが生成されるため、メンテナンスの面で長期的な悪影響を及ぼします。コードが多ければ多いほど、維持する必要があり、それを維持するためにより多くの時間とお金が費やされます。