De ce MVC nu ar fi cel mai bun model pentru aplicațiile pe bază de cacao

MVC standuri pentru Model-View-Controller, și este un model arhitectural larg răspândit pentru dezvoltarea de software. Este modelul de design de facto pentru dezvoltarea cacao-ului, si a fost timp de multi ani. Majoritatea dintre noi nu ne putem imagina construirea de aplicații fără ea. Atât UIKit (iOS), cât și AppKit(macOS) utilizează frecvent MVC. Se pare că nu avem altă opțiune de a construi aplicații pentru iOS, tvOS, macOS și watchOS.

Chiar dacă nu sunteți familiarizat cu modelul Model-View-Controller, dacă aveți ambiția de a dezvolta aplicații pentru una dintre platformele Apple, trebuie să aflați cum se referă vizualizările (iOS) și ferestrele (macOS) la controlere și ce rol modelul joacă într-o aplicație tipică de cacao. Din fericire, MVC este ușor de învățat.

În această serie scurtă, vă explic ce este MVC, cum arată într-o aplicație tipică de cacao și de ce poate să nu fie cea mai bună soluție pentru dezvoltatorii de cacao.

1. Un exemplu

Permiteți-mi să vă arăt cum arată modelul MVC într-o aplicație tipică de cacao. Exemplul pe care vi-l voi arăta se concentrează pe iOS, dar tot ceea ce discutăm se aplică, de asemenea, la tvOS, macOS și watchOS. Deschideți Xcode și creați un nou iOS proiect bazat pe Vizualizare individuală șablon.

Denumiți proiectul MVC, și stabilit Limba la Rapid și Dispozitive la iPhone. Folosesc Xcode 8 pentru acest tutorial. Opțiunile de configurare ale proiectului pot părea puțin diferite dacă utilizați Xcode 9.

După cum sugerează și numele, modelul Model-View-Controller definește trei componente: model, vedere, si controlor. Permiteți-mi să vă arăt unde găsiți aceste componente într-un proiect tipic iOS.

controlerele

Controlorii unei aplicații iOS sunt controlori de vizualizare, instanțe ale UIViewController clasa sau o subclasă a acesteia. UIViewController clasa este definită în UIKit cadru. Pentru că am ales Vizualizare individuală șablon când am creat proiectul, Xcode a creat un controler pentru a începe cu ViewController clasă, definită în ViewController.Swift. Moșteneste de la UIViewController clasă.

După cum sugerează și numele, a UIViewController instanța este responsabilă de controlul unei viziuni, o instanță a UIView clasă. Fiecare controler de vizualizare dintr-un proiect iOS păstrează o referință puternică la o vizualizare, o altă componentă a modelului Model-View-Controller. UIView clasa este, de asemenea, definită în UIKit cadru.

Vizualizări

Putem găsi componenta de vizualizare în tabloul de bord al proiectului. Deschis Main.storyboard în Project Navigator din stânga și inspectați-o Vizualizați scena controlerului. Scena conține un controler de vizualizare, o instanță a ViewController clasă, și gestionează a UIView instanță.

Selectați Vedere în panoul de stânga din stânga și deschideți Inspectorul de identitate pe dreapta. Clasă câmpul vizual este setat la UIView. Într-o aplicație iOS, vizualizările sunt de obicei instanțe ale UIKit UIView clasa sau o subclasă a acesteia.

modele

Până acum am explorat stratul de controler și stratul de vizualizare. Dar unde putem găsi stratul model al proiectului? Modelul este aproape întotdeauna specific pentru proiectul pe care lucrați și depinde de dvs. să definiți, să implementați și să utilizați modelul proiectului. eu scriu model, dar de obicei aveți mai multe modele, în funcție de complexitatea proiectului dvs..

Să adăugăm piesa finală a puzzle-ului MVC creând un model. Creați un nou fișier Swift și denumiți-l Person.swift.

Selectați Person.swift în Project Navigator din stânga și definiți o structură numită Persoană. Definim trei proprietati: 

  • Nume de tip Şir
  • numele de familie de tip Şir
  • vârstă de tip Int
struct Persoana let firstName: String let lastName: String la vârsta: Int

Acum aveți un model pe care îl puteți utiliza în proiectul dvs. Să o păstrăm simplu și să definim o proprietate, persoană, de tip Persoană? în ViewController clasă. Creăm a Persoană exemplu în controlerul de vizualizare viewDidLoad () și alocați-o persoană proprietate.

import UIKit clasa ViewController: UIViewController // MARK: - Proprietăți var person: Persoană? // MARK: - Vizualizați suprascrierea ciclului de viață func viewDidLoad () super.viewDidLoad () // Creare persoană persoană = Persoană (nume: "John", lastName: "Doe", vârsta: 40)

Ceea ce vedem în acest exemplu este foarte frecvent în aplicațiile de cacao alimentate de modelul Model-View-Controller. Controlerul de vizualizare deține și gestionează modelul și utilizează modelul pentru a popula vederea. Într-o aplicație mai complexă, încărcați datele modelului dintr-un magazin persistent sau îl preluați de la un capăt la distanță.

Să definim o priză pentru a UILabel exemplu în controlerul de vizualizare și, în tabloul de bord principal, adăugați o etichetă la Vizualizați scena controlerului.

importați clasa UIKit ViewController: UIViewController // MARK: - Properties @IBOutlet var label: UILabel! ...

În controlerul de vizualizare viewDidLoad () , vom despacheta în siguranță valoarea stocată în persoană de proprietate și de a folosi datele sale pentru a seta text proprietate a UILabel instanță.

override functie viewDidLoad () super.viewDidLoad () // Creare persona persoana = Persoana (nume_familie: "John", lastName: "Doe", varsta: 40) \ (person.lastName), \ (person.firstName) (\ (person.age)) "

Rezultatul nu este foarte surprinzător dacă sunteți familiarizat cu dezvoltarea cacao. Cu asta ajungem.

2. Ce este Model-View-Controller?

Modelul Model-View-Controller este ușor de înțeles și de luat. În ciuda simplității sale, puteți găsi o gamă largă de arome ale modelului MVC. MVC oferă doar un plan de bază care poate fi modificat pe platforma pe care este folosit. 

Modelul Model-View-Controller pe care îl cunoașteți în iOS, tvOS, macOS și watchOS diferă în moduri subtile de definiția originală. În timp ce diferențele comparativ cu definiția inițială sunt subtile, ele au un impact semnificativ asupra codului pe care îl scrieți și asupra mentenabilității proiectului.

Convorbire scurtă

Modelul Model-View-Controller este un model de design vechi. A apărut prima dată în anii 1970 în Smalltalk. Modelul a fost conceput de Trygve Reenskaug. De-a lungul anilor modelul Model-View-Controller a intrat în multe limbi și cadre, inclusiv Java, Rails și Django.

Am menționat mai devreme că modelul MVC rupe aplicațiile în trei componente distincte: model, vedere, și controlor. Implementarea originală a modelului definește faptul că vizualizarea este responsabilă pentru afișarea datelor către modelul utilizatorului. Utilizatorul interacționează cu aplicația prin intermediul stratului de vizualizare. Controlorul este responsabil de manipularea interacțiunii utilizatorilor și de manipularea datelor modelului ca rezultat. Vizualizarea vizualizează aceste modificări utilizatorului. După cum este ilustrat în diagrama de mai jos, modelul joacă un rol-cheie în modelul MVC așa cum a fost proiectat de Reenskaug.

MVC și cacao

Implementarea pe care o folosim în dezvoltarea cacaoului diferă de designul original al Reenskaug. Uitați-vă la diagrama de mai jos pentru a înțelege mai bine ce implică aceste diferențe.

După cum am menționat mai devreme, viziunea și controlorul au o relație strânsă. Într-o aplicație tipică iOS, un controler deține o referință puternică la vizualizarea pe care o gestionează. Vizualizarea este un obiect prost care știe cum să afișeze date și să răspundă la interacțiunea cu utilizatorul. Rezultatul este o componentă foarte reutilizabilă.

Controlorul joacă un rol vital în aplicațiile de cacao alimentate de modelul Model-View-Controller. Acesta preia unele dintre sarcinile modelului în implementarea inițială a MVC de către Reenskaug. Vederea și modelul nu comunică direct unul cu celălalt. În schimb, modelul este în mod obișnuit deținut de controler, pe care îl utilizează pentru a configura și a popula punctul de vedere pe care îl gestionează.

Sper că puteți vedea diferențele subtile dintre implementarea inițială a lui Reenskaug în Smalltalk și implementarea de cacao cu care ne-am obișnuit. Diferențele sunt minore, dar, așa cum voi discuta într-un moment, impactul pe care îl au este important.

3. Bine: Separarea preocupărilor și reutilizabilitatea

Înainte de a arunca o privire la problemele introduse de MVC, aș dori să vă arăt de ce modelul Model-View-Controller a devenit un model atât de popular și răspândit în dezvoltarea de software. Modelul Model-View-Controller pe care îl folosim în dezvoltarea cacao-ului are o serie de beneficii clare pe care le-a moștenit de la implementarea inițială a lui Reenskaug.

Cel mai evident avantaj al modelului Model-View-Controller este a separarea preocupărilor. Stratul de vizualizare, de exemplu, este responsabil pentru prezentarea datelor către utilizator. Straturile modelului și ale controlorului nu se referă la prezentarea datelor. Dar dacă ați folosit MVC într-un proiect de cacao, atunci știți că acest lucru nu este întotdeauna adevărat. Voi vorbi mai mult despre asta într-un moment.

Un beneficiu direct al acestei separări de preocupări este reutilizabil. Fiecare dintre componentele modelului Model-View-Controller se concentrează pe o sarcină specifică, ceea ce înseamnă că blocurile de bază ale unei aplicații MVC sunt adesea ușor de reutilizat. De asemenea, permite ca aceste componente să fie cuplate în mod liber, sporind astfel reutilizarea acestora. Acest lucru nu este valabil pentru fiecare componentă. Într-un proiect de cacao, de exemplu, controlorii sunt adesea specifici aplicației și nu sunt candidați buni pentru reutilizare.

Opiniile și modelele unui proiect, cu toate acestea, sunt foarte reutilizabile dacă sunt proiectate corect. Tabelul și vizionările de colectare, de exemplu, sunt UIView subclase care sunt folosite în milioane de aplicații. Deoarece o vizualizare de tabele deleagă interacțiunea utilizatorului cu un alt obiect și solicită o sursă de date pentru datele pe care trebuie să le afișeze, se poate concentra exclusiv pe prezentarea datelor și interacțiunea cu utilizatorul.

4. Controlerii rău: vizualizare masivă

Majoritatea dezvoltatorilor înțeleg rapid ceea ce modelul Model-View-Controller aduce la masă și modul în care ar trebui implementat. Din păcate, modelul Model-View-Controller are și o parte urâtă. Am scris deja despre reutilizarea și separarea preocupărilor. Sunt sigur că nu trebuie să vă conving de aceste beneficii. O vizualizare de tabel este foarte reutilizabilă și incredibil de performantă. Dezvoltatorii pot folosi componentele standard UIKit în aplicațiile lor, fără a fi nevoie de subclasare sau personalizare.

Atingerea limitelor MVC

Dar asta e doar o parte din poveste. Știți când începeți să atingeți limitele MVC atunci când controlorii masivi de vizualizare s-au strecurat în proiectul dvs. Este timpul pentru schimbare când arunci prin sute sau mii de linii de cod pentru a găsi acea metodă pe care o cauți. 

Aducând-o în controler

Majoritatea dezvoltatorilor știu ce se întâmplă în vizualizarea și straturile modelului unei aplicații tipice de cacao alimentată de modelul Model-View-Controller. Dar ce componentă este responsabilă pentru formatarea datelor afișate pentru utilizator? Amintiți-vă că opiniile ar trebui să fie prost și reutilizabile. Vizualizarea nu trebuie să formateze date. Dreapta? Ar trebui doar să știe cum să prezinte datele și să răspundă interacțiunii utilizatorilor. În cazul în care modelul este preocupat de formatarea datelor?

Și despre rețea? Aceasta nu este cu siguranță sarcina punctului de vedere. Ar trebui să fie delegat la model? Nu sună bine. De ce nu alunecăm acea bucată de cod în controler. Nu se simte bine, dar se va face pentru moment.

După multe linii de cod, veți termina cu un controler care este gata să explodeze și un coșmar pentru a testa. Testarea? Te aud. Nu aș vrea să testez un controler de vedere care suferă sindromul controlerului vizual masiv fie.

5. O soluție mai bună

Ați început cu intenții bune, dar ați ajuns la un proiect care are o colecție de controlori supraponderali care sunt greu de gestionat și de întreținut. Nu așteptați să adăugați noi caracteristici la proiectul pe care lucrați, deoarece deschiderea acestor controale de vizualizare vă face să vă bolnav în stomac. Sună familiar?

Este important să înțelegeți că acesta este un scenariu comun. Mulți dezvoltatori au atins limitele modelului Model-View-Controller și au realizat că au nevoie de ceva mai bun. Există șanse să fiți deja în căutarea mai multor alternative, cum ar fi MVP (Model-View-Presenter) sau MVVM (Model-View-ViewModel).

În următoarea tranșă din această serie, voi mări imaginea Model-View-ViewModel model. Se va simti straniu daca deja ati lucrat cu modelul Model-View-Controller. Modelul Model-View-ViewModel aduce câteva îmbunătățiri ale tabelului care funcționează foarte bine pentru dezvoltarea cacao-ului.

Și în timp ce așteptați, verificați câteva dintre celelalte postări despre dezvoltarea aplicațiilor pentru cacao!

Cod