Au cours des années d'utilisation de C # /. NET pour un tas de projets internes, nous avons vu une bibliothèque se développer organiquement en une énorme liasse de choses. Cela s'appelle "Util", et je suis sûr que beaucoup d'entre vous ont vu une de ces bêtes dans votre carrière.
De nombreuses parties de cette bibliothèque sont très autonomes et pourraient être divisées en projets distincts (que nous aimerions ouvrir). Mais il y a un problème majeur qui doit être résolu avant de pouvoir les publier sous forme de bibliothèques distinctes. Fondamentalement, il y a beaucoup, beaucoup de cas de ce que je pourrais appeler des "dépendances facultatives" entre ces bibliothèques.
Pour mieux expliquer cela, considérez certains des modules qui sont de bons candidats pour devenir des bibliothèques autonomes. CommandLineParser
sert à analyser les lignes de commande. XmlClassify
sert à sérialiser des classes en XML. PostBuildCheck
effectue des vérifications sur l'assembly compilé et signale une erreur de compilation en cas d'échec. ConsoleColoredString
est une bibliothèque de littéraux de chaîne colorés. Lingo
sert à traduire les interfaces utilisateur.
Chacune de ces bibliothèques peut être utilisée de manière totalement autonome, mais si elles sont utilisées ensemble, il existe des fonctionnalités supplémentaires utiles. Par exemple, les deux CommandLineParser
et XmlClassify
exposent la fonctionnalité de vérification post-génération, ce qui nécessite PostBuildCheck
. De même, la CommandLineParser
documentation de l'option permet d'être fournie à l'aide des littéraux de chaîne de couleur, exigeant ConsoleColoredString
, et il prend en charge la documentation traduisible via Lingo
.
La principale distinction est donc qu'il s'agit de fonctionnalités facultatives . On peut utiliser un analyseur de ligne de commande avec des chaînes simples et non colorées, sans traduire la documentation ni effectuer de vérifications après la construction. Ou on pourrait rendre la documentation traduisible mais toujours incolore. Ou à la fois coloré et traduisible. Etc.
En parcourant cette bibliothèque "Util", je constate que presque toutes les bibliothèques potentiellement séparables ont des fonctionnalités optionnelles qui les lient à d'autres bibliothèques. Si je devais réellement avoir besoin de ces bibliothèques en tant que dépendances, cette liasse de choses n'est pas vraiment démêlée du tout: vous auriez toujours besoin de toutes les bibliothèques si vous voulez en utiliser une seule.
Existe-t-il des approches établies pour gérer ces dépendances facultatives dans .NET?