Sto lavorando con un framework in cui i campi visualizzati su ogni pagina web sono definiti nel database dell'applicazione. Gli amministratori possono aggiungere nuovi campi alle pagine o nascondere / cancellare completamente i vecchi campi. La logica per ogni pagina è in una classe Java - a volte esiste una relazione uno a uno tra una pagina e una classe, a volte più pagine usano la stessa classe.
Il problema
Questa struttura del framework crea una dipendenza nascosta tra i dati della pagina nel database e la logica nella classe Java. Se un nuovo campo viene aggiunto a una pagina, la classe Java corrispondente deve fornire quel campo, altrimenti la pagina si interromperà. Il codice Java non ha alcuna conoscenza in fase di compilazione del modo in cui la pagina è configurata nel database (ciascun database clienti può avere configurazioni diverse), il che aumenta la fragilità.
Una soluzione tipica è stata SELECT * da una o più tabelle del database, consentendo un certo grado di configurazione su quali campi possono essere visualizzati. Questo porta al codice Java basato su database con un sacco di SQL incorporato e modelli di progettazione o dominio poco orientati agli oggetti.
Piani soluzione
Abbiamo introdotto un'architettura MVC a tre livelli (controller - > servizio - > repository) con modelli orientati agli oggetti per il framework. Limita la possibilità di aggiungere campi alle pagine senza modificare il codice sottostante. Tuttavia, la modifica rende possibile programmare in modo orientato agli oggetti e creare modelli di dominio. In seguito, stiamo pianificando di fare qualcosa sulla dipendenza tra database e codice.
Il mio piano a lungo termine sarebbe spostare le definizioni di pagina dal database nel codice (le visualizzazioni HTML e JS standard), limitando la configurabilità ma riducendo la fragilità. Qualsiasi incompatibilità tra le pagine e Java diventerebbe quindi errori del compilatore durante la creazione dell'applicazione al posto degli errori di runtime.
Question (s)
- Consideri la pratica del framework di definire la vista nel database e il controller nel codice come sound design o qualcosa che dovrebbe essere affrontato?
- Se ritieni che la situazione debba essere affrontata, il mio piano a lungo termine sembra ragionevole?
Modifica
Oltre a definire il layout, le definizioni di vista nel database definiscono quali campi dovrebbero esistere - "get field 'foobar" dal controller e mostrarlo qui ". Le viste stesse non contengono realmente la logica. Le classi Java che eseguono il backup delle viste contengono in genere migliaia di righe di interfaccia utente e logica aziendale.