Devo rimuovere "tutto" dal mio controller in MVVM?

6

Sto lavorando con Xamarin e stiamo seguendo il modello di progettazione MVVM. Per coloro che non sanno cosa sia Xamarin, è una tecnologia che ci consente di costruire app iOS e Android con codice condiviso. Fondamentalmente, la tua soluzione ha 3 progetti, un "core" e poi uno per piattaforma, la piattaforma contenente tutto il codice specifico della piattaforma, come animazioni dell'interfaccia utente, elementi dell'interfaccia utente o accesso al GPS e hardware / software complessivo specifico del dispositivo. p>

Per l'esempio, assumerò che stiamo lavorando a un progetto Xamarin.iOS, con un progetto Core che ha la maggior parte della logica.

La mia situazione era la seguente, il progetto è stato scritto e amp; rilasciato con troppa codifica in UIViewControllers del progetto iOS, con conseguente maggior lavoro per gli sviluppatori Android. Il mio compito era quello di refactoring quei controller e spostare il codice in viewmodels perché molto è stato un errore.

Il problema è che l'architetto del team pensa che l'abbia spinto troppo lontano. Userò esempi reali.

Si noti che utilizziamo un sacco di oggetti Action per gestire le chiamate asincrone. Questo è un altro dibattito.

Supponiamo di avere dati da caricare, Beneficiaries , Accounts e Currencies .

Ciò richiede 3 servizi nel ViewModel e il 6% diAction s. Uno xxxxServiceLoaded e xxxxServiceFailed per ciascuno dei dati da caricare.

Nell'interfaccia utente, l'unica cosa che è stata fatta per il successo o il fallimento di ogni richiesta era, praticamente, sempre la stessa cosa. Stava sempre caricando una casella di selezione, quindi chiamava un'altra classe UI che gestiva il caricamento dei dati, ma era astratta e era sempre .loadData per tutti i dati caricati.

Per me, ViewModel è più o meno l'interfaccia utente, dovrebbe sapere come è assemblato e come reagisce. E seguendo questo ragionamento, ho refactored gli UIViewControllers da

  • OnCurrenciesFailed
  • OnCurrenciesSucceeded
  • %codice% ... (ecc.)

per - %codice% - %codice% - %codice% - OnBeneficiariesFailed

Ha ridotto drasticamente la quantità di codice nel controller. Questo vale per molti controller nell'app. Stiamo parlando di almeno 10.000 righe di codice.

Ciò rimuove anche tutta la conoscenza dell'interfaccia utente. È stato detto il minimo indispensabile e solo l'interfaccia utente. "Visualizza questo testo". L'unica cosa che l'interfaccia utente esegue autonomamente è decidere come animare e dove visualizzare il testo, ad esempio. Credo che questo sia più pulito, più economico e più veloce.

Inoltre, rende il lavoro degli sviluppatori Android completamente cerebrale. Devi solo iscriverti a tutte le azioni e fare ciò che ti dicono. "Visualizza uno spinner". Non importa perché lo fai e basta. È più facile, molto più facile, che lasciare che il controller sappia che c'è una valuta, che sta caricando e che cosa mostrare quando ha fallito o meno. Per me, questa logica dovrebbe essere condivisa e non nascosta in un controller.

Ma il progettista ha rifiutato la mia versione, dicendo che il ViewModel sarebbe troppo strettamente accoppiato alla vista, rendendolo non intercambiabile se necessario in futuro, e che era più di un pattern di progettazione MVVMP (Presenter), che non è quello che stanno facendo.

In genere sono d'accordo sul fatto che sarebbe più accoppiato, ma non ho mai visto nessuno scambiare ViewModel o visualizzazioni e il "rischio" di ciò che sta accadendo presto. Lo sviluppo di Android, d'altra parte, sta accadendo e richiederà più lavoro e più navigazione nel codice ios per capire i requisiti (che è un errore!).

Questo solleva domande:

  • Sto usando il modello correttamente spostando tutto in ViewModel?
  • MVVM è lo schema giusto comunque? Poiché in entrambi i casi, è troppo accoppiato o non ha abbastanza codice condiviso, MVVM è davvero la scelta giusta? Sembra essere una montatura, ma la situazione in cui ci troviamo mostra un vero difetto.
posta Gil Sand 27.03.2017 - 14:53
fonte

2 risposte

1

MVVM è un ottimo modello di design. Non ho lavorato con Xamarin ma lavoro con Kendo MVVM, Angular e MVC. Il modello di progettazione da tenere a mente è "Controller skinny, modelli grassi". Vuoi che la tua logica di business sia agonostica a viewmodel e al livello di persistenza. L'accoppiamento è peggio che ripetersi perché se vuoi fare un cambiamento puoi rompere così tanto. Ci sono sempre delle eccezioni alle regole (ad esempio piccoli progetti), ma per i grandi progetti con molti sviluppi troverai dei bei livelli puliti che aiuteranno la manutenibilità a lungo termine.

    
risposta data 06.10.2017 - 19:45
fonte
1

Non ho usato Xamarin, ma affinché MVVM funzioni bene, è necessario utilizzare l'associazione, che è intrinseca alle API basate su XAML. Ho dei dubbi sul fatto che tu stia davvero usando MVVM dato che in quel modello non c'è davvero un controller.

Il modo in cui funziona nelle app WPF o UAP standard è:

  • La tua Model rappresenta la logica aziendale
  • La tua ViewModel ha una proprietà chiamata Model e altre proprietà che sono usate per interagire con la vista. Qui è dove vive la tua logica di controllo / pagina.
  • Il tuo View si lega direttamente a ViewModel

Non è necessario un controller in questo scenario. Ci sono alcuni ulteriori trucchi del mestiere.

  • Utilizza un'implementazione% di RelayCommand ( esempio ) codice%. Ciò vincola le azioni di ICommand ai metodi sul ICommand . Permette anche di controllare se i pulsanti sono attivi o meno.
  • Utilizza un ViewModel per risolvere il mapping da Locator a ViewModel .

Questi non sono fondamentali per MVVM, ma aiutano.

Se le tue Visualizzazioni sono essenzialmente le stesse su tutte le piattaforme, il ViewModel con la tua logica di pagina non è un problema. Soprattutto se è possibile progettare ViewModel per non aver bisogno di riferimenti ai controlli View stessi.

    
risposta data 06.03.2018 - 16:13
fonte

Leggi altre domande sui tag