Lors de la conception d'un système, je suis souvent confronté au problème de l'utilisation d'un ensemble de modules (journalisation, accès à une base de données, etc.) utilisés par les autres modules. La question est de savoir comment puis-je fournir ces composants à d'autres composants. Deux réponses semblent possibles: injection de dépendance ou utilisation du modèle d’usine. Cependant les deux semblent faux
- Les usines facilitent les tests et ne permettent pas de permuter facilement les implémentations. Ils ne font pas non plus apparaître de dépendances (par exemple, vous examinez une méthode, oubliant qu’elle appelle une méthode qui appelle une méthode qui appelle une méthode qui utilise une base de données).
- L'injection de dépendance gonfle massivement les listes d'arguments des constructeurs et couvre certains aspects de votre code. La situation typique est celle où les constructeurs de plus de la moitié des classes ressemblent à ceci
(....., LoggingProvider l, DbSessionProvider db, ExceptionFactory d, UserSession sess, Descriptions d)
Voici un exemple typique de situation qui me pose problème: j'ai des classes d'exception, qui utilisent des descriptions d'erreur chargées à partir de la base de données, à l'aide d'une requête comportant un paramètre de paramètre de langue utilisateur, qui est un objet de session utilisateur. Donc, pour créer une nouvelle exception, j'ai besoin d'une description, qui nécessite une session de base de données et la session utilisateur. Je suis donc condamné à faire glisser tous ces objets dans toutes mes méthodes, au cas où je devrais lancer une exception.
Comment puis-je aborder un tel problème ??