Je sais que cette question est ancienne mais je voudrais ajouter mes cinq cents,
Je pense que l'injection de dépendance (DI) est à bien des égards comme un modèle d'usine configurable (FP), et dans ce sens, tout ce que vous pourriez faire avec DI, vous pourrez le faire avec une telle usine.
En fait, si vous utilisez Spring par exemple, vous avez la possibilité d'auto-câbler les ressources (DI) ou de faire quelque chose comme ceci:
MyBean mb = ctx.getBean("myBean");
Et puis utilisez cette instance «mb» pour faire quoi que ce soit. N'est-ce pas un appel à une usine qui vous rendra une instance ??
La seule vraie différence que je remarque entre la plupart des exemples FP est que vous pouvez configurer ce que "myBean" est dans un xml ou dans une autre classe, et un framework fonctionnera comme l'usine, mais à part ça c'est la même chose, et vous peut avoir certainement une fabrique qui lit un fichier de configuration ou obtient l'implémentation selon ses besoins.
Et si vous me demandez mon avis (et je sais que vous ne l'avez pas fait), je crois que DI fait la même chose mais ajoute juste plus de complexité au développement, pourquoi?
Eh bien, pour une chose, pour que vous sachiez quelle est l'implémentation utilisée pour n'importe quel bean que vous avez câblé avec DI, vous devez aller à la configuration elle-même.
mais ... qu'en est-il de cette promesse que vous n'aurez pas à connaître l'implémentation de l'objet que vous utilisez? pfft! sérieusement? lorsque vous utilisez une approche comme celle-ci ... n'êtes-vous pas le même qui écrit l'implémentation ?? et même si vous ne le faites pas, ne voyez-vous pas tout le temps comment l'implémentation fait ce qu'elle est censée faire ??
et pour une dernière chose, peu importe combien un framework DI vous promet que vous construirez des choses découplées de celui-ci, sans dépendances de leurs classes, si vous utilisez un framework vous construisez tout autour, si vous devez changer l'approche ou le cadre ce ne sera pas une tâche facile ... JAMAIS! ... mais, puisque vous construisez tout autour de ce cadre particulier au lieu de vous soucier de la meilleure solution pour votre entreprise, vous serez confronté à un problème biologique lors de cette opération.
En fait, la seule vraie application métier pour une approche FP ou DI que je puisse voir est si vous devez changer les implémentations utilisées lors de l' exécution , mais au moins les frameworks que je connais ne vous permettent pas de le faire, vous devez quitter tout est parfait dans la configuration au moment du développement et si vous en avez besoin, utilisez une autre approche.
Donc, si j'ai une classe qui fonctionne différemment dans deux étendues dans la même application (disons, deux sociétés d'une holding), je dois configurer le framework pour créer deux beans différents et adapter mon code pour utiliser chacun. N'est-ce pas la même chose que si j'écrivais simplement quelque chose comme ceci:
MyBean mb = MyBeanForEntreprise1(); //In the classes of the first enterprise
MyBean mb = MyBeanForEntreprise2(); //In the classes of the second enterprise
le même que celui-ci:
@Autowired MyBean mbForEnterprise1; //In the classes of the first enterprise
@Autowired MyBean mbForEnterprise2; //In the classes of the second enterprise
Et ça:
MyBean mb = (MyBean)MyFactory.get("myBeanForEntreprise1"); //In the classes of the first enterprise
MyBean mb = (MyBean)MyFactory.get("myBeanForEntreprise2"); //In the classes of the second enterprise
Dans tous les cas, vous devrez changer quelque chose dans votre application, qu'il s'agisse de classes ou de fichiers de configuration, mais vous devrez le faire et le redéployer.
Ce ne serait pas bien de faire juste quelque chose comme ça:
MyBean mb = (MyBean)MyFactory.get("mb");
Et de cette façon, vous définissez le code de l'usine pour obtenir la bonne implémentation au moment de l'exécution en fonction de l'entreprise utilisateur connectée ?? Maintenant, ce serait utile. Vous pouvez simplement ajouter un nouveau pot avec les nouvelles classes et définir les règles peut-être même au moment de l'exécution (ou ajouter un nouveau fichier de configuration si vous laissez cette option ouverte), aucune modification des classes existantes. Ce serait une usine dynamique!
cela ne serait-il pas plus utile que d'avoir à écrire deux configurations pour chaque entreprise, et peut-être même d'avoir deux applications différentes pour chacune?
Vous pouvez me dire que je n'ai jamais besoin de faire le changement au moment de l'exécution, donc je configure l'application et si j'hérite de la classe ou utilise une autre implémentation, je change simplement la configuration et redéploie. Ok, cela peut aussi se faire avec une usine. Et soyez honnête, combien de fois faites-vous cela? peut-être seulement lorsque vous avez une application qui sera utilisée ailleurs dans votre entreprise et que vous allez transmettre le code à une autre équipe, et ils feront des choses comme ça. Mais bon, ça peut aussi se faire en usine, et ce serait encore mieux avec une usine dynamique !!
Quoi qu'il en soit, la section des commentaires est ouverte pour que vous me tuiez.