IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Dotnet Discussion :

Pattern MVP - Conseils


Sujet :

Dotnet

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut Pattern MVP - Conseils
    Bonjour,

    Jusqu'à présent je n'ai jamais utilisé de pattern pour la partie visuelle d'une application car le besoin ne se faisait pas sentir. Me disant que cela serait une bonne chose de voir ce qu'il existe, j'ai commencé à regarder un peu le pattern MVP (jai lu quelques articles dont celui sur DVP). J'ai mis de côté MVC, MVP étant une version dérivée où le Presenter a plus de "pouvoir" que le Controller car il gère d'une certaine manière la logique inhérente au visuel si j'ai bien suivi. Le jour où je ferais du WPF on verra pour MVVM, mais ce n'est pas pour tout de suite ^^

    L'avantage de ce que j'ai pu lire c'est principalement l'indépendance vis à vis de la partie graphique puisque l'on sépare le visuel des traitements qui lui sont propres. Dans mon cas ce sera toujours du client lourd donc cet avantage ne m'apporte rien, sauf cas de figure ou une Form ne va plus et on doit tout revoir. On peut alors casser le visuel sans mettre à mal la logique derrière. Ce cas n'est pas fréquent mais ça pourrait arriver après tout.

    L'autre avantage que je vois c'est avec les Form abstraites que l'on pourrait remplacer par une Form simple et différents Presenter. Quelques propriétés booléenne pour savoir si le visuel doit être adapté un peu en fonction du Presenter est le tour est joué. Le cas n'est pas fréquent non plus mais cela peut servir. D'autant plus que le Form abstraites ne sont pas supportées par le designer Visual Studio (on peut bidouiller pour que cela fonctionne mais bon).

    Pour finir, ce pattern simplifie les tests unitaires puisque le code est séparé du visuel. Ce n'est pas négligeable après tout.

    Même si pour le moment je n'ai pas vraiment d'avantage à utiliser MVP (écrans simples), je commence à me dire que cela peut être une bonne façon de procéder et qu'il faudrait peut être que je me force à le faire. Ne serait-ce que par souci de clarté via la séparation du code (ce serait déjà une bonne chose après tout) mais aussi pour prendre le réflexe et réaliser les tests unitaires avec les Presenter.

    Ce long monologue étant fait, avez-vous
    • des conseils sur la mise en place du pattern MVP ?
    • des conseils sur la manière de tester les Presenter ? Il y a une notion de "Mock objects" à priori à ce stade
    • des articles en particulier ?

    En terme de standardisation, de ce que j'ai pu voir pour le moment la communication View vers Presenter se fait par événement. Si l'on attend un retour, une propriété sur le Presenter contient le retour en question (cf. événement NextRequested et propriété Astuce sur la première partie de l'article DVP).

    Existe-t-il des variantes qui peuvent être utiles dans certains cas ? Par exemple une méthode sur la View que l'on appellera ce qui permettrait d'avoir plusieurs valeurs de retour, une par paramètre. Ou bien pourquoi pas le retour sur la classe d'EventArgs (même si dans ce cas c'est un peu lourd).

    Enfin bref, je cherche un peu de tout et aussi des retours sur expérience (parce qu'après la théorie, il y a la pratique après tout) histoire d'aller sur la bonne voie.

    Merci aux courageux qui auront tout lu ... et aux autres aussi

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Par défaut
    He be, un topic sur le MVP après celui sur le MVC :)

    Citation Envoyé par StormimOn Voir le message
    j'ai commencé à regarder un peu le pattern MVP (jai lu quelques articles dont celui sur DVP).
    Regarde en priorité : ça pour le tour d'horizon général et les origines, suivi de Presentation Model et Passive View pour les deux patterns créés à partir du pattern MVP initial.

    Citation Envoyé par StormimOn Voir le message
    L'avantage de ce que j'ai pu lire c'est principalement l'indépendance vis à vis de la partie graphique puisque l'on sépare le visuel des traitements qui lui sont propres.
    Principalement, non. C'est un des avantages potentiels, mais pas obligatoire.

    Citation Envoyé par StormimOn Voir le message
    L'autre avantage que je vois c'est avec les Form abstraites que l'on pourrait remplacer par une Form simple et différents Presenter. Quelques propriétés booléenne pour savoir si le visuel doit être adapté un peu en fonction du Presenter est le tour est joué.
    Pas compris, mais l'adaptation par booléens interposés me fait peur :)

    Citation Envoyé par StormimOn Voir le message
    D'autant plus que le Form abstraites ne sont pas supportées par le designer Visual Studio
    Pas une grosse perte ça.

    Citation Envoyé par StormimOn Voir le message
    Pour finir, ce pattern simplifie les tests unitaires puisque le code est séparé du visuel. Ce n'est pas négligeable après tout.
    Ça, c'est pas que ce n'est pas négligeable, mais plutôt que c'est lui l'avantage principal de la chose. C'est une raison suffisante pour justifier de s'y mettre.

    Citation Envoyé par StormimOn Voir le message
    Même si pour le moment je n'ai pas vraiment d'avantage à utiliser MVP (écrans simples), je commence à me dire que cela peut être une bonne façon de procéder et qu'il faudrait peut être que je me force à le faire. Ne serait-ce que par souci de clarté via la séparation du code (ce serait déjà une bonne chose après tout) mais aussi pour prendre le réflexe et réaliser les tests unitaires avec les Presenter.
    Bonne initiative :)

    Citation Envoyé par StormimOn Voir le message
    Ce long monologue étant fait, avez-vous
    • des conseils sur la mise en place du pattern MVP ?
    • des conseils sur la manière de tester les Presenter ? Il y a une notion de "Mock objects" à priori à ce stade
    • des articles en particulier ?
    Pour les articles, cf les liens plus haut donc. Si tu veux un point de référence pour discuter du MVP et de ses variantes, c'est probablement le meilleur choix :)

    Pour la mise en place et la manière de tester, ça dépend un peu de ce que tu veux faire.

    Pour les tests, un moyen simple est que le Presenter reçoive la vue dans son constructeur, sous forme d'une interface. L'interface contient les évènements, propriétés et méthodes dont le Presenter peut avoir besoin, sans plus.

    Quand tu fais tes tests unitaires sur un Presenter, tu passes une fausse vue, implémentant la même interface. Tu déclenches manuellement les évènements sur ta fausse vue et tu contrôles ensuite que le Presenter a bien fait son boulot.

    Vu qu'il y a aussi probablement besoin d'accéder aux données, même principe, tu passes la ou les interfaces des objets nécessaires dans le constructeur du Presenter. Dans les tests, tu passes aussi de faux objets implémentant ces interfaces (qui se basent sur des collections alimentées à la main plutôt que sur une base de données par exemple).

    Tu peux créer ces fausses classes à la main ou utiliser une des librairies de mocking disponibles (ma préference du moment est pour Moq).


    Dans l'immédiat, décortique déjà les articles de Fowler pour voir si ça répond à une bonne partie des questions :)

  3. #3
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Citation Envoyé par Maniak Voir le message
    He be, un topic sur le MVP après celui sur le MVC
    Bein oui ^^

    Citation Envoyé par Maniak Voir le message
    Pas compris, mais l'adaptation par booléens interposés me fait peur
    L'idée c'est par exemple un formulaire qui suivant le cas aura des contrôles visibles ou non, ou bien des contrôles en plus, par rapport à celui de base. Actuellement j'ai par exemple un Form de base abstrait et j'en dérive pour faire deux autres Form. Sur les Form dérivés il y a de petites différences visuelles : deux boutons en plus sur l'un, un seul sur l'autre, avec évidemment des actions associées. Après le coup de la propriété bool pour adapter n'est peut être pas idéale. Tu ferais quoi ?

    En tout cas je n'ai plus qu'à lire les articles cités et regarder Moq afin de comprendre ce que sont les Mock objects et l'utilité dans les tests unitaires.

    Merci

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Par défaut
    Citation Envoyé par StormimOn Voir le message
    L'idée c'est par exemple un formulaire qui suivant le cas aura des contrôles visibles ou non, ou bien des contrôles en plus, par rapport à celui de base. Actuellement j'ai par exemple un Form de base abstrait et j'en dérive pour faire deux autres Form. Sur les Form dérivés il y a de petites différences visuelles : deux boutons en plus sur l'un, un seul sur l'autre, avec évidemment des actions associées. Après le coup de la propriété bool pour adapter n'est peut être pas idéale. Tu ferais quoi ?
    Bah faut voir en quoi consistent les traitements liés à ces différences de contrôles, mais a priori là comme ça, il y aurait l'option de reproduire la hiérarchie des formulaires du côté des Presenters ou d'injecter une [ame=http://en.wikipedia.org/wiki/Strategy_pattern]stratégie[/ame] différente pour chaque (le nom du lien est censé être 'stratégie' :). Enfin c'est comme d'hab, faut voir au cas par cas et là c'est très flou :)

    Mais ce serait toujours mieux d'éviter d'avoir un Presenter global qui doit bouger quand n'importe quel formulaire dérivé bouge, parce que ses traitements spécifiques sont au milieu des traitements communs.

    Citation Envoyé par StormimOn Voir le message
    En tout cas je n'ai plus qu'à lire les articles cités et regarder Moq afin de comprendre ce que sont les Mock objects et l'utilité dans les tests unitaires.
    Ah, pour ça :
    http://xunitpatterns.com/Test%20Double.html
    http://martinfowler.com/articles/mocksArentStubs.html

    :)

  5. #5
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Ca fait pas mal de chose à ingurgiter ^^

    A priori je partirais plus sur la Passive View, c'est la vision que j'avais de la chose de ce que j'avais pu lire avant ce sujet, et cela reste la vision que j'ai après avoir vu les liens cités. Après il va falloir appliquer tout ça pour que ça rentre. Et ensuite poster pour voir comment gérer certains cas en particulier.

    Le mocking semble être très intéressant, à mettre en oeuvre pour bien comprendre aussi. A priori l'idéal serait de faire un mix entre mocking et tests classiques d'états (Assert, ...).

    Mais ce serait toujours mieux d'éviter d'avoir un Presenter global qui doit bouger quand n'importe quel formulaire dérivé bouge, parce que ses traitements spécifiques sont au milieu des traitements communs.
    Les traitements spécifiques sont totalement indépendants des autres. Je pensais donc faire un Presenter commun et le dériver pour ajouter les traitements spécifiques (comme tu l'as mentionné). Je pense que c'est valide, mais parce que les traitements spécifiques sont indépendants. Après des propriétés CanDoSomething et CanDoSomethingElse, afin de bloquer l'accès à certaines fonctions au niveau visuel.

    Et encore merci pour tes réponses

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Par défaut
    Citation Envoyé par StormimOn Voir le message
    Ca fait pas mal de chose à ingurgiter ^^
    Ah ça, il faut avoir du temps pour lire c'est sûr :)

    Citation Envoyé par StormimOn Voir le message
    Le mocking semble être très intéressant, à mettre en oeuvre pour bien comprendre aussi. A priori l'idéal serait de faire un mix entre mocking et tests classiques d'états (Assert, ...).
    Tu frôles le grand débat entre :
    - les tests d'interaction, qui ajoutent plein d'expectations sur les mocks pour vérifier que l'objet testé les a bien utilisés comme prévu. Ils sont du coup très dépendants de l'implémentation.
    - les tests d'état, qui observent l'état des objets après exécution du traitement, sans se préoccuper de la façon précise dont ce traitement est fait. Ils se servent moins de mocks, et souvent uniquement de stubs/fakes pour fournir des données prédéfinies. Ils sont beaucoup moins dépendants de l'implémentation exacte des classes, mais peuvent donner l'impression de moins bien contrôler ce qui est fait (pas un problème en TDD, pas trop non plus si on surveille la couverture des tests via NCover pour repérer si on a oublié des cas)

    Perso j'avais commencé plutôt du côté tests d'interaction (avec RhinoMocks), mais ça devenait vite très lourd de devoir modifier plein de tests chaque fois qu'on fait un refactoring qui change un morceau de plomberie sur lequel ils dépendaient. Maintenant je ne fais quasiment plus que des tests d'état. Je suis passé sur Moq parce que sa syntaxe était beaucoup plus light pour créer de faux objets en indiquant les valeurs de retour (RhinoMocks dispose depuis aussi d'une syntaxe similaire, mais il commence à y avoir un peu trop de façons de faire la même chose à force d'accumuler les évolutions depuis le temps).

    Les vrais mocks, avec expectations et vérifications, ont leur utilité, mais il faut considérer ça comme l'artillerie lourde dans l'arsenal des objets de test. Quand le code est bien découplé, on peut généralement faire plus simple. Par contre quand le code est une grosse masse gluante qui se traine sur le parquet, c'est bien utile pour pouvoir mettre des tests en place avant de s'attaquer au nettoyage :)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ext-GWT (GXT) et pattern MVP
    Par jca38 dans le forum GWT et Vaadin
    Réponses: 18
    Dernier message: 31/01/2013, 14h53
  2. Pattern MVP - Mise en pratique
    Par StormimOn dans le forum Général Dotnet
    Réponses: 26
    Dernier message: 20/10/2009, 21h52
  3. Pattern MVP userControl
    Par topolino dans le forum ASP.NET
    Réponses: 2
    Dernier message: 22/07/2009, 10h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo