Část 2 – Architektura
Klíčovou zásadou vytváření multiplatformních aplikací je vytvoření architektury, která se hodí k maximalizaci sdílení kódu napříč platformami. Dodržování následujících principů objektově orientovaného programování pomáhá vytvářet dobře navrženou aplikaci:
- Zapouzdření – Zajištění, aby třídy a dokonce i vrstvy architektury zpřístupnilo pouze minimální rozhraní API, které provádí požadované funkce, a skryje podrobnosti implementace. Na úrovni třídy to znamená, že se objekty chovají jako "černá pole" a že využívání kódu nemusí vědět, jak své úkoly dělají. Na úrovni architektury to znamená implementaci vzorů, jako je Façade, které podporují zjednodušené rozhraní API, které orchestruje složitější interakce jménem kódu v abstraktních vrstvách. To znamená, že kód uživatelského rozhraní (například) by měl být zodpovědný pouze za zobrazení obrazovek a přijetí uživatelského vstupu; a nikdy nekomuaguje s databází přímo. Podobně by kód pro přístup k datům měl jen číst a zapisovat do databáze, ale nikdy nepracuje přímo s tlačítky nebo popisky.
- Oddělení zodpovědností – Zajistěte, aby každá komponenta (jak na úrovni architektury, tak na úrovni třídy) má jasný a dobře definovaný účel. Každá komponenta by měla provádět pouze své definované úlohy a zpřístupnit tyto funkce prostřednictvím rozhraní API, které je přístupné pro ostatní třídy, které ji potřebují používat.
- Polymorfismus – programování do rozhraní (nebo abstraktní třídy), které podporuje více implementací, znamená, že základní kód lze psát a sdílet napříč platformami a současně pracovat s funkcemi specifických pro platformu.
Přirozeným výsledkem je aplikace modelovaná po skutečném světě nebo abstraktních entitách s samostatnými logickými vrstvami. Oddělení kódu do vrstev usnadňuje pochopení, testování a údržbu aplikací. Doporučujeme, aby kód v každé vrstvě byl fyzicky samostatný (buď v adresářích, nebo dokonce samostatných projektech pro velmi velké aplikace), a logicky oddělit (pomocí oborů názvů).
Typické aplikační vrstvy
V tomto dokumentu a případových studiích odkazujeme na následující šest aplikačních vrstev:
- Datová vrstva – trvalost nestálých dat, pravděpodobně databáze SQLite, ale mohla by být implementována se soubory XML nebo jakýmkoli jiným vhodným mechanismem.
- Vrstva přístupu k datům – obálka kolem datové vrstvy , která poskytuje přístup k datům vytvoření, čtení, aktualizace, odstranění (CRUD) bez zveřejnění podrobností implementace volajícímu. Dal může například obsahovat příkazy SQL pro dotazování nebo aktualizaci dat, ale odkazující kód by to nemusel znát.
- Obchodní vrstva – (někdy označovaná jako vrstva obchodní logiky nebo BLL) obsahuje definice obchodních entit (model) a obchodní logiku. Kandidát na obchodní fasádu.
- Vrstva přístupu ke službě – používá se pro přístup ke službám v cloudu: ze složitých webových služeb (REST, JSON, WCF) až po jednoduché načítání dat a obrázků ze vzdálených serverů. Zapouzdřuje chování sítě a poskytuje jednoduché rozhraní API, které bude využívat vrstvy aplikace a uživatelského rozhraní.
- Aplikační vrstva – kód, který je obvykle specifický pro platformu (obecně nesdílený napříč platformami) nebo kód specifický pro aplikaci (obecně nejde opakovaně použít). Dobrým testem, zda umístit kód do aplikační vrstvy a vrstvy uživatelského rozhraní je (a) k určení, jestli má třída nějaké skutečné ovládací prvky zobrazení, nebo (b), zda se může sdílet mezi několika obrazovkami nebo zařízeními (např. i Telefon a iPad).
- Vrstva uživatelského rozhraní – vrstva s uživatelským přístupem, obsahuje obrazovky, widgety a kontrolery, které je spravují.
Aplikace nemusí nutně obsahovat všechny vrstvy – například vrstva přístupu ke službě neexistuje v aplikaci, která nemá přístup k síťovým prostředkům. Velmi jednoduchá aplikace může sloučit vrstvu dat a vrstvu přístupu k datům, protože operace jsou extrémně základní.
Běžné vzory mobilního softwaru
Vzory představují zavedený způsob zachycení opakovaných řešení běžných problémů. Existuje několik klíčových vzorů, které jsou užitečné k pochopení při vytváření udržovatelných/srozumitelných mobilních aplikací.
- Model, ViewModel (MVVM) – model Model-View-ViewModel je oblíbený u architektur, které podporují datové vazby, jako je Xamarin.Forms. Byla oblíbená sadami SDK s podporou XAML, jako je Windows Presentation Foundation (WPF) a Silverlight; kde Model ViewModel funguje jako přechod mezi daty (model) a uživatelským rozhraním (View) prostřednictvím datových vazeb a příkazů.
- Model, zobrazení, kontroler (MVC) – běžný a často nepochopený vzor, MVC se nejčastěji používá při vytváření uživatelských rozhraní a poskytuje oddělení mezi skutečnou definicí obrazovky uživatelského rozhraní (View), modulem za ním, který zpracovává interakci (Controller) a daty, která ho naplní (model). Model je ve skutečnosti zcela nepovinný kus, a proto jádro pochopení tohoto modelu spočívá v zobrazení a kontroleru. MVC je oblíbený přístup pro aplikace pro iOS.
- Obchodní fasáda – vzor AKA Manager poskytuje zjednodušený bod vstupu pro složitou práci. Například v aplikaci sledování úloh můžete mít
TaskManager
třídu s metodami, jakoGetAllTasks()
jsou ,GetTask(taskID)
,SaveTask (task)
atd. TřídaTaskManager
poskytuje façade vnitřní práce skutečně ukládání/načítání objektů úkolů. - Singleton – Model Singleton poskytuje způsob, jakým může existovat pouze jedna instance konkrétního objektu. Pokud například používáte SQLite v mobilních aplikacích, budete chtít jenom jednu instanci databáze. Použití vzoru Singleton je jednoduchý způsob, jak to zajistit.
- Poskytovatel – model vytvořený Microsoftem (pravděpodobně podobný strategii nebo základní injektáž závislostí), který podporuje opětovné použití kódu v aplikacích Silverlight, WPF a WinForms. Sdílený kód lze zapsat proti rozhraní nebo abstraktní třídě a konkrétní implementace specifické pro platformu se zapisují a předávají při použití kódu.
- Asynchronní – Nezaměňujte se s klíčovým slovem Async, vzor Async se používá v případě, že je potřeba spustit dlouho běžící práci bez přidržování uživatelského rozhraní nebo aktuálního zpracování. V nejjednodušší podobě asynchronní vzor jednoduše popisuje, že dlouhotrvající úlohy by se měly spustit v jiném vlákně (nebo podobné abstrakci vlákna, jako je úloha), zatímco aktuální vlákno pokračuje v procesu zpracování a naslouchá odpovědi z procesu na pozadí a pak aktualizuje uživatelské rozhraní, když se vrátí data a stav.
Každý ze vzorů bude podrobněji prozkoumán, protože jejich praktické použití je znázorněno v případových studiích. Wikipedie obsahuje podrobnější popisY MVVM, MVC, Fasáda, Singleton, Strategie a zprostředkovatel vzory (a vzory návrhu obecně).