Abbiamo un'applicazione in cui il cliente ha cambiato idea su una vasta area di funzionalità e quest'area richiede una grande quantità di rielaborazione.
Sebbene la rilavorazione in sé non sia un problema, ha introdotto una situazione in cui l'impatto dei cambiamenti è ampio e comprende:
- Dati
- Query Logic / Struttura tabella
- Logica aziendale
- Display / Presentazione
Idealmente vorremmo incorporare questi cambiamenti contemporaneamente a molti altri flussi di sviluppo, ma siamo preoccupati che l'impatto dei cambiamenti avrà un impatto negativo sulla frequenza con cui possiamo fornire. Siamo in grado di provvedere ad alcuni di questi attraverso i rami, ma mi ha fatto chiedere quali sono le possibilità per proteggersi da questo tipo di cose dal punto di vista dell'architettura applicativa o della pratica di sviluppo.
Le cose che facciamo attualmente:
- Logica di query astratta nei repository: è ideale per piccole modifiche, ma quando la logica generale in un'area cambia, ad es. invece di ottenere un elenco di utenti che soddisfano determinati criteri, dobbiamo ora ottenere un elenco di organizzazioni che hanno aderito alle posizioni.
- Logica aziendale astratta in servizi - Questo è esattamente lo stesso dei repository in quanto non possiamo davvero evitare interi cambi logici, ma piccole modifiche possono essere accolte con un impatto limitato.
- Assicurati che la configurazione sia fuori dal codice che richiede una nuova distribuzione, una combinazione di righe del database o valori di web.config.
- Altri modelli che promuovono aspetti di flessibilità come le fabbriche, ove opportuno, ecc.
- Feature flag per la selezione della funzionalità se originariamente venivano sviluppati due approcci. etc
Esistono altre best practice attuali per proteggersi dai cambiamenti, senza incorporare i rami ecc.