Scenario
Questo era un progetto che dovevo mantenere una volta. Dopo aver letto Lavorare efficacemente con il codice legacy , ho iniziato a pensare a come avrei rifattorizzato questo sistema in un ambiente live, se dovessi (per fortuna, non l'ho fatto).
Il sistema era un sistema legacy senza documentazione e strettamente accoppiato. Le relazioni tra database sono state modellate in modo errato, ad esempio gli oggetti che erano destinati a essere molti a uno venivano mappati come uno a uno. L'uso della "duplicazione" è consentito per le relazioni "pseudo-molti-a-uno". La logica aziendale è stata archiviata come JavaScript esclusivamente sul front-end. I dati erano strettamente associati ai dati della presentazione.
Ad esempio, un oggetto domanda non può esistere senza un oggetto cella di tabella. Il database aveva una tabella chiamata "TableCell" per memorizzare CSS inline per ogni cella che era mappata uno a uno con un oggetto "Domanda".
Il sistema è stato un pasticcio terribile e alla fine ha portato alla perdita di dati e alla completa riscrittura alla fine. In totale il progetto era di circa 350.000 LOC.
Come nota a margine, il motivo per cui il sistema è stato riscritto (o necessario per il refactoring) era che doveva essere esposto a Internet, ma siamo stati in grado di modificare la logica aziendale utilizzando Chrome Debugger per elevare i ruoli, inserire codice ed eseguire tutti i tipi di funzioni indesiderate.
Domanda
Il libro utilizzava esempi in cui la logica era collocata nel livello intermedio. Tuttavia, cosa succede quando la logica aziendale viene inserita nel front-end? Dal mio punto di vista il processo di refactoring dovrebbe andare in questo modo:
- Rif. il front-end JavaScript per comprendere la logica aziendale
- Riforma il livello intermedio per includere la convalida
- Rif. database per disaccoppiare i modelli di dati
- Migrazione dei dati
- Riforma il livello intermedio per disaccoppiare i modelli di dati
- Rif. il front-end per riflettere le modifiche nei modelli di dati.
Ho letto Tecniche per ridimensionare i rifiuti e mantenere sanità mentale? ed è utile, ma non affronta l'ordine in cui dovrebbe avvenire il refactoring per questo specifico scenario. Questo processo sembra aggiungere molta ridondanza poiché il front-end e il middle-tier sono refactored due volte nel sistema live.
- Quale è un modo più efficiente di refactoring di tale sistema mantenendo il sistema live?