Architettura pulita: cos'è il modello di vista?

11

Nel suo libro 'Clean Architecture', lo zio Bob dice che il Presenter dovrebbe mettere i dati che riceve in qualcosa che chiama il 'Visualizza modello'.

Èlastessacosadi"ViewModel" dal modello di progettazione Model-View-ViewModel (MVVM) o è un semplice oggetto Data Transfer Object (DTO)?

Se non è un semplice DTO, in che modo si riferisce alla vista? La vista ottiene aggiornamenti da essa attraverso una relazione Observer?

La mia ipotesi è che sia più simile al ViewModel di MVVM, perché nel capitolo 23 del suo libro, Robert Martin dice:

[The Presenter's] job is to accept data from the application and format it for presentation so that the View can simply move it to the screen. For example, if the application wants a date displayed in a field, it will hand the Presenter a Date object. The Presenter will then format that data into an appropriate string and place it in a simple data structure called the View model, where the View can find it.

Ciò implica che la View è in qualche modo connessa al ViewModel, invece di semplicemente riceverla come argomento di funzione per esempio (come sarebbe il caso di un DTO).

Un altro motivo per cui penso che ciò sia dovuto al fatto che se si guarda l'immagine, Presenter utilizza il modello di vista, ma non la vista. Mentre Presenter usa entrambi il confine di uscita e il DTO dei dati di output.

Se non è né un DTO né il ViewModel di MVVM, ti preghiamo di approfondire l'argomento.

    
posta Fearnbuster 19.10.2018 - 00:36
fonte

2 risposte

16

Is this the same thing as the 'ViewModel' from the Model-View-ViewModel (MVVM) design pattern

No.

Sarebbe questo :

Questohadeicicli.LozioBobèstato evitando accuratamente i cicli .

Invece hai questo:

Checertamentenonhacicli.Matistalasciandochiedendocomelavistasadiunaggiornamento.Ciarriveremotraunmomento.

orisitasimpleDataTransferObject(DTO)?

PercitareBobdallapaginaprecedente:

Youcanusebasicstructsorsimpledatatransferobjectsifyoulike.Oryoucanpackitintoahashmap,orconstructitintoanobject.

CleanArchitecturep207

Quindi,certo,setiva.

Masospettostrongmentecheciòchetiinfastidiscedavveroè questo :

QuestocarinopiccoloabusodiUMLcontrastaladirezionedelladipendenzadalcodicesorgenteconladirezionedelflussodicontrollo.Quièdovesitrovalarispostaallatuadomanda.

Inunarelazioned'uso:

Ilflussodicontrollo

vanellastessadirezionedelladipendenzadalcodicesorgente.

Inunarelazionediimplementazione:

ilflussodicontrollogeneralmentevanelladirezioneoppostaaquelladelcodicesorgente.

Ilchesignificachestaidavveroosservandoquesto:

DovrestiessereingradodivederecheilflussodelcontrollononarriveràmaidalPresenterallaView.

Comepuòessere?Cosasignifica?

Significachelavistahailpropriothread(chenonèinsolito)o(comesottolinea@Euphoric)ilflussodicontrollostaentrandonellavisualizzazionedaqualcos'altrononrappresentatoqui.

Sesitrattadellostessothread,laViewsapràquandoilView-Modelèprontoperessereletto.MasequestoèilcasoelavistaèunaGUIalloraavràdifficoltàaridisegnareloschermoquandol'utentelospostamentreaspettailDB.

Selavistahailpropriothread,hailproprioflussodicontrollo.Ciòsignificacheperimplementarequestavista,sarànecessarioeseguireilpollingdelmodellodivisualizzazionepernotarelemodifiche.

PoichéilPresentatorenonsachelaVistaesisteelaVistanonsacheilPresentatoreesiste,nonpossonochiamarsiaffatto.Nonpossonolanciareeventil'unocontrol'altro.TuttociòchepuòaccadereèchePresenterscriveràsulView-ModelelaViewleggeràilView-Model.Ognivoltachenehavoglia.

Secondoquestodiagramma,l'unicacosachecondividonoViewePresenterèlaconoscenzadelView-Model.Edèsolounastrutturadati.Quindinonaspettarticheabbiaalcuncomportamento.

PotrebbesembrareimpossibilemapuòesserefattofunzionareancheseilView-Modelècomplesso.Unpiccolocampoaggiornatoètuttalavistadovrebbeeseguireilpollingperrilevareunamodifica.

Oraovviamentepuoiinsisteresull'usodelpatterndiosservatore,oaverequalchecosadistrutturachetinascondaquestoproblema,matipregodicapirechenondevi.

Eccounpo'didivertimentochehoillustratoilflussodelcontrollo:

Notacheognivoltachevediilflussoandarecontroledirezionichehodefinitoprima,ciòchevedièunachiamatacheritorna.Queltruccononciaiuteràadarrivareallavista.Bene,amenochenontorniamoprimaaqualsiasicosachiamataController.Oppurepuoisolo modificare il design in modo da poter accedere alla vista. Ciò risolve anche l'inizio di un problema yo-yo con l'accesso ai dati e la sua interfaccia.

L'unica altra cosa da apprendere qui oltre a quella è che l'Interfacce caso d'uso può praticamente chiamare le cose nell'ordine che vuole fintanto che chiama il presentatore per ultimo.

    
risposta data 19.10.2018 - 04:16
fonte
2

Trovo che questo problema sia troppo confuso e richiederebbe molto tempo e testo per spiegare correttamente il problema poiché ritengo che tu abbia frainteso sia l'architettura pulita di Martin che MVVM.

Per prima cosa, il diagramma che hai pubblicato è incompleto. Mostra solo "business logic", ma manca una specie di "orchestratore" che effettivamente fa muovere le parti nell'ordine giusto.

Ilcodicedell'orchestratorsarebbesemplicecome

stringRequest(stringrequest)//returnsresponse{Controller.Run(data);Presenter.Run();returnView.Run();}

CredodiaversentitoMartinparlarediquestoinunodeisuoidiscorsisuCleanArchitecture.

Un'altracosadasottolineareèchel'osservazionedicandied_orangesullamancanzadiciclièsbagliata.Sì,ilciclononesiste(enondovrebbe)nell'architetturadelcodice.Maiciclitraleistanzediruntimesonocomuniespessoportanoaunaprogettazionepiùsemplice.

QuestoèilcasoinMVVM.InMVVMViewdipendedaViewModeleViewModelutilizzaglieventipernotificarelavisualizzazionedellemodifiche.CiòsignificachenellaprogettazionedelleclassiesistesolounadipendenzadalleclassiViewtoModel,maduranteilruntimeesisteunadipendenzaciclicatraleistanzeVieweViewModel.Perquestomotivo,nonc'èbisognodiorchestrator,inquantoViewModelforniràunmodopercapirequandoaggiornarsi.Questoèilmotivopercuile"notifiche" in questo diagramma usano la linea "squigly" e non la linea diretta. Significa che osserva i cambiamenti in ViewModel, non che ViewModel dipende da Visualizza.

LacosapiùimportantechedovrestiprenderedaMartin'sCleanArchitecturenonèildesigninsé,macomegestisciledipendenze.Unodeipunticriticichefaneisuoidiscorsièchequandoc'èunconfine,tutteledipendenzedelcodicecheattraversanoquelconfineloattraversanoinun'unicadirezione.Neldiagramma,questolimiteèrappresentatodaunadoppialinea.Ec'èmoltainversionedidipendenzaattraversoleinterfacce(InputBoundary,OutputBoundaryeDataAccessInterface)checorreggeladirezionedidipendenzadalcodice.

Alcontrario,ViewModelinCleanArchitectureèsemplicementeDTOsenzalogica.Ciòèresoevidentedaltag<DS>.Equestoèilmotivopercuiorchestratorènecessario,poichéViewnonsapràquandoeseguirelasualogica.

Sedovessi"appiattire" il diagramma su come apparirà durante il runtime, apparirà come segue:

Quindiduranteilruntime,ledipendenzesononelladirezione"sbagliata", ma va bene.

Raccomando di guardare il suo intervento su Clean Architecture per capire meglio il suo ragionamento.

    
risposta data 19.10.2018 - 09:09
fonte

Leggi altre domande sui tag