Xamarin. Przegląd komercyjnych projektów pod względem współdzielenia kodu
Minęło już kilka lat odkąd postanowiłem rozpocząć pracę z platformą Xamarin. W tym czasie brałem udział w realizacji kilku projektów, pomyślałem więc, że jest to odpowiednia okazja, żeby podsumować możliwości Xamarina. Chcę zweryfikować, jak wygląda poziom współdzielenia kodu między poszczególnymi systemami, ponieważ jest to jeden z kluczowych elementów, dodatkowo bardzo chwalony przez twórców tego ekosystemu. Za przykłady posłużą mi projekty, w których uczestniczyłem ja i moi koledzy i będą to systemy Android oraz iOS w projektach typu Xamarin.Native oraz Xamarin.Forms.
Spis treści
Metoda liczenia
Dane, które posłużyły do porównania to policzona w projektach liczba linii kodu oraz plików (wraz z uwzględnieniem przestrzeni nazw, do której należą). Jako, że interesuje nas głównie nakład pracy dla programisty potrzebny do napisania aplikacji, to w obliczeniach zostały pominięte pliki generowane przez IDE np. designer.cs czy linie będące komentarzami, linią pustą czy „using’iem”. Dodatkowo, część wspólna nie uwzględnia WebApi.
Projekt 1
Xamarin: Native
Typ: Biznes – wiadomości
Cechy: animacje, media społecznościowe, odtwarzanie wideo
Projekt 2
Xamarin: Native
Typ: Rozrywka – quizy, wiadomości
Cechy: animacje, duża interakcja użytkownika, media społecznościowe, powiadomienia
Projekt 3
Xamarin: Native
Typ: Użytkowa – pogoda
Cechy: animacje, duża interakcja użytkownika, wykorzystanie aparatu, lokalizacja
Projekt 4
Xamarin: Forms
Typ: Użytkowa – segregacja śmieci
Cechy: dane tabelaryczne, lokalizacja, mapy
Projekt 5
Xamarin: Forms
Typ: Użytkowa – zarządzanie alarmami
Cechy: prezentacja danych, powiadomienia
Podsumowanie wykresów
Pierwsze trzy projekty są typu Xamarin.Native, a pozostałe dwa typu Xamarin.Forms. Niebieski kolor na wykresach oznacza dane wspólne dla projektów Android oraz iOS.
Widać, że wyraźną przewagę pod względem współdzielenia kodu mają projekty typu Xamarin.Forms. Microsoft twierdzi, że w tym przypadku wspólny kod może wynosić do 95%. Nam udało się uzyskać ok. 75% – 85%, co uważam za dobry wynik.
Jeśli chodzi o projekty Xamarin.Native, „gwarancja” opiewa na ok 70%. Tutaj w porównaniu do Xamarin.Forms sytuacja trochę się komplikuje. Tylko Projekt 2 ma podobne proporcje liczby linii kodu do plików – tak jak projekty 4 i 5. Możemy zauważyć, że w projektach 1 i 3 te proporcje są mniejsze o około 13%. Wszystkie natomiast projekty 1, 2, 3 mają co najmniej 50% wspólnych plików. Oceniam, że w tym wypadku uzyskaliśmy 40% – 60% części wspólnych.
Warto również zauważyć, że we wszystkich pięciu projektach obszary pozostałych kolorów, czyli Android oraz iOS, są sobie praktycznie równe.
Wnioski
Wybierając odpowiednie podejście do realizacji projektu w Xamarinie zwraca się uwagę na ilość i poziom skomplikowania animacji, interakcji użytkownika czy API dedykowanego dla konkretnego systemu. Aplikacje, które będą zawierały te elementy wykonuje się w Xamarin.Native, gdyż mechanizmy potrzebne do realizacji powyższych zachowań nie są podobne dla Android’a i iOS’a, przez co nie dają się łatwo uwspólnić. To właśnie z tych powodów projekty 1-3 posiadają mniej wspólnego kodu, gdyż specyficzne zachowania trzeba napisać osobno dla każdej z platform Android i iOS.
Mimo wszystko, więcej niż połowa aplikacji w tych projektach to część wspólna. Drugi sposób, czyli Xamarin.Forms, świetnie nadaje się do aplikacji, które mają prezentować zawartość statyczną. Dlatego projekty 4-5 mają połowę więcej współdzielonego kodu w porównaniu do projektów wykonanych w Xamarin.Native.
Reasumując, muszę przyznać, że Xamarin spełnia pokładane w nim nadzieje i pozwala na duże współdzielenie kodu, a co za tym idzie oszczędność czasu i pieniędzy przy realizacji projektu. Co więcej, nadaje się do praktycznie każdego typu aplikacji, ale kluczową kwestią jest mieć odpowiednie założenia i oczekiwania oraz wykorzystać właściwy typ Xamarina. Biorąc pod uwagę powyższe mogę sobie pogratulować, ponieważ decyzja o wybraniu tej technologii była właściwa.
Zdjęcie główne artykułu pochodzi z pexels.com.