web-dev-qa-db-ja.com

拡張メソッドの命名規則

当社では、プログラミングを簡略化するために、いくつかのユーティリティメソッドを使用しています。

したがって、次の文字列拡張子があります。

public static bool IsNoE(this string s)
{
    return string.IsNullOrEmpty(s);
}

これは単に便宜上のものであり、この質問の意図は、そのような方法の意味や無意味について議論することではありません(維持、...)

問題は命名についてです。

一部の人々は、メソッドに次のように名前を付ける必要があると考えています。

public static bool IsNullOrEmpty(this string s)
{
    return string.IsNullOrEmpty(s);
}

最初の命名の引数は次のとおりです。

  • 書くために短くなければ、拡張を行うことは意味がありません。

2番目の命名の引数は次のとおりです。

  • このような拡張機能を追加する唯一の理由は、プログラミングフローをサポートするためだけです。 (変数を書き込んでから、カーソルを先頭に戻し、変数をstring.IsNullで囲みます)

では、なぜ他のバージョンよりも1つのバージョンを優先する必要があるのでしょうか。参照できる命名規則はありますか?

5
dasheddot

最初の命名は明らかに間違っています。証拠が必要ですか?次のコードは何をしますか?

if (this.ah == PcX.Def)
{
    this.Z.SecN.Coll();
}

2番目の命名は問題ありません。十分に明確ですが、長すぎません。これは.NET Frameworkで使用されるものなので、他の開発者が失われることはありません。

つまり、エイリアスは作成しないでください。テストや保守が必要な追加のコードを作成しますが、プロジェクトに役立つものはありません。

22

私は実際にNullOrEmpty(文字列に対して)と同様に使用します。 JoinWithString.Joinのエイリアス)。

最初の命名の引数は次のとおりです。

  • 彼らが書くのに短くなければ、拡張をすることは意味をなさないでしょう

拡張メソッドareStringクラスを明示的に参照する必要がないため、元の名前を保持している場合でも書き込みが短くなります。

String.IsNullOrEmpty(foo)
foo.IsNullOrEmpty()

短くないですか?

または私の場合:

foo.NullOrEmpty()

拡張メソッドの構文は、文字列がnot nullでも空でもないかどうかをテストするのにさらに便利です。

比較:

if (!String.IsNullOrEmpty(foo)) // double negation and not very readable, it's easy to miss the "!"

対:

if (foo.NotEmpty()) 

そうは言っても、私はIsNoEのような不可解な命名には100%反対です。

5
Konrad Morawski

マジ?メソッド名の入力は廃止されました-全員が入力しなければならなかった場合System.Windows.Media.TextFormatting.TextSource.GetTextEffectCharacterIndexFromTextSourceCharacterIndex彼らがそれを使うたびに、C#は死んだ言語になるでしょう。

幸い、IDEがこれのほとんどを自動的に実行するので、長さは関係ありません。ただし、明確にすることが重要なので、長いバージョンを使用してください。

私が作成する拡張メソッドは常に独自の名前空間に置かれ、通常は「Ext」で終わりが「ハンガリー語」になっているので、その拡張を明確に見ることができます(メソッドがどのクラスにのみ属しているかを知るために時間を費やしたくない場合)それがどのクラスにも属していないことを確認してください!このフォームを拡張機能に使用するために、インターフェース(I接頭辞付き)および例外(例外接尾辞付き)でうまく機能すると思います。

4
gbjbaanb