一つの危険性params
キーワードは、場合された後、メソッドの呼び出しは、符号化されました
- 誰かが誤って/意図的にメソッドシグネチャから1つ以上の必須パラメータを削除し、
- 署名の変更前のパラメーターの直前の1つ以上の必須パラメーター
params
は、params
パラメーターとタイプ互換でした。
これらの呼び出しは、オプションのパラメーターとして扱われる必要なパラメーター用に以前は意図されていた1つ以上の式でコンパイルを続けますparams
。私はこの最悪のケースに遭遇しました:params
パラメータがタイプobject[]
でした。
開発者は、必要なすべてのパラメーターを使用してパラメーターがメソッドから削除される、はるかに一般的なシナリオでコンパイラーが手首を叩くのに慣れているため、注目に値します(予期されるパラメーターの数が変化するため)。
私にとっては、ショートカットの価値はありません。 (Type)[]
without params
は、オーバーライドを必要とせずに0から無限のパラメーターで機能します。最悪の場合は、, new (Type) [] {}
適用されない場所にをCalls に追加する必要があります。
ところで、imho、最も安全な(そして最も読みやすい習慣)とは:
名前付きパラメーターを介して渡す(VB; Pで実行可能になった後、C#で約20年後でも実行できる)(理由:
1.1。これは、パラメーターの順序付け、パラメーターの互換性タイプ、および/または呼び出しがコーディングされた後のカウント変更の後にパラメーターに渡される意図しない値の防止を保証する唯一の方法です。
1.2。それが軽減新しい意味を反映した可能性の高い新しい識別子名は、右隣に渡される値になるため、パラメータの意味変化の後、それらのチャンスを、
1.3。カンマを数え、呼び出しから署名に前後にジャンプして、どのパラメーターにどの式が渡されているかを確認する必要がなくなり、
1.3.1。ちなみに、この理由だけはする必要がありますたくさん(ただしDRY原則を頻繁にエラーが発生しやすい違反を回避する観点から読みも言及しないようにコードを修正し、それを)が、この理由は、することができ、指数関数的に 1が存在する場合より重要/渡される式自体にコンマが含まれている(つまり、多次元配列参照またはマルチパラメーター関数呼び出し)。その場合、エディターの選択機能ですべてのオカレンスを検索して、コンマのカウントを自動化することはできます(可能な場合でも、メソッド呼び出しごとにパラメーターごとに追加のステップを追加します)。
1.4。オプションパラメータを使用する必要がある場合(params
またはそうでない場合)、特定のオプションパラメータが渡された(したがって、そうではないか、少なくともデフォルト値ではない可能性がある)コールを検索できます。
(注:理由1.2。および1.3。は、最初の呼び出しをコーディングした場合でも、呼び出しを読み取ったり変更したりする必要がある場合は言うまでもなく、エラーの可能性を軽減および減らすことができます。)
そして
そうするONE-PARAMETER-PER-LINEは読みやすくするためです(なぜなら:
2.1。散らかりが少なく、
2.2。右と左にスクロールする必要がありません(そしてPER-LINEを実行する必要があります。ほとんどの人間は複数行の左側を読み、右側にスクロールして右側を読むことができないためです)。
2.3。渡されたすべてのパラメーターは本質的に割り当てステートメント(値またはローカル変数への参照の割り当て)であるため、これは割り当てステートメントのためにすでに発展した「ベストプラクティス」と一致しています。コーディングスタイルの最新の「ベストプラクティス」に従う人が1行に複数の割り当てステートメントをコーディングすることを夢見ないのと同じように、私たちはおそらくそうすべきではありません(「ベストプラクティス」が私の「天才」に追いつくことはありません; P )パラメータを渡すときに行います。
注:
名前がパラメータを反映する変数を渡しても、次の場合は役に立ちません。
1.1。リテラル定数(つまり、「ベストプラクティス」でも名前付き定数を使用する必要がない単純な0/1、false / trueまたはnullを渡していて、その目的がメソッド名から簡単に推測できない場合) )、
1.2。メソッドが大幅に低レベル/呼び出し元よりも汎用的であるため、変数にパラメーターと同じ/類似の名前を付けたくない(またはその逆)、または
1.3。あなたのしている再整列/種類があるため、まだコンパイル前にコールをもたらす可能性が署名にパラメータを置き換える起こるまだ互換性があります。
VSのような自動折り返し機能を使用しても、上記で説明した8つの理由の1つ(#2.2)しか削除されません。VS 2015までは、自動インデントが行われていなかったため(!?!本当に、MS?!?)、理由#2.1の重大度が高くなっています。
VSには、名前付きパラメーターを使用してメソッド呼び出しスニペットを生成するオプション(もちろん1行に1つずつ; P)と、名前付きパラメーターを必要とするコンパイラーオプション(概念的にはVBのOption Explicitに類似していますが、その要件は多分かつて考えられていました)同様にとんでもないですが、今では「「ベストプラクティス」」によって多用されています。実際、「私の中に戻って日」;)、1991年に私のキャリアのわずか数か月前に、名前付きパラメーターを持つ言語を使用していた(または見たことがなかった)場合でも、私はアンチシープルを使用していました/「ただできる、という意味ではありません」 /「ローストの終わりを切る」という感覚を盲目的に「ローストの終わりをカットする」のではなく、インラインコメントを使用して、誰かがそうするのを見たことがないようにします。名前付きパラメーターを使用する必要はありませんソースコードのキーストローク)は、これらの構文のほとんどが始まっパンチカードの時代の遺物である。可読性が非常にある近代的なハードウェアとIDEのとはるかに複雑なソフトウェアとそのための言い訳はありません、多くの、MUCHより重要。「コードは書かれるよりもずっと頻繁に読まれる」。自動更新されていないコードを複製しない限り、保存されたすべてのキーストロークは、誰か(自分でも)が後でコードを読み取ろうとすると、飛躍的にコストがかかる可能性があります。