Framework in cui le viste sono definite nel database - difetto di progettazione o ragionevole?

2

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)

  1. 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?
  2. 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.

    
posta user113850 06.01.2014 - 21:44
fonte

3 risposte

2

Se il tuo attuale requisito software è che le visualizzazioni siano personalizzabili dal cliente, quindi memorizzare le definizioni di visualizzazione nel database non è affatto un approccio irragionevole.

Penso che scoprirete che il design convenzionale del Model-View-Controller si rompe quando il vostro requisito è la personalizzazione dell'utente, per tutti tranne che per gli scenari più semplici. Di conseguenza, convertire la tua applicazione in un design più ortodosso sarà un esercizio di frustrazione, a meno che tu non valuti attentamente i pro e i contro.

Immagino una sorta di sistema ibrido in cui l'SQL e le viste sono generate dinamicamente, in modo che solo le informazioni richieste siano passate attraverso il filo. Puoi anche utilizzare una sorta di sistema di template Javascript nel browser. Ma non assomiglierà ad un sistema MVC convenzionale, perché MVC è progettato per aiutare il programmatore, non l'utente.

In un mondo perfetto, le tue visualizzazioni personalizzate sono limitate a una piccola parte del sistema e la maggior parte dell'applicazione è effettivamente "cablata". In altre parole, non genererai personalizzati tutti i tuoi punti di vista, ma solo alcuni di essi, lasciando le viste più ortodosse nelle mani capaci di MVC e generando le viste personalizzate solo se necessario.

    
risposta data 06.01.2014 - 23:16
fonte
1

Posso immaginare una rappresentazione della vista basata su database che consente di modificare le viste in modo dinamico, senza ricompilazione di alcun codice. Se questo è il tuo caso, sospetto che il design abbia qualche merito.

Se il codice Java ha bisogno di per essere aggiornato quando i dati che descrivono una vista nel DB sono cambiati, non penso che il design sia buono; la descrizione è meglio essere contenuta nel codice.

In ogni caso, "un sacco di SQL incorporato" suona abbastanza male. Penserei a una specie di ORM.

    
risposta data 06.01.2014 - 22:25
fonte
0

Prendi in considerazione la pratica del framework di definire la vista nel database e il controller nel codice come sound design o qualcosa che dovrebbe essere indirizzato?

Ritengo che la memorizzazione di informazioni specifiche dell'utente nel livello dati sia un eccellente principio di progettazione ed è perfettamente compatibile con le buone pratiche di programmazione. Soprattutto se al pubblico previsto verrà fornito uno strumento, anche se solo SQL, per gestire le loro "viste".

Detto questo, sono d'accordo sul fatto che do abbia un problema, sebbene sia più astratto di quello che hai affermato. Il tuo framework deve avere un modo chiaro e ragionevole per gestire scelte utente inaspettate.

Se pensi che la situazione debba essere affrontata, il mio piano a lungo termine sembra ragionevole?

Se causa problemi, dovrebbe essere sicuramente risolto. Ma il piano appropriato dipende da quale sia l'effettivo problema , piuttosto che dal problema che hai identificato.

  1. Se il problema è come il vostro sito si comporta se il database non è come previsto , si dovrebbe includere i test e le eccezioni in tal senso nel vostro strato di dati di Java, e assicuratevi di avere un programma di costruzione di database, scritto in Java o qualsiasi altra cosa, in grado di creare le viste e le tabelle necessarie nel database di destinazione.

  2. Se il problema è utenti che creano visualizzazioni non valide , dovresti considerare se è possibile fornire un comportamento predefinito nel tuo sito. E 'difficile essere precisi senza sapere se i vostri "punti di vista" sono viste del database oi risultati di query di database, ma o la gestione di SQL standard di colonna-tipi o limitare "sul campo" righe a una lista di "tipi di campo" dovrebbe essere parte del quadro di design. (Omettere con garbo un campo non valido non è una soluzione terribile, per favore.)

  3. Se il tuo problema è codice SQL in Java , potresti non avere alcun problema. Tale codice dovrebbe essere spostato su una classe di connessione database dedicata come parte del refactoring, ma la scelta tra una stringa SQL generata da Java e una stored procedure di database è un dettaglio di implementazione, e si dovrebbe solo correre il rischio di spostarsi da l'uno per l'altro se si ha una chiara aspettativa di aumento delle prestazioni.

  4. Infine, se il tuo problema è difficoltà o ritardi nella creazione di nuove pagine , dovresti valutare il processo di creazione di queste pagine. Se la maggior parte del lavoro non viene effettivamente svolto dalla tua base di utenti, ma viene svolto dal tuo team Java, lo spostamento del codice necessario in Java potrebbe avere senso. Soprattutto se il tuo team di Java non ha familiarità con SQL.

Come ho detto sopra, è difficile diagnosticare l'adeguatezza di una linea di condotta senza conoscere le specifiche del framework in questione. Tutto il software, in particolare i framework applicativi, è un mezzo per un fine e uno spostamento della complessità dal tempo di esecuzione al tempo di progettazione. Gli aspetti specifici di un corso appropriato sono influenzati molto più da "cosa stai cercando di fare" che "cosa dovrebbe essere fatto".

    
risposta data 06.01.2014 - 23:33
fonte

Leggi altre domande sui tag