En MVP je vois les présentateurs comme les orchestrateurs d'activité. En tant que tels, ils sont le choix naturel sur lequel baser la composition d'une application.
Exposer la vue d'un présentateur à d'autres présentateurs rompt l'idée d'encapsulation dans le modèle MVP. Bien que cela ne réduise pas la réutilisabilité du composant en exposant sa vue, cela réduit la réutilisabilité d'un composant en utilisant la vue d'un autre composant car cela augmente les dépendances des composants. Donc, je garderais les vues privées pour les présentateurs et je laisserais seulement les présentateurs communiquer les uns avec les autres.
Elaboration en réponse au commentaire
Quand je dis garder la vue privée au présentateur, je veux dire privé: non exposée au monde extérieur que par la médiation du présentateur. Bien sûr, le présentateur peut exposer des méthodes au monde extérieur qui l'amènera à manipuler sa vue. Si le présentateur le fait via une interface, il peut en fait utiliser sa propre vue en tant que délégué pour l'implémentation de l'interface, mais - contrairement à ce que vous proposez - le présentateur délègue des choses à la vue et non l'inverse. En procédant de cette manière, vous garantissez, ou du moins vous avez plus de chances que toute la logique d'interaction reste dans les présentateurs et ne se retrouve pas dans les présentateurs et les vues.
Une vue doit uniquement être manipulée par son présentateur. Maintenant, bien sûr, vous pouvez réutiliser les vues dans plusieurs présentateurs, mais l'instance d'une vue ne doit être manipulée que par le présentateur qui l'instancie. Si vous l'exposez directement (même à travers des interfaces entières ou partielles), vous commencez à devoir gérer une vue qui peut être manipulée par plusieurs animateurs et aucun présentateur ne contrôle plus la vue.
Le seul code que j'ai dans la vue sont les notifications à son présentateur de ce qu'un utilisateur a fait (également connu sous le nom de gestes de l'utilisateur dans certaines discussions MVP). C'est au présentateur de décider quoi faire à ce sujet. Je garde également toute la logique concernant les contrôles à activer/désactiver en réponse aux sélections de l'utilisateur dans le présentateur et non dans la vue. Cela permet non seulement de conserver toute la logique d'interaction dans le présentateur, mais également de créer des interfaces utilisateur (formulaires) testables à l'unité.
Pouvez-vous nous en dire plus à ce sujet? Je suppose que vous voulez dire exposer le présentateur à travers une interface. Cette interface ne doit contenir que des méthodes/événements pertinents pour l'interaction extérieure avec la vue. Avec cela je peux juste diviser l'interface IView implémentée par la vue en 2 parties: l'une est une utilisation privée pour son présentateur, et l'autre est pour le présentateur exposer à l'extérieur. Maintenant, le présentateur peut implémenter la même interface publique et être un délégué pour sa vue. Ou il peut juste retourner la vue à travers cette interface fractionnée. – user129148
Cela fait beaucoup de sens! Merci – user129148