Il s'agit d'une décision de conception qui semble beaucoup revenir: comment passer du contexte à travers une méthode qui n'en a pas besoin à une méthode qui en a besoin. Y a-t-il une bonne réponse ou cela dépend-il du contexte?
Exemple de code nécessitant une solution
// needs the dependency
function baz(session) {
session('baz');
}
// doesn't care about the dependency
function bar() {
baz();
}
// needs the dependency
function foo(session) {
session('foo')
bar();
}
// creates the dependency
function start() {
let session = new Session();
foo(session);
}
Solutions possibles
- threadlocal
- global
- objet de contexte
- passer la dépendance
- curry baz et passez-le dans la barre avec la dépendance définie comme premier argument
- injection de dépendance
Exemples d'où vient
Traitement des requêtes HTTP
Les objets de contexte sous forme d'attributs de requête sont souvent utilisés: voir expressjs, Java Servlets ou owin de .net.
Enregistrement
Pour la journalisation Java, les gens utilisent souvent des globales / singletons. Voir les modèles typiques de journalisation log4j / commons logging / java.
Transactions
Les sections locales de thread sont souvent utilisées pour conserver une transaction ou une session associée à une chaîne d'appels de méthode pour éviter d'avoir à les transmettre en tant que paramètres à toutes les méthodes qui n'en ont pas besoin.