Come funziona MVC con il principio "Dì, non chiedere"?

4

Procedural code gets information then makes decisions. Object-oriented code tells objects to do things.

- Alec Sharp

Quindi, quando una vista vuole visualizzare alcune informazioni che si suppone derivino dalle proprietà di un modello che sta visualizzando, il calcolo dovrebbe essere parte del modello o della vista?

Idealmente la vista dovrebbe dire all'oggetto le informazioni di cui ha bisogno, e il modello dovrebbe fare il calcolo e restituire il risultato.

Ma ora, il modello dovrebbe iniziare ad avere nuovi metodi ogni volta che un nuovo tipo di visualizzazione vuole visualizzare informazioni aggiuntive derivate dalla proprietà del modello?

Questi metodi dovrebbero essere nella vista o nel modello? O in questi casi dovremmo creare una sottoclasse del modello, aggiungere i metodi richiesti e quindi assegnarlo alla vista?

Sono uno sviluppatore Objective-C, posso anche aggiungere una categoria al modello per la vista ma nelle lingue in cui non abbiamo funzionalità in cui possiamo aggiungere metodi a oggetti e classi in fase di esecuzione, qual è il design ideale ?

Oppure i modelli in MVC intendevano essere solo informazioni in coppie chiave-valore anziché oggetti reali da passare attorno, dove una vista legge ogni valore basato su un getter?

    
posta Amogh Talpallikar 11.09.2013 - 12:30
fonte

2 risposte

5

Ideally view should tell the object about the information it needs, model to should do the calculation and return the result.

Questo potrebbe essere un modo orientato agli oggetti, ma non MVC. In MVC, la vista in genere invia un messaggio al controller "Voglio visualizzare le informazioni" e il controller esegue il calcolo utilizzando il modello (o utilizzando gli attributi o le funzioni del modello). Successivamente, il controller invia il messaggio di risultato alla vista (in genere utilizzando un'interfaccia per disaccoppiare dal tipo di vista concreto).

but now, should model start having new methods every-time a new type of view wants to display extra information which is derived out of model's property?

Le informazioni derivate dalla proprietà del modello possono essere calcolate o

  • nel modello
  • in un controller che utilizza il modello

Metteremo tali funzioni di calcolo nel modello solo se non sono specifiche della vista e hanno una certa possibilità di essere riutilizzate. Le funzioni totalmente specifiche per una vista sono più adatte per il controller corrispondente.

    
risposta data 11.09.2013 - 13:19
fonte
8

In realtà, il principio "non chiedere" non significa che non puoi interrogare un oggetto sul suo stato.

Significa che non è necessario interrogare lo stato di un oggetto e quindi modificare lo stato di tale oggetto in base alla propria logica. Ciò significherebbe che l'oggetto (o la sua classe) non ha il controllo del proprio interno e stai operando a cuore aperto dove dovresti essere solo uno scanner MRI (o alcuni di questi).

Quello che puoi fare è interrogare lo stato, decidere cosa significa per te, quindi dire all'oggetto di fare qualcosa in base alla tua logica e lasciare che l'oggetto si occupi di cambiarne lo stato per riflettere ciò che è stato fatto.

In MVC una vista non deve dire a un modello di quali informazioni ha bisogno. Idealmente una visione è per lo più passiva. Dire al controller cosa ha fatto l'utente e rispondere alle notifiche di aggiornamento dal modello modificando il contenuto dei suoi controlli.

Il controller dovrebbe controllare (!) il modello in base a ciò che è stato detto all'utente (fare clic su un pulsante). Di solito il controller trasmette solo ciò che è successo alla modella. Può interrogare altri controller e modelli per decidere come gestire ciò che l'utente ha fatto.

Il modello dovrebbe rispondere per essere informato su ciò che è accaduto (dal controller) cambiando di conseguenza lo stato e inviando notifiche a chiunque abbia sottoscritto di ricevere tali notifiche (solitamente la vista sarà stata sottoscritta dal controller).

Si noti che in MVC un controller può orchestrare più viste sullo stesso modello, ma è possibile avere più coppie di controller / viste che lavorano con lo stesso modello. Questo è per esempio come consentire più viste (sic) sullo stesso documento (ad esempio una vista HTML e una vista simultanea di testo non elaborato).

    
risposta data 11.09.2013 - 22:15
fonte

Leggi altre domande sui tag