2008-10-22 17 views
2

J'utilise généralement les méthodes d'extension avec parcimonie. Quand je me sens obligé d'écrire une méthode d'extension, je veux parfois surcharger la méthode. Ma question est, quelles sont vos pensées sur les méthodes de vulgarisation appelant d'autres méthodes de vulgarisation? Mauvaise pratique? C'est mal, mais je ne peux pas vraiment définir pourquoi.Extensions C#

Par exemple, la deuxième méthode CaselessIs appelle la première:

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; 
} 

Serait-il plus approprié de ne pas le faire? L'inconvénient serait que cela viole 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; 
} 
+0

"CaselessIs" n'est pas un nom de fonction très intuitif. Je recommanderais peut-être de le changer en "CompareCaseless" –

+0

Aussi, vous voudrez peut-être changer le titre de cette question pour être un peu plus précis quant à ce que vous demandez. –

Répondre

9

Je dois dire que les contrôles SECS ici. Personnellement, je ne vois rien de mal avec une méthode d'extension appelant une autre méthode d'extension, surtout si cette autre extension est contenue dans le même assemblage. Tout-en-tout, les appels de méthode sont simplement traduits par le compilateur à partir de:

extended.ExtensionMethod(foo); 

à:

StaticType.ExtensionMethod(extended, foo); 

Je ne vois pas enchaînant problème deux méthodes statiques ensemble, donc transitive, je ne vois pas de problème avec l'enchaînement de deux méthodes d'extension.

3

Je ne vois pas de problème avec lui, le deuxième scénario, je pense se sent plus mal ....

1

je n'ai aucun problème avec elle, moi-même - mais, si elle vous fait vous sentir mieux, vous pourriez certainement utiliser la version statique à la place:

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

    return false; 
} 

Personnellement, dans cet exemple, je l'ai appelé CaselessMatches, et a eu l'appel singulier au pluriel ... mais c'est juste nitpicky, je suppose.

2

Parfaitement bien. Pourquoi devrait-il être faux? Lorsque vous définissez une méthode d'extension, vous ciblez implicitement le framework 3.0 (en fait, les extensions du compilateur des nouvelles langues). Il n'y a donc rien de mal à utiliser une autre extension pour faire le travail. En examinant les commentaires, il n'y a rien de mal avec une version, même si l'extension "other" se trouvait dans une autre bibliothèque, du moins pas dans le sens de "l'utilisation" d'une extension d'une autre. Les extensions ne sont qu'une fonctionnalité de syntaxe qui aide à mieux comprendre la logique sous-jacente du code, en ajoutant certaines opérations habituelles à une classe ... en réalité ce sont juste des appels masqués aux méthodes et de cette façon vous devez appliquer exactement la même restriction que vous utilisez avec des appels de méthode.

1

Je ne vois rien de mal à cela. Disons que vous créez une classe someClass.ToMySpecialString(). Pourquoi ne devriez-vous pas pouvoir le surcharger si someClass.ToString() a déjà plusieurs surcharges?