Tous,Est-ce que les méthodes d'extension masquent les dépendances?
Je voulais avoir quelques réflexions à ce sujet. Dernièrement, je suis de plus en plus un abonné de principes «puristes» DI/IOC lors de la conception/développement. Une partie de ceci (une grande partie) consiste à s'assurer qu'il y a peu de couplage entre mes classes, et que leurs dépendances sont résolues via le constructeur (il y a certainement d'autres façons de gérer cela, mais vous avez l'idée). Mon principe de base est que les méthodes d'extension violent les principes de DI/IOC.
J'ai créé la méthode d'extension suivante que j'utilise pour faire en sorte que les chaînes insérées dans les tables de base de données sont tronquées à la bonne taille:
public static class StringExtensions
{
public static string TruncateToSize(this string input, int maxLength)
{
int lengthToUse = maxLength;
if (input.Length < maxLength)
{
lengthToUse = input.Length;
}
return input.Substring(0, lengthToUse);
}
}
Je peux alors appeler ma chaîne à partir d'une autre classe comme ceci:
string myString = "myValue.TruncateThisPartPlease.";
myString.TruncateToSize(8);
une traduction fidèle de ce sans utiliser une méthode d'extension serait:
string myString = "myValue.TruncateThisPartPlease.";
StaticStringUtil.TruncateToSize(myString, 8);
Toute classe qui utilise l'un des exemples ci-dessus n'a pas pu être testée indépendamment de la classe qui contient la méthode TruncateToSize (TypeMock de côté). Si je n'utilise une méthode d'extension, et je ne voulais pas créer une dépendance statique, il ressemblerait plus:
string myString = "myValue.TruncateThisPartPlease.";
_stringUtil.TruncateToSize(myString, 8);
Dans le dernier exemple, la dépendance _stringUtil serait résolu par le constructeur et la classe pourrait être testé sans dépendance sur la classe de la méthode TruncateToSize (il pourrait être facilement moqué). De mon point de vue, les deux premiers exemples reposent sur des dépendances statiques (une explicite, une cachée), tandis que la seconde inverse la dépendance et fournit un couplage réduit et une meilleure testabilité.
L'utilisation de méthodes d'extension est-elle en conflit avec les principes DI/IOC? Si vous êtes abonné à la méthodologie du CIO, évitez-vous d'utiliser des méthodes d'extension?
Votre méthode d'extension ne vérifie pas l'entrée nulle! – canon
@antisanity: AFAIK il est logiquement impossible pour le paramètre d'instance d'une méthode d'extension (* input * dans ce cas) d'être nul. –
Oui, Phil ... ça peut être nul. – canon