以前のやり方に固執すると思います。あなたの例のパラメータの数は多くありませんが、代替案ははるかに恐ろしいです。
マップ-あなたが言及した効率性の問題がありますが、ここでより大きな問題は次のとおりです。
- 呼び出し元は、何
も参照せずに何を送信するかわからない...どのキーと
値が使用されているかを正確に示す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を不必要に広範囲に採用すると、生成される重複コードが大量に発生するため、メンテナンスの面で長期的にマイナスの影響があります。コードの数が多いほど、維持する必要のあるコードが多くなり、維持に多くの時間と費用がかかります。