Nel pattern MV * dove va il modello non commerciale?

1

Sto passando le voci del menu a View from ViewModel. La mia definizione di menu è un modello con proprietà titolo, immagine, hasChildren e isEnabled. Ma questo modello è pensato per l'interfaccia utente a differenza dei modelli di dominio aziendale come Person, ContactDetail, Transaction, ecc.

Quindi, quando vedo questo modello di menu seduto con modelli di domini aziendali mi sono sentito inquinato. C'è un posto giusto per mettere questo tipo di modelli specifici per l'interfaccia utente?

Grazie.

    
posta Saran 21.02.2014 - 12:11
fonte

4 risposte

1

I am passing Menu items to View from ViewModel.

Penso che tu sia molto vicino ma manca leggermente il marchio su MVVM. Non sono sicuro di quale linguaggio / quadro applichi questo, quindi risponderò genericamente. So che .NET è tipico quando ascolti MVVM ma il pattern può essere applicato ovunque.

Lasciatemi iniziare correggendo la tua affermazione iniziale:

I am passing menu ViewModels to the View.

Hai assolutamente ragione di considerare questo modello specifico della vista di una voce di menu distinto dai tuoi modelli di dominio aziendale. Assicurati di chiamarli ViewModels anziché Modelli.

Per quanto riguarda dove li metti, hai alcune opzioni. Puoi metterli nella stessa cartella dei tuoi modelli, ma nominarli distintamente come ViewModels. Puoi anche dare loro la propria directory, quindi i tuoi Modelli e ViewModels non sono mescolati. È tutta una questione di organizzazione del codice e una di queste opzioni è valida. Forse quest'ultimo (cartelle separate) è leggermente più pulito.

Nota, non ho detto da dove vengono passati ViewModels. Un modo migliore per pensare a come i modelli, i ViewModels e le viste passano l'un l'altro è descrivere dove sono stati consumati. Ciò dipende anche dal tuo framework su come le cose vengono passate (o dichiarate), ma ecco l'idea di base.

La vista può fare riferimento a un ViewModel con i dati necessari per il binding. The View non ha alcun concetto di modello di business, o almeno non funziona direttamente con uno.

ViewModel può fare riferimento a un modello. Potrebbe ottenere dati da esso, o persino invocare i metodi del modello per ricavare dati. Potrebbe anche avere una logica propria, logica che è specifica della vista rispetto al dominio specifico. Spesso è un sottoinsieme del Modello originale, con la responsabilità aggiuntiva delle preoccupazioni specifiche della vista come le date e i numeri di formattazione. ViewModel non ha bisogno di conoscere la vista e potrebbe anche essere utilizzato da più viste.

Il modello non ha alcun concetto di ViewModels o Views. È il tuo puro modello di business / oggetto di dominio. Potrebbe gestire calcoli o derivazioni di dati basati sulla logica aziendale. Non dovrebbe interessarsi a problemi di presentazione come la formattazione.

Per ulteriori letture, suggerisco la sezione intitolata The Evolution of Model-View-ViewModel in questo articolo , in particolare, gli ultimi due paragrafi di quella sezione.

    
risposta data 22.02.2014 - 20:13
fonte
0

Il modello MVC è il modello del livello più alto. L'interfaccia utente, di per sé può essere considerata come un altro SW, un livello di astrazione sotto. Ma esso stesso può avere le sue entità (la configurazione dell'interfaccia utente persistente, impostata dall'utente) e il suo modello, menzionato da te.

Qui arriviamo a una contraddizione, ovviamente. Solo i componenti del livello Controller dovrebbero parlare tra loro, secondo il modello ... Ma queste funzioni di controllo non hanno nulla in comune! Ma questa è una contraddizione solo se prendiamo alla lettera la concezione MVC. I tre "strati" puri possono servire solo per le architetture più primitive, dove ci sono solo due poli: dati e utente, e definiamo gli strati lungo il legame tra loro. Una vera applicazione ha molti di questi poli. E qualsiasi legame tra un polo e l'altro può e deve essere tagliato a strati.

La definizione di questi poli dipende da te, non conosco la complessità del tuo lavoro, ma poiché ovviamente vuoi un'interfaccia dinamica, ci saranno pali albero minimamente - Dati aziendali, Dati interfaccia e utente. Ci sono due vincoli: User-BuD e User-InD. E avrai due controller diversi - per ognuno di essi. Puoi anche avere due interfacce: l'interfaccia normale e l'inferface per le impostazioni dell'interfaccia. Questi ultimi due avranno elementi comuni. Abbastanza divertente, a questo livello di astrazione i controller non coopereranno tra loro e le interfacce - lo faranno.

A proposito, anche questa architettura è molto semplificata, perché hai bisogno anche dei dati di amministrazione? forse dati di licenza? E devi anche servirli.

    
risposta data 21.02.2014 - 12:42
fonte
0

Stai lavorando sulla Vista all'interno del tuo Modello / Visualizza / Controller.

Il modello è il business della tua applicazione. La vista visualizza elementi visivi (in questo caso un menu) e il controllore gestisce l'interazione dinamica dell'utente (quali sequenze di tasti fanno cosa, quali selezioni del puntatore chiedono alla vista di essere attive, ecc.) La vista e il controller sono quasi sempre strettamente legati. Ovviamente nel mondo HTML non pensiamo praticamente all'aspetto del controller dell'interfaccia utente, ma nella scrittura di applicazioni native è molto più pratico di quanto non sia ora.

La maggior parte delle classi in M, V e C hanno variabili di istanza. Non è necessario essere imbarazzati che il tuo menu (cioè la vista) abbia lo stato, è comunque perfettamente valido pensarlo come parte della vista.

Ho anche l'idea che potresti sottoclasse (o no) molti diversi design di menu all'interno della tua vista, ma non devi pensare agli attributi come al modello. Sono lo stato necessario per rendere la vista e il dettaglio appartiene alla vista.

    
risposta data 22.02.2014 - 00:32
fonte
0

In .net mvc esiste un concetto chiamato modello di visualizzazione, che è una classe che intende prendere modelli di dominio 1-n e implementarli per una vista specifica. Era diventata una best practice per applicazioni più complesse includere un modello di visualizzazione per ogni vista. Troverai anche una pratica simile in django con modelliformi.

Il pattern mv * non significa che non puoi scrivere classi per integrare i tuoi modelli di dominio. Ma quelle classi non dovrebbero essere nella struttura del tuo modello di dominio. Il modello è un mezzo per implementare il SOC e, avendo il dominio dei modelli di dominio e dell'interfaccia utente, interrompe la separazione.

Implementerei un ulteriore livello di classe dell'interfaccia utente per tradurre i modelli di dominio in interfacce diverse e fare in modo che le viste parlino con questo livello.

    
risposta data 22.02.2014 - 00:51
fonte

Leggi altre domande sui tag