7

重複の可能性:
パラメータが多すぎますか?

いくつかの値を受け取る関数を書いていたところ、考えさせられました。関数/メソッドの引数の数が多すぎるのはいつですか? 設計に欠陥があることを示すのはいつですか? 引数の量を減らすために、構造体、配列、ポインターなどを受け取る関数を設計/リファクタリングしますか? 引数の数を減らすためだけに、入ってくるデータをリファクタリングしますか? ただし、これは OOP 設計にはあまり当てはまらないようです。他の人がこの問題をどのように見ているかを知りたいだけです。

編集:参考までに、私が書いたばかりの関数は5つのパラメーターを取りました。AP Econ の先生から教えてもらったいくつかの定義を使用します。2 以上; 7未満。

4

15 に答える 15

18

わかりませんが、見ればわかります。

于 2008-11-25T21:51:23.337 に答える
16

Code CompleteのSteve McConnell によると、

ルーチンのパラメーターの数を約 7 つに制限する

于 2008-11-25T21:51:18.393 に答える
8

あなたが尋ねなければならないなら、それはおそらく多すぎます.

于 2008-11-25T22:21:35.070 に答える
4

私は一般的に、パラメーターが機能的に関連している場合 (座標や色成分など)、適切な手段としてクラスとしてカプセル化する必要があると考えています。

私が常にこれを自分でフォローしているわけではありません;)

于 2008-11-25T21:56:43.920 に答える
2

Robert C. Martin (Uncle Bob) は、 Clean Code: A Handbook of Agile Software Craftsmanship で最大 3 つを推奨しています。

現時点では本を持っていませんが、彼の推論は、1 つ、2 つ、そしてそれほどではありませんが 3 つの引数関数をよく読み、関数の目的を明確に示していることに関係しています。

もちろん、これは、 Single Responsibility Principalに準拠した、非常に短い名前の付いた関数の彼の推奨事項と密接に関連しています。

于 2008-11-25T22:51:34.857 に答える
1

簡単な答え: 立ち止まってその質問をしなければならないときは、多すぎます。

個人的には、この数を 6 未満に抑えるのが好きです。さらに必要な場合、解決策は問題によって異なります。1 つのアプローチは、「セッター」関数を使用して、目的の関数を最終的に実行するオブジェクトに値を与えることです。あなたが言及したように、別のオプションは構造体を使用することです。いずれにせよ、あなたは本当に間違って行くことはできません。

于 2008-11-25T21:51:29.483 に答える
1

「多すぎる」と見なされる数に関しては、関数が何をしているかに依存することは間違いありません。そうは言っても、関数内で特定のケースを処理する方法に関するオプションである多くの異なるパラメーターを持つ関数を持ち、それらのオプションの適切なデフォルト値を持つ関数へのオーバーロードを持つことは確かに可能です。

Intellisense (または他の IDE の同等のもの) の普及と、Visual Studio の XML ドキュメントからのコメントを示すツールヒントを考えると、この質問に対する明確な答えがあるとは思えません。

于 2008-11-25T21:53:22.133 に答える
1

パラメータが多すぎるのは「コードの匂い」です。

複数のメソッドに分割するか、クラスを使用して、共通点を持つ変数を再グループ化できます。

「多すぎる」に数字を付けるのは非常に主観的なものであり、組織と使用する言語に依存します。経験則として、メソッドの署名を読み取れず、それが何であるかがわからない場合は、情報が多すぎる可能性があります。個人的には、5 つのパラメーターを超えないようにしています。

于 2008-11-25T21:54:36.530 に答える
0

そしてプログラミング言語にもよります.Cでは、7つのパラメータを持つ関数を見ることは本当に珍しくありません..しかし、C#では、私はめったに5つ以上のパラメータを見たことがなく、私は通常3つ以下のパラメータを使用します.

// In C 
 draw_dot(x, y, size, red, green, blue, alpha)

// In C# 
 Point point(x,y);
 Color color(red,green,blue,alpha);

 Tool.DrawDot(point, color);
于 2008-11-25T22:57:33.843 に答える
0

7という数字も聞いたことがありますが、なんとなく、原始的な価値観が通用し放題だった時代に由来するような気がします。

最近では、複雑な状態 (および動作) をカプセル化するオブジェクトへの参照を渡すことができます。7枚使うとさすがに多すぎます。

私の個人的な目標は、4 つ以上の使用を避けることです。

于 2008-11-25T22:42:10.957 に答える
0

引数の型に大きく依存します。それらがすべて整数の場合、2 は多すぎる可能性があります。(順序を覚えるにはどうすればよいでしょうか?) null を受け入れる引数がある場合、数は大幅に減少します。

本当の答えは、次のように自問することから得られます。

  • コードを読んでいるときに呼び出しを理解するのはどれくらい簡単ですか?
  • コードを書くときに正しい引数と引数の順序を覚えるのはどれくらい簡単ですか?
于 2008-11-25T22:51:03.827 に答える
0

私にとっては5です。

それ以上の管理(名前、順序などを覚える)は難しいです。さらに、そこまで来たら、これを呼び出すデフォルト値のバージョンがあります。

于 2008-11-25T21:57:54.590 に答える
0

関数にも依存します。関数がユーザーの介入や変数を大量に必要とする場合、7 ~ 8 の範囲を超えることはありません。使用するパラメーターの平均数に関しては、私の意見では 5 ~ 6 がスイート スポットです。それ以上を使用している場合は、クラス オブジェクトをパラメーターまたはその他の小さな関数と見なすことができます。

于 2008-11-25T21:58:56.053 に答える
0

それは人によって異なります。個人的には、コード内の呼び出しを読んで関数呼び出しが何をしているのかをすぐに理解できない場合は、灰色のセルの負担を取り除くためにリファクタリングするときです。

于 2008-11-25T22:13:34.683 に答える
-1

私は最大 4 と言うでしょう。上記のものは、クラス内に配置する必要があると思います。

于 2008-11-25T21:50:22.763 に答える