Sto lavorando a un progetto che è una riscrittura di un software legacy esistente. Il software legacy consiste principalmente di operazioni CRUD (creazione, lettura, aggiornamento, eliminazione) su un database SQL.
Nonostante lo stile di codifica basato su CRUD, il software legacy è estremamente complesso. Questa complessità del software non è solo il risultato della complessità del dominio del problema stesso, ma anche il risultato di una decisione di progettazione scarsa (e regolarmente al limite della pazzia). Questa scarsa codifica ha portato alla mancanza di integrità dei dati nel database. Questi problemi di integrità non sono solo in termini di relazioni (chiavi esterne), ma anche in termini di integrità all'interno di una singola riga. Ad esempio, il significato della colonna "x" a titolo definitivo contraddice il significato della colonna "y". (Prima di chiedere, la risposta è "sì", ho analizzato il dominio del problema e ho capito correttamente il significato e lo scopo di queste colonne, e meglio degli sviluppatori di software originali che sembra).
Durante la scrittura del software sostitutivo, ho utilizzato i principi di Domain Driven Design e Command Query Reponsibility Segregation, principalmente a causa della complessità del dominio. Ad esempio, ho progettato root aggregati per applicare invarianti nel modello di scrittura, i gestori di comandi per eseguire controlli di coerenza "incrociati", gestori di query per interrogare dati denializzati intenzionalmente in modo appropriato per vari schermi, ecc. Ecc.
Il software di sostituzione funziona molto bene quando si inseriscono nuovi dati, in termini di precisione e facilità d'uso. A tale riguardo, ha successo. Tuttavia, poiché i dati esistenti sono pieni di problemi di integrità, le operazioni che coinvolgono i dati esistenti falliscono regolarmente generando un'eccezione. Ciò si verifica in genere perché non è possibile leggere un aggregato da un repository poiché i dati passati al costruttore violano gli invarianti dell'aggregato.
Come devo gestire questi dati legacy che "infrangono le regole". Il vecchio software ha funzionato bene a questo riguardo, perché eseguito quasi senza convalida. A causa di questa mancanza di convalida, è stato facile per gli utenti inesperti inserire dati privi di senso (e gli utenti esperti sono diventati molto preziosi perché avevano anni di comprensione delle "idiosincrasie").
I dati stessi sono molto importanti, quindi non possono essere scartati. Cosa posso fare? Ho provato a risolvere i problemi di integrità mentre andavo, e in alcuni casi ciò ha funzionato, ma in altri è quasi impossibile (ad esempio, i dati sono completamente mancanti dal database perché gli sviluppatori originali hanno deciso di non salvarlo). L'enorme numero di problemi di integrità dei dati è schiacciante.
Che cosa posso fare?
(nota che questa domanda è stata spostata da StackOverflow.)