Domande sulla gestione del modello di applicazione

1

Considerare il seguente tipo di applicazione Web Java / Spring, con un database SQL:

  • ci sono più tipi di entità di dati (circa 100) con relazioni tra loro
  • le entità sono visualizzate, modificate o esposte alle API e spesso ciò accade con diversi tipi di entità (uniti)

L'approccio attuale utilizza tre livelli:

  • un livello dati, che interroga le tabelle e utilizza entità che corrispondono 1: 1 al database
  • un livello di servizio per eseguire la logica di business e chiamare il livello dati come necessario
  • un livello controller - esponendo le operazioni al codice lato client e all'API

Le mie domande relative alla gestione dei modelli sono:

  1. Ogni livello dovrebbe avere i propri modelli / classi di entità? Se sì, come è meglio gestire la copia / fusione dei modelli attraverso i livelli?
  2. A volte, a livello di servizio, un'entità potrebbe richiedere che alcuni campi vengano compilati in un caso, ma non in altri casi. Dovrebbero esserci due classi modello per queste due situazioni? (Per essere certo di poter contare su quali campi sono forniti dal servizio)
  3. Dato il gran numero di entità, vale la pena essere coerenti nell'affrontare le questioni di cui sopra nello stesso modo, indipendentemente da eventuali complessità aggiuntive coinvolte?
posta Mari9 06.05.2015 - 13:48
fonte

2 risposte

0
  1. Non penso che ogni livello debba avere le proprie classi di entità. Fare ciò moltiplicherebbe il numero di classi e aumenterebbe la complessità senza alcun beneficio reale. A volte un concetto dal livello di servizio non si adatta bene al DB relazionale (o altra tecnologia di persistenza), quindi è ragionevole creare classi di entità diverse, ma soprattutto non è necessario e si può avere la stessa classe di entità per tutti i livelli. Ma tieni presente che le cose cambieranno ei requisiti per un livello divergeranno dagli altri (ad esempio devi mantenere il vecchio contratto sul livello controller) - questo è il momento in cui devi essere preparato a creare classi di entità diverse per diversi casi d'uso. Se si utilizza un'entità per tutti i livelli, le modifiche interesseranno tutti i livelli, ad es. l'attributo di ridenominazione può eventualmente interrompere il contratto dei tuoi controllori.

  2. Questo di solito viene fatto per motivi di prestazioni. La cosa migliore da fare è evitarla il più possibile - fare attenzione ai pericoli di ottimizzazioni premature. Ma a volte questo è necessario e quindi è difficile dare una risposta - se questo è un caso speciale in cui viene utilizzata questa entità incompleta, si potrebbe andare bene semplicemente documentandolo. Se viene usato più spesso, dovresti creare una classe di entità speciale per questo, altrimenti ti perderai nel seguire la complessità.

  3. Personalmente ritengo sia meglio gestirlo singolarmente. Le entità si evolveranno in modo diverso e tentare di gestirle tutte in un modo unificato porterà un sacco di spese generali e inutili complessità.

Quindi, il mio consiglio è di creare entità per livello solo quando è necessario / significativo. Ma devi tenere a mente le conseguenze ed essere pronto a dividere la classe di entità una volta che se ne presenta la necessità.

Inoltre, fai attenzione alle transazioni. È troppo facile dimenticare se ci si trova in un contesto transazionale o meno, soprattutto se si utilizzano ovunque le stesse classi di entità. Dalla mia esperienza, di solito è bene avere una chiara demarcazione transazionale - vale a dire che l'intero livello di servizio è transazionale (di default), tutto ciò che è esterno (controllori, attività, ecc.) Non lo è.

    
risposta data 06.05.2015 - 17:28
fonte
0
  1. Probabilmente "dovrebbe" tuttavia non lo consiglio. Mappare il livello dati direttamente sul modello in un repository, utilizzare ViewModels nel livello controller, ma solo avvolgere i modelli e aggiungere dati aggiuntivi laddove richiesto anziché duplicarli.

  2. Questo mi sembra strano. Probabilmente un segno che hai bisogno di un altro modello

  3. Non dovrebbe essere complicato. Raccomando di NON scrivere il tuo codice generico mapper / orm

risposta data 06.05.2015 - 13:56
fonte

Leggi altre domande sui tag