オーバーロードされた関数を正しくチェーンする方法は?


8

次のように増加するオプションのパラメーター(およびオプションのパラメーターと任意の数のパラメーターを許可しない疑似言語)を取る関数があるとします。

function doStuff(Param a)
function doStuff(Param a, Param b)
function doStuff(Param a, Param b, Param c)

それらを単一の呼び出しに統合する良い方法は何ですか?2つのデザインを想像できます。

すべて落ちる:

function doStuff(Param a)
    doStuff(a, defaultB)

function doStuff(Param a, Param b)
    doStuff(a, b, defaultC)

function doStuff(Param a, Param b, Param c)
    // magic goes here
  • メリット:コードの重複が少なく、単一のデフォルトパラメータを簡単に変更できます。
  • 欠点:多くの関数呼び出しにより、スタックトレースが読みにくくなるか、役に立たなくなる可能性があります。

または、「最後の」関数を直接呼び出します。

function doStuff(Param a)
    doStuff(a, defaultB, defaultC)

function doStuff(Param a, Param b)
    doStuff(a, b, defaultC)

function doStuff(Param a, Param b, Param c)
    // magic goes here
  • 利点:新しい関数がチェーンに追加されても心配せず、関数呼び出しは多くありません。
  • 欠点:多くのコードの重複、特にデフォルト値。

私は何を考えなかったのですか?


1
「新しい関数が追加されました」(「新しいパラメータ」を意味しますか?)は、最初の例では難しくありません。最初の例で少し難しいのは、オプションを削除することです(ユーザーが両方aを指定するbか、どちらも指定しないようにするなど)。ところで、タイプミス:中間のオーバーロードの実装は、例間で同一である必要があります。

CodeReviewは実際のコードをレビューするためのものです。あなたは疑似コードを提示しているので、そこにはトピックではありません。
Winston Ewert 2012年

回答:


6

私は最初の方法を好みます。あらゆる場所でデフォルト値が重複する可能性があるため、保守性が大幅に低下する可能性があります。私は実際にその特定の問題に遭遇しました、そしてそれは悪夢でした。


2

1つ目は、スタックトレースの余分な2行ですが、それほど多くはありません。Javaでは、類似したメソッド名が原因でスタックトレースを読みにくくすることはありません。

とにかく、あまりにも多くのパラメーターを使用すると、コードの悪臭がする可能性があります。


ああ、メソッド/パラメーターの数は任意であると仮定します。
Bobby

0

私は2番目のパラダイムを選択します(「最後の」関数を直接呼び出す)。これは問題なく、いかなる種類の状態の操作も含まれないため、実際のコードの複製にはなりません。

また、複数のオーバーロードを提供することで実行していることは、オプションのパラメーターの錯覚を提供するための単なるトリックであることを理解するのにも役立ちます。このように見ると、「最後の」メソッドと「最後の」メソッドだけが実際の作業を行うことになっていることが明らかであるため、最後でないメソッド間の委任は無意味です。

個人的には、オプションのパラメーターをサポートするC#を使用しているため、この問題についてもう心配する必要はありません。したがって、これらをエミュレートするためにこのようなトリックを実行する必要がなくなります。

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