Xamarin - .NET Standard vs. sdílený projekt

Podporované platformy aplikace Xamarin obvykle sdílejí obchodní logiku. Tato sdílená logika může představovat více než polovinu projektu. Je v našem nejlepším zájmu, abychom tento sdílený kód udržovali co nejpropracovanější.

Rozhraní .NET Framework poskytuje různé způsoby sdílení kódu mezi aplikacemi Android a iOS. Nejpoužívanější jsou .NET Standard a Shared Project. To vede k zřejmé otázce: který z nich je nejlepší?

Při procházení online komunitních fór Xamarin a blogových příspěvků jsem si všiml, že většina vývojářů Xamarin hájí, že .NET standardní projekty se lépe hodí pro vývoj Xamarin, protože vytvořený kód je snadněji čitelný a udržovatelný a méně náchylné k chybám. I když to není konsensuální. Například Miguel de Icaza, spoluzakladatel společnosti Xamarin, dává přednost přístupu sdíleného projektu.

Sdílený projekt

Sdílený projekt není přímo kompilován. Jinými slovy, v procesu kompilace není vytvořen žádný soubor DLL. Místo toho jsou soubory zkompilovány do stejné knihovny DLL jako projekt, který jej odkazuje. Tímto způsobem je možné do sdíleného projektu zapisovat bloky kódu specifického pro platformu, který bude kompilován pouze konkrétní platformou.

Je možné napsat kód specifický pro platformu pro všechny podporované platformy ve stejném souboru pomocí direktiv kompilátoru #ifdef. Tímto způsobem je kód závislý na platformě organizován ve stejném souboru pro danou funkci. Pro proces ladění nemusíte přeskakovat ze souboru do souboru, abyste mohli sledovat kód, jako to děláte ve standardu .NET.

Tento druh projektu má své nevýhody. Bloky specifického kódu dělají implementaci složitější a při provádění implementace jsou stále obtížněji čitelné. Dalším problémem je, že při psaní kódu je aktivní pouze jeden kompilátor (ten, který se odkazuje na vybraný projekt), ať už jde o Android, iOS nebo Windows. To může být velká překážka, když se zvyšuje počet řádků kódu a musíte provádět operace, jako je refaktoringový kód.

.NET Standard

Projekty .NET Standard jsou kompilovány do přenosných sestav, které běží v jakémkoli runtime na bázi .NET. To znamená, že .NET Standard projekty mohou být zahrnuty do spustitelných souborů podporovaných platforem, protože všechny sestavy budou spuštěny ve stejném runtime modulu.

Přenosné knihovny tříd (PCL) jsou dalším přístupem k vytvoření sdílené knihovny. S přijetím standardu .NET se stále méně používal.

Projekty PCL nemají úplný přístup k rozhraní .Net Framework. Musíte vybrat platformy, které chcete podporovat. Tyto platformy nemají stejný přístup k rozhraní .Net Framework, takže PCL je omezeno na nejnižšího společného jmenovatele API vybraných platforem. Tato nevýhoda v standardu .Net neexistuje.

Výběr podporovaných platforem

Je možné převést PCL na projekt .NET Standard změnou cíle vašeho projektu na .Net Standard.

Před změnou cílePo změně cíle

Na rozdíl od sdíleného projektu nelze kód specifický pro platformu implementovat uvnitř projektu .NET Standard. Musí být implementována uvnitř specifických projektů platformy. Nyní musí tento kód volat z projektu .NET Standard. Jak tomuhle kódu říkáte?

Vstřikování závislosti.

Vkládání závislosti můžete použít k vyvolání operací specifických pro platformu z projektu .NET Standard. Definujte rozhraní uvnitř sdíleného kódu a implementujte toto rozhraní do každého projektu podporovaných platforem pro vložení třídy do sdíleného kódu. Tímto způsobem je možné vidět kód specifický pro platformu jako pluginy, které budou integrovat sdílený kód. Existuje jasná izolace toho, co je sdíleno a co závisí na platformě. Tato izolace také podporuje testování jednotky.

Na druhou stranu, mnoho vývojářů považuje Dependency Injection za anti-pattern. Odstranění těsného spojení mezi objekty může mít své výhody, ale také své nevýhody.

Který z nich je tím nejlepším?

Oba přístupy se mi zdají platné a nemůžu říct, který z nich je nejlepší, ale zapojil jsem se do několika projektů Xamarin a musím říci, že jsem nikdy necítil potřebu používat kompilátorové směrnice. Podle mého názoru je společný kód omezený na kompilační směrnice obtížnější číst, což zpomaluje proces vývoje.

Injekce závislosti může být skvělým řešením pro zachování oddělení mezi sdíleným kódem a kódem specifickým pro platformu, ale v menších projektech může tato technika přidat spoustu kódu kotlové desky. V tomto scénáři mohou být sdílené projekty lepším řešením, protože jsou jednodušší z hlediska architektury.

Sdílený projekt neznamená, že veškerý sdílený kód musí být obklopen direktivami kompilátoru, to znamená, že můžete použít direktivy kompilátoru. Můžete si vytvořit svůj kód tak, jak jste používali .NET Standard, s Dependency Injection a stále máte možnost použít #ifdef ve velmi zvláštních případech, aniž byste vytvářeli špagetový kód.

I když nemáte v úmyslu použít direktivy kompilátoru, podle mého skromného názoru, mít schopnost, je potenciálně problematické pro projekt, když vývoj není plně pod vaší kontrolou. Jsem si jist, že jste spolupracovali s mnoha vývojáři, kteří by mohli být lepší v týmové práci, a nemáte představu, že jejich kód bude v budoucnu číst nebo upravovat další vývojáři. Pokud jste jedním z nich, cítíte to jako všichni spolu, pokud ne, možná je to lepší, pokud nepoužíváte sdílený projekt pro velké projekty. Ostatní členové týmu nemusí být tak opatrní, jak jej používáte.

Osobně, kdybych měl začít s projektem Xamarin, šel bych za .NET Standard, ať už to byl malý osobní nebo velký týmový projekt, nutící sebe a ostatní, aby udržovali kód v čistotě a snáze se udržovali.

Pokud máte v této věci stále nějaké dotazy, s něčím nesouhlasíte nebo mi něco chybí, můžete se k tomu vyjádřit. Díky a brzy se uvidíme!