web-dev-qa-db-ja.com

オーバーロードまたはオプションのパラメーター

特定のパラメーターを受け取る可能性がある、または受け取らない可能性がある関数がある場合、関数をオーバーロードするか、オプションの引数を追加する方が良いですか?

それぞれに浮き沈みがある場合-いつそれぞれを使用しますか?

10
JNF

言語がそれらを適切にサポートしている場合(たとえば、該当する場合はタイプセーフ)、次の理由でオプションの引数を使用します。

  • それらはあなたの意図をよりよく伝えるので、あなたの関数のオーバーロードが何か違うことをすることを誰も疑わない(おそらくそれはとにかくすべきではない)。
  • 関数のオーバーロードがより包括的なものに委任する場合でも、維持するコードが少なくなります。後で関数の名前を変更する場合は、少なくとも3つの場所で行う必要があります(2つの定義+ 1つの呼び出し)。
  • コンパイラー(存在する場合)は、より小さなバイナリーを生成する場合があります。
  • オプションの引数は、少なくとも一部の言語ではより適切にスケーリングされます。組み合わせて照合する機能を備えた3つのオプションの引数が必要な場合はどうでしょうか。完全な柔軟性を実現するには、そのために6つのオーバーロードが必要です。
  • オブジェクトメソッドの場合、複数のオーバーロードはサブクラスでのオーバーライドの実装を大幅に妨げます。
12

コンストラクターの種類の状況を想定します。多くのオプションのある状況を防ぐために、流暢なビルダーパターンを選択することがよくあります。

たとえば、Ordering.natural().onResultOf(function).reverse().compound(Ordering.natural().onResultOf(function2))は、Guavaに実装されているFluent Builderインターフェースを呼び出す例です。

もちろん、今はビルダーの状態を保持するために別のオブジェクトが必要ですが、構築の動作と構築の動作を分離することで全体的な複雑さを軽減します。

0
Dibbeke