Problème
J'ai récemment lu beaucoup de choses sur les singletons étant mauvais et comment l'injection de dépendances (que je comprends comme "utilisant des interfaces") est meilleure. Lorsque j'ai implémenté une partie de cela avec des rappels / interfaces / DI et en adhérant au principe de ségrégation d'interface, je me suis retrouvé avec un sacré bordel.
Les dépendances d'un parent d'interface utilisateur où, fondamentalement, celles de tous ses enfants se sont combinées, de sorte que plus la hiérarchie d'un élément d'interface utilisateur était élevée, plus son constructeur était gonflé.
Tout en haut de la hiérarchie de l'interface utilisateur se trouvait une classe Application, contenant les informations sur la sélection actuelle et une référence à un modèle 3D qui doit refléter les changements. La classe d'application implémentait 8 interfaces, et ce n'était qu'un rond-point sur un cinquième des produits (/ interfaces) à venir!
Je travaille actuellement avec un singleton contenant la sélection actuelle et les éléments d'interface utilisateur ayant une fonction pour se mettre à jour. Cette fonction fait couler l'arborescence de l'interface utilisateur et les éléments de l'interface utilisateur, puis accède au singleton de sélection actuel selon les besoins. Le code me semble plus propre de cette façon.
Question
Un singleton peut-il convenir à ce projet?
Sinon, y a-t-il un défaut fondamental dans ma façon de penser et / ou de mettre en œuvre l'ID qui le rend si lourd?
Informations supplémentaires sur le projet
Type: Panier pour les appartements, avec cloches et sifflets
Taille: 2 mois-homme pour le code et l'interface utilisateur
Maintenance: Aucune mise à jour en cours d'exécution, mais peut-être "version 2.0" plus tard
Environnement: Utilisation de C # dans Unity, qui utilise une entité Système de composants
Dans presque tous les cas, l'interaction utilisateur déclenche plusieurs actions. Par exemple, lorsque l'utilisateur sélectionne un élément
- la partie de l'interface utilisateur montrant cet élément et sa description doit être mise à jour. Pour cela, il doit également obtenir des informations à partir d'un modèle 3D afin de calculer le prix.
- plus haut dans l'interface utilisateur, le prix total global doit être mis à jour
- une fonction correspondante dans une classe sur un modèle 3D doit être appelée pour y afficher les changements