MartinのClean Codeで言及されている出力引数とは何ですか?


14

Robert C. Martin's Clean Code:A Handbook of Agile Software Craftsmanshipの45ページで、Martinは出力引数を避けるべきであると書いています。「出力引数」の意味と、それらを避けるべき理由を理解するのに苦労しています。

出力引数のMartinの例appendFooter(s);は、関数を呼び出しますpublic void appendFooter(StringBuffer report)。彼のコードの改善はreport.appendFooter();

コードコンテキストが不足していることが原因の可能性がありますが、出力引数の使用がコーディングの悪さと見なされる方法はわかりません。誰かが概念を説明したり、これを理解するためのコードの追加例を与えることができますか?

上記の原則により、次の関数も汚れたコードの例と見なされますか?

int[] numberArray = {3, 5, 7, 1};
sortArray(numberArray);

上記が出力引数を使用しないというマーティンの原則に違反する場合、フィールドとして配列を持つオブジェクトと、配列をソートするために呼び出すことができる関数を持つ方が良いでしょうか?

ObjectWithArrayField numberArray = new ObjectWithArrayField(3, 5, 7, 1);
numberArray.sort();

回答:


10

ボブマーティンは単に読みやすさについて話しています。

このappendFooter例の問題は、appendFooter(s)プログラムのどこかにコード行が見つかった 場合、その呼び出しが入力sとして取得され、どこかに追加されるのか、その関数の出力を取得するために渡されるのかがすぐにはわからないことです。確認するには、関数のドキュメントを確認する必要があります。ただし、のような呼び出しはその問題を回避します。今は何が起こるのかがより明確になりました。sreport.appendFooter()

ただし、Bob Martinは「出力引数を決して使用しない」とは言っておらず、「一般的には、コードをもう少し簡潔に保つのに役立つので、避けてください」と言っています。したがって、これは盲目的に従うべき、頭の痛い貨物カルト規則ではありません。

Sort標準の配列とコレクションのメソッドは少し異なります。持つsortようにメソッドを持つ、例えば、ビューの言語設計者の観点からいくつかの欠点を持っているでしょうメソッドに各標準配列データ型のメンバ関数をArray.sortJavaランタイムの外に、標準ライブラリでこれを維持することができます。ただし、場合によっては並べ替える必要がある個々のコレクションタイプを作成する場合は、sortそれを別のクラスに入れるよりも、メンバー関数として追加する方が良い考えかもしれません。


2
sortArray(numberArray)、もちろん、その場でソートnumberArrayします。それとも、のコピーを作成し、コピーをnumberArrayソートし、numberArrayまったく変更せずにソートされたコピーを返しますか?
8ビットツリー

@ 8bittree:それは本当ですが、それはここでの議論のポイントではありません- sort()コンテナのメソッドは、「出力引数」を使用せずにインプレースで機能することもできます。そのためsortArray(numberArray)、インプレースメソッドが「出力引数形式」を正当化する理由はまったくありません
ドックブラウン

1
私のポイントは、何sortArray(numberArray)をしているのか完全に明らかではないということでした。受け入れているのと同じ型を返さない場合は、明らかである可能性があります。その場合は、適切な位置になければなりませ。ただし、戻り値の型が表示されない場合、または戻り値の型が入力の型と一致する場合は、定義を確認しないと不明瞭になります。
8ビットツリー

1
@ 8bittree:わかりました、わかりました。答えからステークのステートメントを削除しました。ただし、メンバー関数を使用しても、記述した問題は消えません。「ソート」メンバー関数でさえ、そのように動作する可能性があります。
ドックブラウン

10

それは、関数から値を返すために予期しないメカニズムを使用することの問題です。これは通常、関数でのやりすぎや責任の不整合の結果です。関数の結果を伝える最善の方法は、戻り値を使用することです。それが自明であることを願っています。オブジェクト指向言語では、2番目に良い方法はオブジェクトを変更することです。

これらの2つのオプションの間には、関数の結果を伝えるための非常に多くの明確で明白な方法があります。クラスの責任を再調整して、変更を行う人が最初にデータを所有する必要があります。

1つの例外は、非常に汎用的なアルゴリズムです。たとえば、パブリックインターフェイスを使用して任意の種類のコンテナに一般的に適用できる場合、ソートアルゴリズムは、ソートするコンテナとは正しく分離されます。ワンショットappendFooter関数にはそのような言い訳はありません。

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