Comment organiser du code répétitif?

11

Mon équipe crée de nombreux formulaires Web uniques. La plupart de ces formulaires envoient simplement un e-mail, et quelques-uns font une simple écriture de base de données.

À l'heure actuelle, chaque formulaire réside dans sa propre solution distincte dans Visual Studio Team Foundation Server. Cela signifie que nous avons près de 100 projets de formulaires différents, ce qui rend difficile le maintien de la cohérence. Chaque formulaire est unique en ce sens que les champs sont différents, mais tous font à peu près la même chose.

Je cherche à les condenser d'une manière ou d'une autre, et je pourrais vraiment utiliser quelques conseils.

  • Dois-je essayer de créer un fichier de solution contenant tous nos projets de formulaire? Il n'y a pas beaucoup de code de plomberie, bien que je puisse créer quelques classes d'assistance pour aider au formatage des e-mails et autres. Il serait très utile de pouvoir partager CSS, JavaScript, des contrôles et des images sur plusieurs projets.
  • Étant donné que nous sommes une boutique Microsoft, y a-t-il des avantages tangibles à utiliser quelque chose comme MVC sur des formulaires Web pour ce scénario spécifique? Je suis convaincu du concept de MVC dans son ensemble, mais est-ce que cela m'aiderait à créer un formulaire de collecte de données à 15 champs plus efficacement si tout ce formulaire consiste à envoyer un e-mail? Le formulaire qui m'a fait penser à cela avait une bonne logique intégrée pour afficher et masquer les champs en fonction des réponses de l'utilisateur et il semble qu'il aurait été moins efficace d'utiliser MVC et jQuery.
Josh Earl
la source
2
Qu'est-ce que cela a migré ici de la méta? Devrait être sur SO.
Josh K
1
@Josh Stack Overflow est destiné aux questions directement liées à des problèmes spécifiques dans le code. La conception des programmes et des workflows est abordée ici.
@Mark: Cela ne semble pas très subjectif, car il n'y aurait pas de solution idéale de "meilleures pratiques" facilement proposée. Je ne suis pas un type MS donc je n'ai aucune idée de la complication, mais je risquerais de deviner qu'il serait préférable de répondre de manière non subjective.
Josh K
D'accord. Cela serait fermé le SO.
Walter
1
C'est déjà demandé sur SO ici
ChrisF

Réponses:

3

La refacturation en toute sécurité sans tests est difficile et lourde de dangers.

Je commencerais par:

  • Écriture de cas de test couvrant les différents types d'entrée dans ces formulaires et la sortie attendue. Il semble que cela ne prendrait pas trop de temps, car vous pensez que la plupart de ces formes sont identiques ou proches.

  • Exécutez ces cas de test sur les quelque 100 formulaires (activez la couverture de code pour vous aider à tracer les chemins de code).

Après cela, vous êtes en mesure de voir ce que vous pouvez retraiter en toute sécurité, alors vous pouvez (un exemple):

  • Exécutez votre outil de détection de duplication de code (vous ne savez pas comment il s'appelle dans .NET, en Java, nous avons CPD). Retirez immédiatement 13 formulaires identiques. Maintenant, relancez les tests - Yay! Ils passent tous sauf le formulaire 11, OK, nous ne pouvons donc pas encore le supprimer.

  • Supprimez tous les codes de mise en forme des e-mails locaux et obtenez tous les formulaires à appeler vers un module de traitement des e-mails commun. Exécutez les tests, ils passent tous sauf un, hhmmm OK .... Caractères UTF-8, corrigez cela dans le module générique, exécutez à nouveau les tests, yay nous sommes tous bons!

rincer et répéter.

Martijn Verburg
la source
2
+1 Voir Michael Feathers Travailler efficacement avec le code hérité amazon.com/dp/0131177052 pour des conseils sur la façon d'aborder la refactorisation.
Michael Brown
Ohhhh bonne référence - j'aime ce livre.
Martijn Verburg
0

Je suggère de résumer la partie de la soumission. À l'aide de Modèle / Vue / Contrôleur, placez les formulaires dans la Vue et demandez-leur d'utiliser le même contrôleur. Ce contrôleur peut effectuer une action générique, comme envoyer un e-mail à une adresse par défaut, ou détourner les données du formulaire vers un contrôleur qui le peut. De cette façon, tout ce que vous avez à faire pour créer un nouveau formulaire est de créer le formulaire et de diriger la sortie vers ce contrôleur. Cette archétecture pourrait être contenue dans un seul projet, ce qui vous permettrait de partager CSS et javascript comme vous l'avez mentionné.

Pour gérer le formatage des e-mails, je commencerais par créer un formateur générique, disons celui qui répertorie simplement les noms et les valeurs des éléments de formulaire, ainsi que les autres types de métadonnées, comme le temps soumis, etc. Vous pouvez le rendre aussi sophistiqué que vous le souhaitez . Ensuite, si vous avez vraiment besoin d'une gestion plus personnalisée que cela, ajoutez une usine. L'usine retournerait une interface de formateur. Ensuite, dans l'usine, vous pouvez rechercher un formateur pour ce formulaire spécifique ou renvoyer le générique s'il n'en existe pas de spécifique. Cette conception faciliterait également les tests unitaires du contrôleur, car vous pourriez facilement fournir un formateur simulé à des fins de test.

Soit dit en passant, je ne mettrais pas l'adresse e-mail comme argument du formulaire. Si vous devez envoyer à plusieurs adresses, je vous suggère de disposer d'une table de recherche contenant tous les formulaires et l'e-mail auquel les envoyer. Cela pourrait être implémenté en XML ou en code (j'ai vu les deux, mais je ne suis pas certain si c'est mieux). Cela évitera aux spammeurs d'obtenir vos adresses e-mail à partir de la page du formulaire.

Michael K
la source
Merci pour la réponse. Dans cette architecture, où géreriez-vous le formatage des e-mails envoyés? Je voudrais résumer cela, mais je ne peux pas penser à un moyen de faire le formatage sans créer un constructeur de chaînes et déposer les champs parmi les blocs de texte statique. Cela semble spécifique à chaque formulaire.
Josh Earl
En outre, des recommandations sur la gestion de la logique du formulaire, comme le remplissage d'une liste déroulante en fonction de la sélection dans une autre liste déroulante? JQuery est-il la seule option si nous options pour la route MVC?
Josh Earl
@JoshEarl: J'ai édité une idée pour le formateur, mais je ne peux faire aucune suggestion concernant jQuery, etc. Le côté de la page Web n'est pas un domaine sur lequel je suis tout à fait à l'aise de faire des recommandations. Vous devrez peut-être opter pour une conception MVC complète, un contrôleur par page, si les choses sont trop compliquées. Comme l'a dit @Martijn, les tests unitaires vous aideront à voir exactement quelles sont vos exigences. Ma conception suppose une grande similitude entre les formes.
Michael K