23

私は C# を初めて使用し、C# アプリケーションを維持する必要があります。これで、32 個のパラメーターを持つメソッドが見つかりました (自動生成されたコードではありません)。

C/C++ の経験則である "4 つのパラメーター" を覚えています。これは、古い 0x86 コンパイラに根ざした昔ながらのルールである可能性があります。この場合、4 つのパラメータをレジスタ (高速) またはスタックに格納できます。

パフォーマンスは気にしていませんが、C# でも関数ごとに 32 個のパラメーターを維持するのは容易ではないと感じています。

または、私は完全に最新ではありませんか?

C# の経験則は何ですか?

ヒントをありがとう!

4

11 に答える 11

23

一般的なコンセンサスはなく、誰に尋ねるかによって異なります。

一般に、読みやすさが損なわれる瞬間は、多すぎます...

Bob Martin は、パラメーターの理想的な数は 0 であり、3 はそれを引き延ばしていると述べています。

32個のパラメータは大量のコード臭です。これは、クラスにあまりにも多くの責任があり、リファクタリングが必要であることを意味します。パラメータオブジェクトのリファクタリングを適用しても、問題を解決するのではなく、悪い設計を隠すように思えます。

今週のきれいなコードのヒント #10から:

関数には少数の引数が必要です。最適な引数はなく、1、2、3 が続きます。3 つ以上は非常に疑わしいので、偏見を持って避ける必要があります。

于 2012-09-14T21:08:25.730 に答える
9

うーん、32個のパラメータは多すぎます。私が推測する人々と同じくらい多くのルールがあります。ただし、常識的には、6 を超えると扱いにくくなります。

非常に多くのパラメーターがある場合は、オブジェクトを単一のパラメーターとして渡し、パラメーターをプロパティとして持つ方が常に優れています。少なくとも読みやすくなります。

于 2012-09-14T21:08:13.603 に答える
5

C#は、パラメーターの最大数を制限しません、AFAIK。
しかし、ILは次のことを行います:0x1FFFFFFF。

もちろん、この投稿は、大量のパラメーターを使用してメソッドを作成するためのガイドではありません。

于 2012-09-14T21:11:49.860 に答える
4

開発者コミュニティの一般的な感覚は、最大で 5 つまたは 6 つのパラメーターであると思います。あなたのようなメソッドを見たことがありますが、「SaveCustomer」のようなことをして、顧客オブジェクトを渡す代わりにすべてのフィールドを渡す人です。

于 2012-09-14T21:08:28.520 に答える
2

これに対する特効薬の答えはありません。すべてはあなたと開発グループ次第です。パラメーターの数は 32 のような数値にも到達する可能性があり、これが設計の悪さを考えることにつながる場合もありますが、これはキャリアの中で遭遇する可能性のあるものです。

これに関する一般的な合意は、

  • 可能な限り使用しない
  • オーバーロードされた関数を使用して、異なる関数間でパラメーターをスライスします

    func A(a,b)
    {
        A(a,b,c);
    }
    
  • キーワードを使用paramsして、任意の情報を配列で渡すことができます。object[]

  • Key-value多くの情報を保持して復元できるストアを使用できます

一般的に、code-line質問の件名に厳密に関連していなくても、エディターで水平方向にスクロールする必要があるほど長くする必要はありませんが、それについていくつかのアイデアにつながる可能性があると彼らは言います.

お役に立てれば。

于 2012-09-14T21:14:48.163 に答える
1

今日、最も重要なことは、パフォーマンスではなく、人間の読みやすさだと思います。とにかく.NETに同様のパフォーマンス動作が存在するかどうかは疑わしいですが、存在したとしても、パフォーマンスがわずかに速いコードよりも正しいコードの方がはるかに便利ですが、それは間違ったことをします。わかりやすくすることで、コードが正しい可能性が高くなります。

ほとんどの場合、少数のパラメーター(私の経験では5を超えることはめったにありません)が最適です。メソッドが後で呼び出されるクラスのプロパティの形式でパラメーターを提供することにより、これ以上を必要とするコードのリファクタリングを検討できます。

于 2012-09-14T21:11:48.763 に答える
1

メソッドごとにゼロから最大5つのパラメーターを持つのは楽しいと思います。しかし、これはコーディングスタイルやクラスデザインなど、さまざまなものに依存します。

.NET Frameworkを見ると、次のことがよくわかります。

  • パラメータがほとんどまたはまったくないメソッドを持つクラスですが、クラスの動作を制御するためにプロパティをほとんど使用しません(30個のパラメータではありません)。

  • パラメータがほとんどまたはまったくなく、プロパティがほとんどない、メソッドの膨大なセットを持つクラス。例:BinaryReader

パブリックAPIはできるだけシンプルにしてください。パラメータが少ないと、他の開発者が「どのように機能するか」について多くを学ぶことなくクラスを使用するのに役立ちます。コードを読みやすくします。

于 2012-09-14T21:37:00.630 に答える
1

単一のパラメーターとして渡されるオブジェクトを作成することで、別のアプローチを取ることができますか?

私はパラメーターの経験則を持っていませんが、通常は常識と実用性が優先されます。

于 2012-09-14T21:08:00.093 に答える
1

この質問は議論の余地があるとして締めくくられると思いますが、32 は明らかに多すぎます。

1 つのオプションは、ビルダーのパターンを調べることです。これにより、少なくともタスクが読みやすくなります。

于 2012-09-14T21:09:02.440 に答える
1

Valentin さんの気持ちは正しいです。32 個のパラメーターは 1 つだけを意味します。何かが完全に間違っています。C++ での私の過去の経験から、「パラメーター」リーダーは 1 つだけでした。
それは、11 個のパラメーターを持つ Win32 API CreateWindow でした。
このような膨大な量のパラメーターを決して使用しないでください。

一方で、理論的な観点からの質問に興味がある場合(おそらく面接で質問される可能性があります) - メソッドにはいくつのパラメーターが許可されますか?
したがって、ここで前述したように、C# メソッドは 0x1FFFFFFF を超えるパラメーターを持つことはできません (IL 制限)。
params[] 配列を使用して、このような膨大な数を設定できます。

そして、なぜそのような制限が正確にあるのですか?
この値をバイトに変換し、参照サイズ (4 バイト) で倍数にすると、正確に 2 GB を受け取るためです。
.NET のすべてのオブジェクトには 2 GB の制限があり、2 GB を超えるオブジェクトを 1 つ作成することはできません。

于 2012-09-14T23:20:02.937 に答える
0

私の知る限り、いくつのパラメーターを指定する必要があるかについて、明確な規則はありません。それはあなたが何をしているかに完全に依存します。

ただし、ほとんどのアプリケーションでは、32 個のパラメーターは少し多すぎるように思えます。設計が悪いことを示している可能性があります。よく見ると物事を単純化する方法があるかもしれません。

于 2012-09-14T21:09:57.697 に答える