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


10

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

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


最適化の観点からは、オプションのパラメーターを持つ方がより良いオプションです。
Maneet Puri 2012

回答:


12

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

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

あなたは8が必要ではないでしょうか?3つのオプションの引数abおよびcこれらの可能性:なし、a、b、c、ab、ac、bc、abc。それ2^nはさまざまなタイプのためのものですn!
Mark

0

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

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

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


これは質問の答えにはなりません。
アンディ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.