MVC: modelli completamente popolati o modelli parzialmente riempiti?


10

Questo mi ha perseguitato per così tanto tempo. Quando fai la programmazione MVC quale pensi sia la migliore pratica di programmazione? Si dovrebbero usare modelli completamente popolati o parzialmente riempiti, specialmente quando so che per questo particolare compito avrò bisogno solo di 2 campi dall'oggetto modello che ne ha altri 5?

A volte sembra solo criminale riempire un elenco di 20 oggetti modello con tutti i valori del database quando sai che ne avrai bisogno solo alcuni.

Naturalmente il modello parziale significa che dovrai scrivere un altro metodo nel tuo DAO oltre a quello che recupera tutto. Quale significa più codice da mantenere?

D'altra parte, estrarre tutto da DB con modelli completamente popolati significa che un metodo serve a tutti ma questo ovviamente ti darà un certo sovraccarico di prestazioni.

Posso vedere ORM (come Hibernate o ActiveRecord of Rails) che favorisce le tendenze nella programmazione MVC e database come i modelli completi di BigTable di Google è una tendenza accettata. Ma cosa succede se stai ancora usando il buon vecchio JDBC?

L'hardware è economico, lo sviluppo è costoso. È davvero vero anche quando l'app deve ridimensionare a poche centinaia di migliaia di richieste all'ora?


1
"D'altra parte, estrarre tutto da DB con modelli completamente popolati significa che un metodo serve a tutti ma questo ovviamente ti darà un certo sovraccarico di prestazioni." Davvero? Hai misurato un sovraccarico prestazionale da questa pratica?
S.Lott

>> Davvero? Hai misurato un certo sovraccarico di prestazioni da questa pratica? << - Mi aspettavo questo. No non l'ho fatto. Ma sarebbe interessante misurare e essere smentito altrimenti.
Pritam Barhate,

È difficile dimostrare che le spese generali non esistono. Puoi facilmente cavillare su molti dettagli sostenendo che le misure non sono valide per alcune situazioni. È molto più bello se usi la tua configurazione "tipica" di database, linguaggio applicativo, ecc. E profili la tua configurazione preferita per mostrare quali sono le spese generali effettive, quindi non dobbiamo cavillare sui vari fattori che abbiamo lasciato fuori dalle nostre misurazioni .
S.Lott

1
Ho trovato un eccellente articolo che tratta della questione dell'esposizione del modello di dominio rispetto all'invio di un DTO all'indirizzo msdn.microsoft.com/en-us/magazine/ee236638.aspx .
Mayo,

Risposte:


3

Hai due opzioni:

1) Lasciare alcuni campi nel modello vuoti

2) Crea un modello "lite" extra per la tua situazione specifica

Quale scegliere dipende di nuovo dalle due cose:

a) Quanti campi del modello "completo" verranno ignorati

b) Con quale frequenza verrà istanziato questo modello "lite"

Se ci sono solo un paio o più campi che possono essere riempiti, va bene andare con 1).

Se b) è solo una situazione individuale eccezionale, forse non ha senso creare un modello aggiuntivo solo per un caso d'uso.

Un altro approccio è quello di definire un modello "lite" ed ereditare da esso il modello "completo".


Grazie per la risposta. Ha senso fare un modello lite a seconda delle necessità. Ma a volte mi chiedo che una tale strategia non crei troppe classi modello? Soprattutto se sto realizzando modelli specifici per le visualizzazioni piuttosto che modelli specifici per la logica aziendale.
Pritam Barhate,

3

Se la tua vista richiede solo 2 proprietà dal modello, allora (probabilmente) hai il modello sbagliato per quel caso d'uso! Vorrei cercare di creare un modello adatto alla vista, salvare le ricerche DB aggiuntive e popolare solo i dati necessari. Se una vista successiva necessita di maggiori dettagli, è necessario chiedere, riceverò successivamente i dati extra o dovrei metterli tutti in anticipo ...

In alternativa, puoi esaminare una sorta di valutazione pigra, quindi i valori vengono popolati quando ne hai bisogno. Questo può funzionare bene, ma ovviamente è più lavoro e può finire per causare più round trip sul DB, il che non è eccezionale se si finisce per farlo molto.

Detto questo, se sostanzialmente stai selezionando alcuni campi extra da una tabella o vista, il costo per ottenere quei dati extra è, a tutti gli effetti zero (OK, ci sono più byte sul filo, ma i costi maggiori sono probabilmente essere nella creazione e nello smantellamento di una connessione), quindi se c'è una possibilità avrai bisogno di alcuni dati extra Probabilmente popolerei completamente il modello una volta che sei felice di avere il modello giusto .

L'hardware è economico, ma nessuna quantità di hardware può far funzionare bene un design errato.


2
>> Se la tua vista richiede solo 2 proprietà dal modello, hai il modello sbagliato! << - Non è necessario indossarlo sempre. Caso tipico mostra l'elenco dei risultati di ricerca nelle applicazioni aziendali. Ad esempio in un CRM - cliente - principalmente uno mostrerà solo il nome e uno o 2 campi importanti in un elenco di ricerca. Ma il CRM avrà parecchi altri campi associati a quel cliente.
Pritam Barhate,

1
La domanda dice che in questo caso sono necessarie solo 2 proprietà.
Steve,

-2

Il modello non è un DAO.

E un'altra cosa: se dici di avere 20 modelli (clienti, dal tuo esempio), allora questo non è un modello MVC. Il modello di dominio non viene mappato direttamente su una singola riga di tabella. Invece dovrebbe essere responsabile di tutte le operazioni eseguite con i "clienti".

Nel tuo esempio, "Cliente" non è un modello di dominio, ma solo un oggetto all'interno del modello.

Per quanto riguarda l'interazione con il database, tale responsabilità dovrebbe essere delegata a un oggetto mapper di dati , che dovrebbe sapere come archiviare e recuperare le istanze della classe Customer.


PS se hai la logica del database all'interno del modello, spingerà la logica aziendale del dominio nel controller.
Mefisto,

1
Una classe che esegue tutte le operazioni per i clienti è una cattiva idea in quanto sarà difficile da mantenere.
Andy,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.