Computers

MVVM: een verbetering van MVC in iOS

Schrijver: Peter Berry
Datum Van Creatie: 13 Juli- 2021
Updatedatum: 11 Kunnen 2024
Anonim
Clean Architecture iOS [MVC vs MVVM]
Video: Clean Architecture iOS [MVC vs MVVM]

Inhoud

Ik heb een grote interesse in het vinden van verschillende oplossingen voor een probleem. Momenteel verschillende architecturen voor iOS-applicaties aan het verkennen.

Een korte samenvatting

In een vorig artikel "Model View Controller in iOS" Ik heb uitgelegd waarom we deze patronen zelfs nodig hebben, zoals MVC, MVVM enz. Ik heb ook MVC onderzocht en gekeken naar de voor- en nadelen die MVC met zich meebrengt.

In MVC scheiden we onze weergave van model door een controller te introduceren die ze met elkaar verbindt. Deze scheiding zorgt voor beter codeonderhoud en testbaarheid. Maar in de iOS-versie van MVC hebben we een beperking dat View en Controller nauw met elkaar verbonden zijn, dus het is moeilijk om de weergave te bespotten om de Controller te testen. Naarmate de complexiteit van View toeneemt, wordt de controller omvangrijk en moeilijker te testen.


Wat is MVVM (Model View ViewModel)?

MVVM, oorspronkelijk geïntroduceerd door John Gossman van Microsoft, gebruikt in de Windows Presentation Foundation (WPF). Net als MVC biedt MVVM ook een Lijm bekend als ViewModel dat de weergave en het model met elkaar verbindt.

Visie is de zichtbare entiteit op het scherm waarmee de gebruiker kan communiceren. Het toont informatie aan de gebruiker en stelt de gebruiker in staat informatie toe te voegen / bij te werken of acties uit te voeren zoals het wijzigen van de gebruikersnaam of het uitvoeren van een opslagactie. Terwijl Model biedt alle gegevens en biedt bewerkingen die een weergave kan uitvoeren. Laten we een duik nemen in de echte app om de werking van te zien Lijm.

Stel dat je een temperatuur-app aan het ontwikkelen bent waarmee gebruikers de temperatuur van hun stad kunnen zien en dat de gebruiker ook de stadstemperatuur kan wijzigen. De app ziet er ongeveer zo uit:

Wanneer de gebruiker de app opent, gebeurt dit om de temperatuur op het scherm weer te geven:


In het bovenstaande geval wordt onViewDidLoad geactiveerd, lijm krijgt de informatie van het model door de functie getTemperature aan te roepen. Deze functie retourneert de temperatuur in het type Int, dus Glue moet deze waarde opmaken voordat we deze kunnen weergeven. Dus lijm zal zijn hulpfunctie ConvertInDisplayForm aanroepen. Deze functie neemt temperatuur en retourneert een tekenreeks in de indeling "Temp> ° C". Vervolgens zet glue de opgemaakte waarde in Label door setTempLabelText aan te roepen. Onze app toont nu de temperatuur van "20 ° C" op het scherm.

Laten we nu eens kijken wat er gebeurt als de gebruiker de temperatuur bijwerkt naar 30 ° C:

In dit geval wordt de save-functie geactiveerd door de View, Glue haalt de ingevoerde tekst op, converteert deze naar de Int-waarde en roept vervolgens setTemperature of Model aan. Het formatteert ook de nieuwe temperatuur en werkt de gebruikersinterface bij met de nieuwe temperatuur.


Laten we de taken van de lijm opsommen:

  • Het haalt gegevens op uit het model.
  • Het converteert de gegevens naar een vorm die kan worden weergegeven, bijvoorbeeld "20 ° C".
  • Het luistert naar een gebruikersactie om de respectieve bewerking in Model uit te voeren.
  • Het haalt gegevens uit de weergave en bereidt deze voor om deze door te geven aan het model.
  • Het werkt de informatie bij die wordt weergegeven in de gebruikersinterface.

Nu zul je denken: Glue is the Controller? Ja, in MVC is dat zo. Dus in MVVM is ViewModel lijm?

MVVM verdeelt de lijm in twee zaken:

  1. BekijkModel
  2. Bindingen

BekijkModel biedt alle gegevenseigenschappen die View vereist en de status van de gebruikersinterface. Het biedt ook opdrachten (gebeurtenishandlers of bewerkingen) die View kan starten. Terwijl Bindingen zal informatie op de gebruikersinterface bijwerken bij het modelleren van wijzigingen (of omgekeerd). Het bindt ook UI-evenementen zoals Button Tap met commando's van het ViewModel.

Microsoft Windows Presentation Foundation biedt een bindend raamwerk dat wordt gebruikt om UI-elementen aan het ViewModel te binden. In iOS kunnen we de UIViewController-klasse gebruiken om elementen aan de ViewModel-klasse te binden.

Temperatuur-app in MVVM:

protocol TemperatureViewModelDelegate {func temperatureUpdated (_ vm: TemperatureViewModel)} klasse TemperatureViewModel {privé var _temperature: Int = 0 openbare var gedelegeerde: TemperatureViewModelDelegate? public var temperature: String {return " (_ temperature) ° C"} public func loadTemperature () {_temperature = 20 delegate? .temperatureUpdated (self)} public func changeTemperature (to newTemperature: String) {_temperature = Int (newTemperature)? ? 0 gedelegeerde? .TemperatureUpdated (self)}} klasse TemperatureViewController: UIViewController, TemperatureViewModelDelegate {@IBOutlet zwakke var tempLbl: UILabel! @IBOutlet zwakke var tempTxt: UITextField! var vm = TemperatureViewModel () func viewDidLoad () {super.viewDidLoad () vm.delegate = zelf vm.loadTemperature ()} func temperatureUpdated (_ vm: TemperatureViewModel) {self.tempLbl.text = vm.temperature} @IBAction func updateTemperature () {vm.changeTemperature (naar: tempTxt.text!)}}

Zoals u kunt zien, bindt de controller alleen de gegevens van en naar ViewModel en geeft hij bewerkingsgebeurtenissen door aan ViewModel. ViewModel implementeert alle logica van het laden van gegevens en het onderhouden van de status van de gebruikersinterface.

Zal het ViewModel omvangrijk worden als controller in MVC? We kunnen het ViewModel onderverdelen in sub ViewModels die specifieke typen weergaven behandelen. Het startscherm geeft bijvoorbeeld een lijst met etenswaren weer. In deze situatie kunt u ListFoodItemViewModel maken dat het scherm Lijst met voedselitems vertegenwoordigt en het vervolgens gebruiken in HomeViewModel.

Hoe MVVM MVC verbetert

In MVC is controller de Glue die veel verantwoordelijkheden heeft (zoals hierboven besproken) waardoor de controller omvangrijk is en omdat de iOS-controller nauw is gekoppeld aan View, was het ook moeilijk om deze te testen. Maar MVVM verplaatst de status van de gebruikersinterface en de communicatie met het model naar ViewModel, het is veel eenvoudig om UI-staten in verschillende scenario's te testen. Bovendien kunnen ViewModels opsplitsen in sub ViewModels die de grootte en complexiteit van ViewModel verminderen.

MVVM voors en tegens

  • Zorg voor een zwakke koppeling tussen weergave, weergavestatus en model.
  • Maakt een grotere testbaarheid van weergavestaten mogelijk
  • Biedt een beter onderhoud van complexe weergave.
  • Overhead van het schrijven van bindende code.
  • Maak de implementatie van een eenvoudig scherm complex.
  • Verhoog de ontwikkelings- en onderhoudskosten van een eenvoudige applicatie.

Conclusie

MVVM verdeelt de verantwoordelijkheden in een meer verfijnde vorm dan MVC, wat het testen van eenheden en het onderhoud van de complexe weergave verbetert, maar het verhoogt de code-ontwikkeling en onderhoudskosten. Het is niet nodig om MVVM of MVC in uw code te gebruiken. U kunt ze mixen en matchen en MVVM gebruiken voor complexe weergaven en MVC voor eenvoudige weergaven in één enkele applicatie. Dit kan u helpen onnodige ontwikkelings- en onderhoudskosten te verminderen.

Je kunt de implementatie van de Temperature App met MVVM hier vinden. Als u vragen, opmerkingen of suggesties heeft, kunt u een reactie achterlaten.

Keuze Van Lezers

Artikelen Voor Jou

Hoe u uw met water doordrenkte mobiele telefoon kunt besparen
Telefoons

Hoe u uw met water doordrenkte mobiele telefoon kunt besparen

De kinderen gooiden je mobiele telefoon in de wc. Mi chien heb je het laten vallen. Het maakt niet uit, het zit erin. Maar alleen omdat de telefoon in water i gedrenkt, wil nog niet zeggen dat het voo...
De menselijke factoren die van invloed zijn op gesproken zoekopdrachten
Internet

De menselijke factoren die van invloed zijn op gesproken zoekopdrachten

Tamara Wilhite i een techni ch chrijver, indu trieel ingenieur, moeder van twee kinderen en publiceerde ci-fi en horrorauteur.Optimali atie van praakge tuurd zoeken of optimali atie van conver atiezoe...