覚えておくべき最も重要なことは、それらがルールではなくガイドラインであることです。
メソッドが単に引数を取る必要がある場合があります。+
たとえば、数字の方法を考えてください。または、add
コレクションのメソッド。
実際には、1でも、それは2つの数値を追加するために何を意味するのかℤで例えば、文脈に依存していると主張するかもしれません3 + 3 == 6
が、ℤ中| 5 3 + 3 == 2
ので、本当に加算演算子はかかるコンテキストオブジェクトのメソッドでなければなりません2 Aの引数を代わりに1つの引数を取る数値のメソッド。
同様に、2つのオブジェクトを比較するメソッドは、一方をもう一方を引数として取るメソッド、または2つのオブジェクトを引数として取るコンテキストのメソッドのいずれかでなければならないため、単に比較メソッドを使用するのは意味がありません引数が1つ未満。
そうは言っても、メソッドの引数の数を減らすためにできることがいくつかあります。
- メソッド自体を小さくします。たぶん、メソッドがそのような多くの引数を必要とする場合、それはやりすぎです?
- 欠落している抽象化:引数が密接に相関している場合、おそらくそれらは一緒に属していて、欠落している抽象化がありますか?(正規のテキストブックの例:2つの座標の代わりに
Point
オブジェクトを渡すか、ユーザー名とメールを渡す代わりにオブジェクトを渡しIdCard
ます。)
- オブジェクト状態:複数のメソッドで引数が必要な場合、オブジェクト状態の一部である可能性があります。一部のメソッドでのみ必要であり、他のメソッドでは必要でない場合、オブジェクトが多すぎて、実際には2つのオブジェクトである必要があります。
1つの方法は、引数を新しいクラスに抽出することですが、それは確かにクラスの爆発につながりますか?
ドメインモデルにさまざまな種類のものがある場合、コードはさまざまな種類のオブジェクトになります。それには何の問題もありません。
そして、それらのクラスは、いくつかの命名規則に違反する名前で終わる可能性が高い(「データ」または「情報」などで終わる)?
適切な名前が見つからない場合は、多すぎる引数をグループ化したか、少なすぎます。そのため、クラスのフラグメントだけがあるか、複数のクラスがあります。
別の手法は、複数の関数で使用される変数をプライベートメンバー変数にして、それらを渡さないようにすることですが、変数のスコープを拡張し、おそらく実際にそれを必要としない関数に対して開かれるようにします。
すべてが同じ引数で動作するメソッドのグループとそうでないメソッドのグループがある場合、それらは異なるクラスに属している可能性があります。
「たぶん」という言葉の使用頻度に注意してください。それがルールではなくガイドラインである理由です。たぶん、4つのパラメーターを使用したメソッドはまったく問題ありません!