Valeur de MVVM dans une application métier (et une éloge des pratiques de développement actuelles)

9

Après 2 ans, je continue de me battre avec MVVM comme méthode pratique de production de logiciels fonctionnels. Dans certains cas, c'est génial. J'ai fait une application multithread qui contrôlait une petite chaîne de montage qui aurait été un cauchemar sans concepts MVVM. Une abstraction de la chaîne de montage physique était presque une évidence.

Cependant, ma carrière tourne principalement autour des applications internes de l'entreprise - formaliser et optimiser les opérations d'une entreprise. Dans de telles applications, il y a généralement une activité commerciale autour du CRUD et des opérations composées. Dans les LOB, mes modèles de vue finissent par être des collections très simples de fonctions d'encapsuleur d'une ligne des méthodes de classe affaires et finissent par compliquer la tâche la plus simple, comme afficher une boîte de message ou ouvrir une fenêtre. Est-ce que personne d'autre ne trouve ça étrange quand les gens entrent dans de longues descriptions d '«injection de dépendance» et de «fournisseurs de messagerie» pour un appel Window.ShowDialog qui existe depuis des décennies? Combien y a-t-il d'autres questions sur le débordement de pile qui demandent des conseils pour des tâches qui étaient extrêmement simples dans Winforms?

Ne vous méprenez pas - je reçois MVVM et comment cela pourrait être inestimable pour les grandes équipes effectuant le développement horizontal d'un progiciel sous emballage rétractable et commercialisé. Les tests unitaires des modèles de vue pourraient économiser des millions en évitant un mauvais bogue RTM et les développeurs d'interfaces dédiés pourraient donner une expérience riche. Mais lorsque le coût du redéploiement est minime et que tout ce que l'entreprise se soucie de payer est un logiciel de travail simple, pourquoi devrais-je passer du temps à tester un vm "wrapper" simple alors que ma logique métier est déjà testée à l'unité? Combien de temps l'entreprise va-t-elle vraiment me permettre de passer sur de jolies animations et des jeux de couleurs? Y a-t-il quelque chose à faire pour un développeur junior (retrouver un bogue dans une fonctionnalité de sauvegarde était en train de regarder "Save_Click",

Certes, j'aime vraiment la liaison de données de WPF. Pour en profiter, j'ai défini le contexte de données sur la fenêtre elle-même, où il a accès à la classe affaires ainsi qu'à toute autre propriété observable. Oui, j'enfreins presque toutes les "règles" MVVM. Mais au moins, j'ai un code événementiel simple qui est facile à lire ET je profite de la nouvelle liaison de données et de la validation. Le problème est dans les concepteurs - que je n'utilise pas beaucoup mais j'espère maintenant qu'il sera mieux intégré en 2012 - le concepteur montre les centaines de propriétés d'une fenêtre et de ses classes de base.

Pour ceux qui peuvent se rapporter, pouvez-vous m'indiquer des ressources, des livres ou même simplement des changements de perspective qui ont rendu cela plus facile à avaler. Je vais donner une autre chance à MVVM, mais la dernière fois, je me suis senti assez stupide de m'inquiéter de l'injection de dépendance juste pour montrer une boîte de message à partir d'une machine virtuelle, je n'avais pas l'intention de tester les unités. Même si j'ai fait des tests unitaires, obtenons-nous vraiment plus de qualité en échangeant des tests d'exécution pour les erreurs de temps de compilation de ces redoutables applications "étroitement couplées"?

Je me rends compte qu'une réponse est de simplement rester dans les formes de victoire. Mais en tant que l'un des derniers partisans de WebForms (j'ai la même critique de la tendance du développement Web), je me sentais un peu comme un dinosaure comme c'est le cas lorsque j'ai découvert qu'il n'y avait plus de WebForms dans les pistes de certification Microsoft. Aller de l'avant est la seule option, même si je ne l'aime pas.

b_levitt
la source
1
Bien que je ne l'encourage pas, il est toujours possible d'écrire une application WPF de style WinForms avec des événements et du code derrière. Pour les applications simples et uniques, ce n'est pas un gros problème. Cela dépend de ce que vous appréciez et de ce qui apporte de la valeur à l'entreprise. Je suis un grand fan de TDD et MVVM, mais si cela n'apporte vraiment pas de valeur, ne le faites pas. Ce n'est pas une religion. N'oubliez pas que le code vit souvent beaucoup plus longtemps que nous ne le pensons.
Matt H
"Est-ce que personne d'autre ne trouve ça étrange quand les gens entrent dans de longues descriptions de" l'injection de dépendance "et des" fournisseurs de messagerie "pour un appel Window.ShowDialog qui existe depuis des décennies?" Je trouve ça ennuyeux, mais le genre de personne qui se mêle de tout cela (au détriment de faire quoi que ce soit) a toujours fait partie du domaine, et, malheureusement, le sera probablement toujours. La meilleure stratégie consiste à les ignorer / distraire autant que possible.
user1172763

Réponses:

10

Mon point de vue est basé sur des années d'expérience de travail avec Winforms, "à l'ancienne", avec des événements et du code-behind. Je peux donc vous dire avec une certitude absolue qu'une fois que vous avez dépassé la plus simple des applications, votre code devient rapidement une grosse boule de boue . C'était inévitable, car c'était ainsi que les demandes étaient écrites à l'époque.

Les formulaires Web sont exactement les mêmes, sauf qu'ils ajoutent la complication supplémentaire d'être une abstraction avec état sur un système sans état (le Web). Comme l'a dit Rob Conery:

WebForms est un mensonge. C'est une abstraction enveloppée de tromperie recouverte de sauce au mensonge présentée sur une assiette pleine de diversion et de tour de passe-passe. Rien de ce que vous faites avec Webforms n'a rien à voir avec le Web - vous le laissez faire le travail pour vous.

Ceci, du gars qui a écrit un mappeur relationnel objet entièrement fonctionnel en utilisant le dynamicmot - clé en C # et seulement quatre cents lignes de code. Quand il parle avec autorité de quelque chose, j'écoute.

L'application sur laquelle je travaille actuellement est une application Winforms, avec plusieurs onglets dans le formulaire principal. Je peux charger dynamiquement des formulaires dans chacun des onglets. Bien que je n'ai pas suivi MVVM ou MVP (vous pouvez, avec des bibliothèques comme celle-ci ), j'ai poussé agressivement chaque bit de code que je pouvais vers un assembly séparé, ne laissant que le code qui est absolument nécessaire pour exécuter le formulaire. Il y a encore plusieurs centaines de lignes de code, sans compter la classe partielle contenant les définitions de contrôle du formulaire, les propriétés et les affectations du gestionnaire d'événements, mais je ne devrais jamais avoir à y toucher à nouveau, sauf si j'ai besoin d'ajouter quelque chose de nouveau au formulaire.

J'ai une méthode statique que je peux remettre un formulaire et une collection de paires clé / valeur, et elle (à l'aide de Reflection) fera automatiquement correspondre les clés aux champs du formulaire et remplira le formulaire avec les valeurs de la collection. Je peux également faire l'inverse, en obtenant une collection de paires clé / valeur à partir des champs du formulaire. Tout cela représente environ vingt lignes de code, mais il est rentable à chaque fois que je l'utilise, car je n'ai pas à écrire quarante instructions d'affectation personnalisées pour quarante contrôles sur un formulaire.

Je peux prendre cette liste de clés / valeurs et la sérialiser en XML, ce qui me permet de la conserver dans un fichier. J'ai d'autres formulaires que je peux remettre un DTO conventionnel et mapper ses champs au formulaire. Rien de tout cela ne serait pratique dans le style "grosse boule de boue" de Winforms. C'est presque trivial quand un découplage adéquat est utilisé.

Est-ce que cela vous semble familier? Cela devrait; c'est essentiellement une forme de liaison de données pour un pauvre.

Certes, j'aime vraiment la liaison de données de WPF. Pour en profiter, j'ai défini le contexte de données sur la fenêtre elle-même, où il a accès à la classe affaires ainsi qu'à toute autre propriété observable.

Bien pour vous. Il n'est pas nécessaire qu'il soit compatible MVVM. Mais rappelez-vous, des modèles comme MVVM ont été créés pour aider les développeurs à construire de gros systèmes. Si vous avez juste besoin d'afficher une boîte de dialogue, vous n'aurez peut-être pas besoin de toute cette plomberie.

Une partie de la complexité des systèmes comme WPF est inhérente à toutes les bibliothèques de programmeurs qui cherchent à résoudre un problème spécifique de manière généralisée. Pour ce faire, vous devez tenir compte de toutes les façons pratiques dont un programmeur pourrait utiliser votre bibliothèque. Cela ajoute de la complexité, mais pour ceux qui conçoivent bien leurs bibliothèques, cela apporte également à la table une philosophie de faire les choses de manière uniforme et cohérente.

Considérez la bibliothèque jQuery de John Resig: c'est l'essence même d'une conception cohérente, et elle cache beaucoup de détails étranges sur le DOM , et des variations dans la façon dont les navigateurs le gèrent. Est-ce plus simple d'écrire quelques lignes de Javascript? Quelquefois. Mais l'avantage d'écrire du code jQuery dans une API cohérente et uniforme permet à la prochaine personne qui vient de comprendre plus facilement ce que vous avez fait et de conserver ce code si nécessaire.

Ma véritable expérience avec les modèles de "grande application" consiste à utiliser ASP.NET MVC. ASP.NET est à ASP.NET MVC comme Winforms à WPF. Quand je travaillais dans ASP.NET, j'ai toujours eu du mal à le plier à ma volonté. ASP.NET MVC se plie à vous. C'est une joie à utiliser; il produit une structure système claire et organisée, et vous donne un contrôle total sur votre application et votre balisage. Vous pouvez utiliser Javascript, jQuery et CSS généreusement, et ASP.NET MVC reste à l'écart.

Mon seul obstacle était de m'y habituer et de le connaître à ses propres conditions.

Pour en savoir plus,
vous devriez apprendre MVC par Rob Conery

Robert Harvey
la source
Merci pour la réponse vraiment réfléchie, grosse boule de boue - j'ai vraiment ressenti cela à l'époque du code classique asp et spaghetti. La conception à 3 niveaux avec vb6 / mts a corrigé une grande partie de cela, puis la sortie de .net a rassemblé tout cela. Mais maintenant, si vous sentez que les retours sur des modèles supplémentaires sont en train de disparaître rapidement - comme dépenser 1 M $ pour prendre 0,1 seconde sur votre quart de mile. "J'ai poussé agressivement chaque bit de code que je pouvais vers un assemblage séparé" - ne trouvez-vous pas que cela donne une expérience de développement incroyablement fracturée - sautant constamment d'un fichier à l'autre pour lire deux lignes?
b_levitt
3
don't you find that this gives an incredibly fractured development experience - constantly jumping from file to file to read two lines?- Non, c'est le contraire. Mettre dans un autre assemblage comme celui-ci libère votre esprit pour se concentrer sur chaque classe et méthode selon ses propres termes, comme sa propre petite boîte noire. C'est très difficile à faire avec une grosse boule de boue. MVC fonctionne sur le même principe: contrôleurs minces, modèle gras, pas de code dans la vue sauf si absolument nécessaire.
Robert Harvey
3
Yagni s'applique uniquement lorsque vous écrivez le code vous-même. Si vous écrivez une bibliothèque généralisée qui doit satisfaire un large public aux besoins divers, vous allez en avoir besoin.
Robert Harvey
1
Soit dit en passant, je n'ai rien contre le cycle de vie d'ASP.NET; J'ai vu des gens l'utiliser avec un excellent effet. Je trouve ça contre-intuitif, c'est tout. ASP.NET MVC ne vous oblige pas à faire de développement côté client, si vous ne le souhaitez pas; vous pouvez utiliser des vues "stupides", et cela fonctionne parfaitement bien. À noter: beaucoup de ces choses peuvent être générées par du code (tout comme un formulaire Windows), donc ce n'est pas comme si vous écriviez tout le code vous-même. Je comprends que cela est moins vrai avec WPF, où vous devez traiter avec XAML, et je pense qu'il y a place à amélioration.
Robert Harvey
2
dozens of lines of plumbing to replace Window.Show- C'est un peu une simplification excessive. Si la fenêtre a besoin de données, il y aura toujours une sorte de plomberie pour obtenir ces données dans les contrôles de la fenêtre, et vice versa. Vous pouvez soit écrire ce code répétitif encore et encore pour chaque formulaire que vous créez, soit utiliser une forme de solution généralisée comme la liaison de données.
Robert Harvey