Come organizzare il codice ripetitivo?


11

Il mio team crea molti moduli web unici. La maggior parte di questi moduli invia semplicemente un'e-mail e alcuni scrivono semplicemente un database.

Al momento, ogni modulo vive in una propria soluzione separata in Visual Studio Team Foundation Server. Ciò significa che abbiamo quasi 100 progetti in diverse forme, il che rende difficile mantenere la coerenza. Ogni modulo è unico in quanto i campi sono diversi, ma tutti fanno praticamente la stessa cosa.

Sto cercando di condensare questi in qualche modo, e potrei davvero usare una guida.

  • Dovrei provare a creare un file di soluzione con tutti i nostri progetti di modulo in esso? Non c'è molto codice idraulico, anche se potrei creare alcune classi di supporto per aiutare con la formattazione della posta elettronica e simili. Sarebbe molto utile poter condividere CSS, JavaScript, controlli e immagini tra progetti.
  • Dato che siamo un negozio Microsoft, ci sono dei vantaggi tangibili con qualcosa come MVC su Webform per questo specifico scenario? Sono venduto sul concetto di MVC nel suo insieme, ma mi aiuterebbe a mettere insieme un modulo di raccolta dati a 15 campi in modo più efficiente se tutto quel modulo fa è inviare un'e-mail? Il modulo che mi ha fatto pensare a questo aveva una buona logica incorporata per mostrare e nascondere i campi in base alle risposte dell'utente e sembra che sarebbe stato meno efficiente usare MVC e jQuery.

2
Cosa è stato migrato qui da meta? Dovrebbe essere su SO.
Josh K,

1
@Josh Stack Overflow è per le domande direttamente correlate a problemi specifici nel codice. La progettazione del programma e del flusso di lavoro è un argomento qui.

@Mark: Questo non suona molto soggettivo, in quanto non ci sarebbe una soluzione "best practice" ideale facilmente fornita. Non sono un ragazzo di SM, quindi non ho idea di quale sia la complicazione, tuttavia rischierei di indovinare che sarebbe meglio rispondere in modo non soggettivo.
Josh K,

Concordato. Questo sarebbe chiuso su SO.
Walter,

1
È già stato chiesto su SO qui
ChrisF

Risposte:


3

Il rifattorizzare in sicurezza senza prove è difficile e pieno di pericoli.

Vorrei iniziare con:

  • Scrivere casi di test che coprono i vari tipi di input in tali moduli e l'output previsto. Sembra che questo non richiederebbe troppo tempo poiché ritieni che la maggior parte di queste forme siano identiche nella funzionalità o vicine ad essa.

  • Esegui questi casi di test su circa 100 moduli (attiva la copertura del codice per aiutarti a tracciare i percorsi del codice).

Dopo di che sei in grado di vedere cosa puoi ripensare in modo sicuro, quindi puoi (un esempio):

  • Esegui il tuo strumento di rilevamento della duplicazione del codice (non sono sicuro di come si chiama in .NET, in Java abbiamo CPD). Rimuovere immediatamente 13 forme identiche. Ora riesegui i test - Yay! Passano tutti tranne il modulo 11, OK, quindi non possiamo ancora cancellarlo.

  • Rimuovere tutto il codice di formattazione e-mail locale e ottenere tutti i moduli per chiamare un modulo di elaborazione e-mail comune. Esegui i test, passano tutti tranne uno, hhmmm OK .... caratteri UTF-8, risolvilo nel modulo generico, esegui di nuovo i test, yay siamo tutti bravi!

risciacqua e ripeti.


2
+1 Vedi Michael Feathers che lavora in modo efficace con il codice legacy amazon.com/dp/0131177052 per suggerimenti su come affrontare il refactoring.
Michael Brown,

Ohhhh buon riferimento - mi piace quel libro.
Martijn Verburg,

0

Suggerirei di sottrarre la parte di presentazione. Utilizzando Model / View / Controller, inserire i moduli nella View e farli utilizzare lo stesso controller. Questo controller può eseguire un'azione generica, ad esempio inviare un'e-mail a un indirizzo predefinito o deviare i dati del modulo a un controller che può farlo. In questo modo tutto ciò che devi fare per creare un nuovo modulo è creare il modulo e indirizzare l'output a quel controller. Questa archetettura potrebbe essere contenuta in un singolo progetto, che ti permetterebbe di condividere CSS e javascript come hai detto.

Per gestire la formattazione delle e-mail, vorrei iniziare creando un formattatore generico, dicendone uno che elenchi solo i nomi e i valori degli elementi del modulo, nonché gli altri tipi di metadati stuf come il tempo inviato, ecc. Potresti renderlo fantasioso come vuoi . Quindi, se hai davvero bisogno di più gestione personalizzata di quella, aggiungi una fabbrica. La fabbrica restituisce un'interfaccia formatter. Quindi, all'interno della fabbrica, è possibile cercare un formattatore per quel modulo specifico o restituire quello generico se non esiste uno specifico. Questo design semplificherebbe anche il collaudo dell'unità del controller, poiché si potrebbe facilmente fornire un formattatore simulato a scopo di test.

Per inciso, non inserirò l'indirizzo e-mail come argomento del modulo. Se devi inviare più indirizzi ti suggerirei di avere una tabella di ricerca che contenga tutti i moduli e l'e-mail a cui inviarli. Questo potrebbe essere implementato in XML o in codice (ho visto entrambi, anche se non sono sicuro se uno dei due sia migliore). Ciò consentirà di evitare che gli spammer ottengano i tuoi indirizzi e-mail dalla pagina del modulo.


Grazie per la risposta. In questa architettura, dove gestiresti la formattazione delle e-mail che vengono inviate? Vorrei astrarre questo, ma non riesco a pensare a un modo per formattare senza creare un costruttore di stringhe e far cadere i campi tra i blocchi di testo statico. Questo sembra specifico per ogni modulo.
Josh Earl,

Inoltre, eventuali consigli sulla gestione della logica dei moduli come il popolamento di un menu a discesa basato sulla selezione in un altro menu a discesa? JQuery è l'unica opzione se siamo andati con il percorso MVC?
Josh Earl,

@JoshEarl: Ho elaborato un'idea per il formatter, ma non posso dare alcun suggerimento su jQuery, ecc. Il lato della pagina web non è un'area su cui mi sento completamente a disagio nel formulare raccomandazioni. Potrebbe essere necessario utilizzare un design MVC completo, un controller per pagina, se le cose sono troppo complicate. Come affermato da @Martijn, i test unitari ti aiuteranno a vedere esattamente quali sono i tuoi requisiti. Il mio design presuppone molta somiglianza tra le forme.
Michael K,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.