blog.garaż.net

04 czerwiec 2015

Plusy i minusy Obj-C i platformy iOS

Po ostatniej rozmowie zacząłem się poważnie zastanawiać dlaczego nie lubię Androida i czego tak naprawdę w nim nie lubię, ale to temat na osobny wpis. W tym tekście postanowiłem się podzielić przemyśleniami na temat Objective C i platformy iOS, do których skłoniły mnie właśnie przemyślenia nad Androidem.

Na początku muszę zaznaczyć, że twardo odcinam się od dwóch rzeczy. Pierwsza to polityka firmy Apple, która również i mi nie leży (pozwy, patenty na totalne bzdury, itd.), druga to wciskanie sprzętu po zawyżonej cenie. Po prostu Apple jak każda większa firma, ma swoje chwyty na klientów i wychodzi na tym całkiem nieźle.

Narzędzia

Na pewno warto zacząć od narzędzi. Apple nie próżnuje i tworzy całkiem wygodne i potężne IDE. XCode od wersji 3 (nie miałem, ponoć, nieprzyjemności pracować z wersjami wcześniejszymi) zawiera wszystko co jest niezbędne do budowy aplikacji na urządzenia mobilne tej firmy, wersja 4 dostarcza kolejnych kilku udogodnień i o ile kilka błędów jest naprawdę irytujących to praktycznie ciężko sobie wyobrazić powrót do wersji 3 nawet po krótszym wykorzystaniu nowych funkcji.

XCode to pełne IDE, mamy więc zintegrowany edytor kodu źródłowego, debugger, SCM, podstawowe narzędzia do refaktoryzacji oraz statycznej analizy kodu. Od wersji 4 zintegrowano dodatkowo edytor interfejsu użytkownika (wcześniej był on osobnym programem i wymagał ręcznego tworzenia kodu aby można było go później spiąć w edytorze, obecnie wystarczy trochę wprawy w posługiwaniu się myszką), który znacznie przyspiesza prototypowanie i pisanie prostych aplikacji oraz tworzenie elementów, które nie zmieniają się zbyt dynamicznie (np. panele konfiguracyjne). Nie mogło zabraknąć również symulatora, który mimo swoich ułomności (nie jest w 100% kompatybilny z rzeczywistym urządzeniem, nie warto również na nim zbyt intensywnie poszukiwać błędów i wycieków pamięci) spełnia doskonale swoją rolę i co najważniejsze jest gotowy do pracy w kilka sekund (porównując do symulatorów Symbiana i Androida jest to rakieta). Ostatnim elementem często używanym są Instrumenty, czyli aplikacja do badania naszych programów, często używana chociażby ze względu na potrzebę sprawdzenia wycieków pamięci, jednak przydaje się również przy optymalizacji kodu. Dostępny instrumenty do pomiaru obciążenia CPU czy GPU pozwolą zobaczyć co się dzieje, dodatkowo niektóre instrumenty potrafią generować ostrzeżenia i wskazówki na temat lepszych rozwiązań (każdy programista wykorzystujący OpenGL doceni OpenGL ES Analyzer oraz możliwość debugowania procesu renderowania - wreszcie koniec problemów z oceną gdzie się znajduje jakiś fragment geometrii!).

Język

Objective-C to po prostu kolejny język, na który trzeba poświęcić trochę czasu aby się z nim oswoić. Początkowo może wydawać się dziwaczny dla programistów C\C++\Java ze względu na sposób wywoływania metod (tutaj nazywane są wiadomościami) oraz definiowania klas, protokołów i właściwości. Jeśli ktoś koniecznie upiera się na porównywaniu z C++ to Obj-C jest prostszy -- nie ma przeciążania operatorów, szablonów, podziału na metody prywatne, chronione i publiczne, nie ma statycznych składowych klas, nie ma przestrzeni nazw. Wspiera za to w o wiele większym stopniu obiektowy styl programowania. RTTI jest fundamentem tego języka, dzięki czemu to co w C++ jest dość problematyczne (delegaty, tworzenie bibliotek statycznych i dynamicznych, refleksja) w Obj-C jest powszechnie stosowane i proste.

Język ten jest o tyle ciekawy, że praktycznie nie ma za wiele mechanizmów, które można wykorzystać aby uprzykrzyć innym programistom życie. Przykładowo w C++ możemy zażyczyć sobie aby konstruktor był prywatny ponieważ ktoś uparł się aby klasa realizowała wzorzec singleton. W obj-c co najwyżej możemy skorzystać z asercji w czasie wykonania aplikacji lub ukryć metodę korzystając z kategorii (nie mniej nadal taką metodę można wywołać). Ma to oczywiście swoje wady ale tak naprawdę wszystko załatwia się konwencją. Jeśli ktoś ustala, że klasa implementuje wzorzec singleton po prostu to dokumentuje i zwyczajowo wystawia statyczną metodę shared, a jeśli ktoś potrzebuje z jakiegoś powodu go użyć inaczej to nie ma problemu. :)

Uzupełnienie

Kolejny wpis ze szkicownika (25 wrzesnia 2011). Trochę rzeczy od tego czasu się zmieniło, chociażby wydano XCoda w wersji 5 i 6, pojawił się język programowania Swift, a kompilator Obj-C już od dłuższego czasu posiada możliwość automatycznego generowania kodu zarządzającego cyklem życia obiektów (ARC).

Zmian jest więcej ale życie mam niestety tylko jedno i pracując intensywnie na jednym środowisko siłą rzeczy nie jestem w stanie śledzić wszystkich nowinek na innych.

W oryginalnym tekście zabrakło również informacji o plusach platformy iOS. Niestety większość z tych odczuć jest subiektywna ale chyba większość użytkowników zgodziłaby się z nimi. Pierwsza rzecz, to bardziej przewidywalne środowisko co przekłada się na trochę mniej pracy potrzebnej do przygotowania i testowania aplikacji – urządzeń jest dużo mniej niż tych z Androidem na pokładzie, różnorodność wersji systemu także jest mniejsza, nie ma nakładek i dodatkowego oprogramowania, z którym trzeba konkurować o zasoby… niby nic ale w Google Play większość negatywnych ocen pochodzi od osób, u których aplikacja z różnych względów nie działa… iOS jest również bliżej sprzętu, typowa aplikacja tworzona standardowo jest kompilowana do kodu maszynowego, zazwyczaj nie wykorzystuje się garbage collectora (jest, a na pewno była kiedyś taka możliwość), a ręczne lub wspomagane ARC zarządzanie pamięcią co przekłada się na bardziej przewidywalne zachowanie aplikacji. Nie jest także tajemnicą, że iOS radzi sobie dużo lepiej z tą samą ilością pamięci co Android, śmiem twierdzić, że Android do tak samo przewidywalnego zachowania potrzebuje dwa razy więcej pamięci RAM… Mam porównanie na starej słuchawce wyposażonej w 256MB RAM (Motorola Milestone) i równoważnym sprzęcie czyli iPodzie 4, oba sprzęty wiekowe jednak iPod do tej pory pozwala testować gry tworzone z pomocą Unity, na Milstonie uruchomienie tej samej gry z taką samą ilością zasobów jest niewykonalne, a nawet jeśli już udało się uruchomić aplikację to zazwyczaj nie dało się skorzystać chociażby z zakupów, która odpalała dodatkową wewnętrzną intencję i powodowała zamknięcie tej z grą… Podobne rzeczy dzieją się na tegorocznym nabytku wyposażonym w 1GB RAM (LG Spirit H440N, nawet po wywaleniu większości zbędnego oprogramowania, pogodynek, etc.), wystarczy kliknąć w link w reklamie w grze aby po naciśnięciu przycisku back ujrzeć splash screen i loader… iPhone 4 z połową pamięci nie ma takich problemów.

Nie mniej przez te kilka lat naprawdę sporo rzeczy się zmieniło więc aby być rzetelnym musiałbym poważnie usiąść przy obydwu platformach i bardzo mocno je przestudiować (na nowo), tym bardziej, że od czasów iOS 4 i Androida 2.3 minął szmat czasu.

Comments !