2

私は通常、拡張メソッドを非常に控えめに使用します。どうしても拡張メソッドを書かなければならないと感じたときは、メソッドをオーバーロードしたくなることがあります。私の質問は、他の拡張メソッドを呼び出す拡張メソッドについてどう思いますか? 悪い習慣?それは間違っているように感じますが、その理由を本当に定義することはできません.

たとえば、2 番目の CaselessIs メソッドは最初のメソッドを呼び出します。

public static bool CaselessIs(this string s, string compareTo)
{
    return string.Compare(s, compareTo, true) == 0;
}

public static bool CaselessIs(this string s, IEnumerable<string> compareTo)
{
    foreach(string comparison in compareTo)
    {
        if (s.CaselessIs(comparison))
        {
            return true;
        }
    }

    return false;
}

これをしない方が適切でしょうか?欠点は、DRY に違反していることです。

public static bool CaselessIs(this string s, string compareTo)
{
    return string.Compare(s, compareTo, true) == 0;
}

public static bool CaselessIs(this string s, IEnumerable<string> compareTo)
{
    foreach(string comparison in compareTo)
    {
        if (string.Compare(s, comparison, true) == 0)
        {
            return true;
        }
    }

    return false;
}
4

5 に答える 5

9

ここでは DRY がコントロールしていると言わざるを得ません。個人的には、拡張メソッドが別の拡張メソッドを呼び出すことに問題はないと思います。特に、他の拡張が同じアセンブリ内に含まれている場合はそうです。全体として、メソッド呼び出しはコンパイラによって次のように変換されます。

extended.ExtensionMethod(foo);

に:

StaticType.ExtensionMethod(extended, foo);

2 つの静的メソッドを連鎖させても問題は見られないので、推移的には、2 つの拡張メソッドを連鎖させても問題はありません。

于 2008-10-22T18:53:16.397 に答える
3

個人的には問題はないと思います.2番目のシナリオはもっと間違っていると思います....

于 2008-10-22T18:52:11.563 に答える
2

完全に正しい。なぜそれが間違っているのですか?

拡張メソッドを定義しているので、暗黙のうちに 3.0 フレームワーク (実際には新しい言語のコンパイラ拡張機能) をターゲットにしているので、別の拡張機能を使用して作業を行っても問題はありません。

コメントを確認すると、「他の」拡張機能が別のライブラリにあったとしても、少なくとも別の拡張機能を「使用する」という意味では、どのバージョンにも問題はありません。拡張機能は、コード間の基本的なロジックをよりよく理解するのに役立つ単なる構文機能であり、通常の操作をクラスに追加します...実際には、メソッドへのマスクされた呼び出しにすぎないため、使用するのとまったく同じ制限を適用する必要がありますメソッド呼び出しで。

于 2008-10-22T18:53:51.903 に答える
1

私自身は問題ありませんが、気分が良くなる場合は、代わりに静的バージョンを使用できます。

public static bool CaselessIs(this string s, IEnumerable<string> compareTo)
{
   foreach(string comparison in compareTo)
   {
      if (Extensions.CaselessIs(s, comparison))
      {
         return true;
      }
   }

   return false;
}

個人的には、この例では、私はそれを CaselessMatches と呼び、単数形を複数形と呼んでいたでしょう...しかし、それは些細なことだと思います。

于 2008-10-22T18:53:20.170 に答える
1

私はそれに問題はないと思います。someClass.ToMySpecialString() を作成するとします。someClass.ToString() にすでに複数のオーバーロードがある場合、なぜそれをオーバーロードできないのでしょうか?

于 2008-10-22T18:54:28.797 に答える