In MVC un modello dovrebbe contenere modelli di subview?

8

Alcuni sfondi:

Io e un collega abbiamo interpretazioni diverse di MVC, il che significa che, visto lo stesso problema, stiamo arrivando a soluzioni radicalmente diverse. Viene da uno sfondo Java in cui ogni componente di MVC può tradizionalmente modellare un oggetto e io provengo da uno sfondo Haskell e ho poca o nessuna esperienza con OOP.

Lo spazio del problema:

Il problema che stiamo cercando di modellare agisce un po 'come un ambiente desktop. Abbiamo una nozione della sessione degli utenti (forse il loro login, il loro sfondo del desktop) e i processi sul loro desktop (ad esempio iTunes, Finder, ecc.) Che hanno le loro proprietà del modello (ridotte al minimo, ecc.).

Siamo d'accordo sul seguente punto: pensiamo che HMVC sia la migliore rappresentazione. Siamo d'accordo che abbiamo due oggetti MVC, Session (desktop) e Process (applicazione) e che non vogliamo un Process per avere una nozione di Session o un backlink.

Una volta che non siamo d'accordo, tuttavia, è il significato principale di MVC e in che modo influisce su dove manteniamo l'elenco dei processi sul desktop degli utenti .

La sua interpretazione:

Egli sostiene un punto molto valido che tradizionalmente è facile da modellare nel codice e nel nostro sistema di rendering. Dice che l'elenco dei processi dovrebbe essere un elenco di oggetti ProcessController all'interno di SessionController che a loro volta hanno i loro modelli come oggetti separati al loro interno. Ciò significa che esiste una quantità significativa di stato sia in SessionController che in SessionModel che è rilevante per il rendering di SessionView .

Questo sembra essere molto in armonia con ciò che siamo stati in grado di leggere su Internet in una breve ricerca.

La mia interpretazione:

La mia interpretazione richiede il più grande cambiamento architettonico e sembra più difficile da implementare nel codice, ma credo che sia più concettualmente corretto. Vorrei che qualcuno spiegasse perché questo non è il caso, o presentare un modello diverso (se non MVC) che si allinea con questa interpretazione e evidenzia alcuni punti di forza e di debolezza per entrambi i modelli in modo che possiamo prendere la decisione più consapevole (nessuno di noi ha un strong background nell'architettura software).

Vedo MVC come una triade con tre componenti intercambiabili: il Model , il Controller e il View . Ciò concorda con ciò che sono in grado di leggere su Internet e alcune fonti diranno cose simili a "viste, controller e modelli con la stessa interfaccia dovrebbero essere intercambiabili con effetti diversi". Il modo in cui immagino che funzioni è il seguente:

  • Quando si scambia il modello, si cambia il modo in cui i dati vengono convalidati o archiviati
  • Quando cambi il controller, stai cambiando il modo in cui si comporta , ma non tutto ciò che potrebbe alterare il contenuto di dati della pagina c della pagina
  • Quando si cambia la vista, si modifica il modo in cui la pagina viene visualizzata

Da questo, ho dedotto che dato un qualsiasi Model e View , lo scambio solo del controller non dovrebbe cambiare i dati inizialmente visualizzati dalla pagina perché il controller dovrebbe cambiare solo il comportamento e non il 'contenuto' della pagina. Penso che questo sia allineato con la visualizzazione concettuale del controller come un "controller di stazione" in un sistema a binario, un piano del binario come modello e l'effettiva manifestazione fisica e il look / feel delle tracce (in diversi gusti, diciamo " Real 'o' Virtual 3D ') come vista.

Ecco dove non siamo d'accordo:

Ritengo che i dati che verranno visualizzati all'utente in SessionView vengano modificati dai diversi processi sul desktop (modifico i processi come dati rilevanti ), il SessionModel dovrebbe contenere l'elenco di istanze di ProcessModel . Ciò significa che l'utilizzo di qualsiasi SessionController casuale con lo stesso SessionView dovrebbe concettualmente mostrare gli stessi dati (processi sul desktop).

Sostiene che ha più senso per un Model non sapere mai su un altro modello. Ciò significa che SessionController avrebbe una lista di ProcessController s al suo interno e ogni oggetto Controller ha un link al suo modello. Dato un SessionView e lo stesso SessionModel ma un diverso SessionController i dati visualizzati all'utente devono essere radicalmente diversi.

Si prega di discutere per / contro ogni interpretazione e aiutarci a raggiungere il risultato più informato.

Grazie per il tuo tempo!

    
posta kvanberendonck 06.12.2014 - 00:55
fonte

1 risposta

6

La chiave per comprendere MVC è la separazione delle responsabilità, poiché MVC è semplicemente SRP applicato all'interfaccia utente codice. Separa i dati da visualizzare, da come visualizzarli, da come gestire gli eventi sullo schermo. Ma un dettaglio importante (e spesso mancato) della definizione originale di MVC è che è stato progettato per un livello molto più granulare. Ad esempio, avresti oggetti ButtonModel, ButtonView e ButtonController, "solo" per presentare un singolo pulsante su uno schermo. Manca questo dettaglio è ciò che provoca così tante opinioni diverse sull'argomento. Puoi controllare l' architettura Java Swing per vedere cosa intendo.

Il punto di MVC è di consentire che il codice che serve a ciascuna responsabilità venga modificato senza influenzare il codice per gli altri. Ad esempio, sarà possibile cambiare il rendering di (un componente sullo schermo) senza dover toccare la rappresentazione dei dati né la logica di gestione degli eventi. Quindi, in una certa misura, questo va di pari passo con ciò che dici qui:

From this, I reasoned that given any Model and View, swapping only the controller should not change the data the page initially renders because the controller should change only the behaviour and not the 'content' of the page. I think this aligns with the conceptual visualisation of the controller as a 'station controller' in a rail system, a plan of the rail road as the model and the actual physical manifestation and look/feel of the tracks (in different flavours, say 'Real' or 'Virtual 3D') as the view.

Tuttavia, nel tuo contesto, il livello di granularità è disattivato; hai un SessionView che sembra essere responsabile di un intero schermo. A questo livello, le responsabilità diventano troppo accoppiate per separare completamente come previsto da MVC, quindi potrebbe non fornire tutti i vantaggi.

Il tuo problema è nel separare le tre responsabilità dell'interfaccia utente (rendering, dati e gestione degli eventi) per entrambe le sessioni e i processi, per un totale di sei. A causa del livello di granularità dei componenti (schermo intero), questo diventa impossibile e causa la dissonanza in cui ti trovi.

Si desidera separare il rendering e le responsabilità di gestione degli eventi per Sessioni e Processi, ma si accoppiano i loro dati. Il tuo collega vuole disaccoppiare i dati, ma accoppiare la gestione degli eventi.

Quindi alla fine, questo è un problema SRP. La mia via d'uscita sarebbe quella di ridurre il livello di granularità fino a un punto in cui è possibile separare chiaramente Sessioni dai processi. Se non puoi farlo a causa dell'economia, devi semplicemente pesare entrambi i lati del trade-off, scegliere il meno peggio e firmarlo come debito tecnico. Dopotutto, quali sono le decisioni di progettazione. :)

    
risposta data 06.12.2014 - 03:15
fonte

Leggi altre domande sui tag