Refactoring di un sistema live strettamente accoppiato con modelli di dati e logiche di business impropri nel front-end

4

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:

  1. Rif. il front-end JavaScript per comprendere la logica aziendale
  2. Riforma il livello intermedio per includere la convalida
  3. Rif. database per disaccoppiare i modelli di dati
  4. Migrazione dei dati
  5. Riforma il livello intermedio per disaccoppiare i modelli di dati
  6. 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?
posta Pete 07.05.2014 - 19:05
fonte

2 risposte

7

Non si tratta di efficienza, si tratta di mantenere un sistema funzionante. Mi piace paragonare il refactoring all'arrampicata in montagna. Non rimuovi mai la sicurezza precedente fino a quando non è in atto il successivo. Sì, è laborioso. Sì, sembra che ci voglia più tempo, ma le conseguenze di eventuali errori sono molto più piccole.

Inoltre, in genere vuoi pensare al refactoring in termini di sezioni verticali. Fai il minimo necessario per migliorare una piccola parte in tutti i livelli. Ad esempio, invece di affrontare l'intero database in una volta, scegli una tabella o anche un campo e passa attraverso tutti e sei i passaggi, quindi ripeti per un'altra tabella. Imparerai le cose ogni volta che ciò renderà le cose più facili nei turni successivi, quindi fai in modo che il tuo feedback sia il più breve possibile.

Come effetto collaterale, i cicli brevi facilitano l'acquisto dalla direzione. "Ricorda quanto i miei cambiamenti hanno accelerato la pagina delle fatture? Voglio fare la stessa cosa per il carrello degli acquisti, il che dovrebbe anche rendere questa nuova funzione più veloce da aggiungere e più robusta."

    
risposta data 07.05.2014 - 20:32
fonte
3

Lo scenario di cui parli (e Funzionante in modo efficace con il codice legacy ) probabilmente non ti consente di seguire un piano a lungo termine. È bello sapere dove vorresti arrivare, ma in genere in un sistema live la maggior parte del refactoring avviene a piccoli passi al servizio di una particolare correzione di bug o di una nuova funzionalità.

L'ordine di refactoring è quindi determinato in modo significativo da quali esigenze aziendali hanno una priorità sufficientemente elevata su cui lavorare. Tuttavia, per ogni storia su cui lavori, dovrai decidere quanta tecnica di refactoring debba assumere e come affrontarla, e potresti anche essere in grado di eliminare anche alcuni refactoring non direttamente (business).

Quando hai una scelta darebbe priorità (ma non assoluta) alla priorità di non rompere le cose, e seconda priorità a ottenere pezzi del sistema sotto test. Entrambi hanno una priorità più alta rispetto alla progettazione pulita, poiché è possibile ripulire il progetto in modo molto più efficace se il sistema è in fase di test.

Per il tuo esempio specifico è difficile prevedere in anticipo quale ordine si dovrebbe finire con il refactoring. La mia ipotesi è che perlomeno dipenda dall'interfaccia utente - una volta che l'interfaccia utente si è occupata del livello intermedio tramite un'API più ragionevole, probabilmente si separerebbe ulteriormente la logica aziendale dal database in modo da poter effettuare il refactoring del DB e migrare i dati. Si spera che il modello di dati modificato non sia visibile all'interfaccia utente e non richiederebbe modifiche all'interfaccia utente.

Ma probabilmente questo processo si sta verificando in qualche modo in parallelo con diverse parti dell'applicazione, e in alcuni casi potrebbe finire in un ordine diverso.

Il refactoring di un sistema live è in genere necessariamente un processo opportunistico e dal basso verso l'alto per sapere in anticipo quale sarà l'ordine.

    
risposta data 07.05.2014 - 20:17
fonte

Leggi altre domande sui tag