Androidowe biblioteki i wzorce projektowe - programistyczne rozwolnienie

0

Dzień dobry.
Od roku pracuję jako Android Developerka i zauważyłam niezrozumiałą tendencję do używania wszystkich popularnych bibliotek czy wzorców projektowych.
Moim zdaniem w większości przypadków to przerost formy nad treścią.
Nie mam na myśli tylko firmy w której pracuję, bo akurat w niej jest całkiem przyjemnie, ale wiecie jak to jest, posiadacie znajomych w innych firmach, chodzicie na rozmowy rekrutacyjne, trafiacie na artykuły w internecie, rozmawiacie o stacku technologicznym z innymi itp.

Zakładam, że mam zbyt małe doświadczenie żeby zrozumieć fenomen niektórych z tych rzeczy i w przyszłości będę to miło wspominała (ale na wszelki wypadek sprawdzę jak tam u was).

  • W jakim celu 25letni Androidowi Seniorzy/Team Leaderzy wymagają MVVM z databindingiem(ten od Googla), Daggera i jakiś dziwnych ORMów.

  • Czy ten Dagger to naprawde główna biblioteka ? Czy tak ciężko wstrzyknać te obiekty przez konstruktor ? Nawet na studiach nie jest poruszane wstrzykiwane zależności, bo to tylko wypadkowa myślenia człowieka który poradził sobie z maturą. Tak, zgadzam się, że można wymyślić przykład matrioszki w której użycie Daggera będzie łatwiejsze, ale bez przesady, ile razy trafimy na takie coś w realnym projekcie ? Nawet przyjemnie będzie to napisać w Javie.

  • Dlaczego nie możemy informować innych miejsc w aplikacji o jakiejś zmianie używając natywnego BroadcastReceivera tylko robimy to przez RxJave ?
    To samo z ORM'ami, natywną bazę danych możemy zmieścić w 1 klasie i mamy pełniejszą kontrolę nad tym co się dzieje.

  • Teraz tak bardziej projektowo. MVP? MVVM ? HWDP ? Na co to komu ? Wystarczy odrobina rozsądku żeby ładnie odseparować modele, widoki czy co tam chcecie. Czasami przy prostych projektach widzę taką abstrakcję, że nie umiem zmienić wyświetlającego się tekstu na ekranie.
    No i oczywiście nigdy idealnie nie zrobicie wszystkiego zgodnie z jednym wzorcem projektowym + każdy interpetuje go inaczej, już nie raz nie dwa widziałam na tym forum awanturę doświadczonych osobników inaczej rozumiejących MVC.

  • Nie można po staremu zrobić katalogów z aktywnościami, fragmentami, serwisami, modelami itp ? Każdy będzie wiedział o co chodzi.

  • Clean architecture ? - tego w ogóle nie znam więc nie krytykuję, ale może ktoś ma coś do powiedzenia.

  • Pozbycie się fragmentów - w jakim celu ?

Tak, jestem fanką natywnego pisania w Javie :)
Mam jeszcze wiele pytań :)

0
  • Czy ten Dagger to naprawde główna biblioteka ? Czy tak ciężko wstrzyknać te obiekty przez konstruktor ?

Tutaj Całkiem fajnie pokazuje przykładowe drzewo zależności, jak mówi, wykorzystane tylko do "basic networking". To się bardzo szybko rozrasta.

Nawet na studiach nie jest poruszane wstrzykiwane zależności

Studia są raczej słabym wyznacznikiem. Na studiach ogólnie raczej się nie porusza praktycznych sposobów na postępowanie przy pracy z dużymi projektami, pisanymi przez wielu programistów.

Nawet przyjemnie będzie to napisać w Javie.

Co kto lubi, wolę zająć się rozwiązywaniem faktycznych problemów niż pisać tonę niepotrzebnego kodu.

Sam dużego doświadczenia nie mam. Po prostu sam zacząłem używać Daggera i widzę plusy. Poświęcenie 2 godzin na podstawowe ogarnięcie tego narzędzia sprawia, że kod jest dużo bardziej czytelny i co za tym idzie łatwiejszy w utrzymaniu.

0
Grzyboo napisał(a):

Studia są raczej słabym wyznacznikiem. Na studiach ogólnie raczej się nie porusza praktycznych sposobów na postępowanie przy pracy z dużymi projektami, pisanymi przez wielu programistów.

Wstrzykiwanie zależności to sposób na postępowanie przy pracy z dużymi projektami ? Wydawało mi się że to podstawowa rzecz.
Na uczelni porusza się jak najbardziej takie rzeczy. Nikt nie zawraca sobie głowy podstawowymi sprawami typu składnia czy obiekty.

3
wioletta90 napisał(a):

Od roku pracuję jako Android Developerka i zauważyłam niezrozumiałą tendencję do używania wszystkich popularnych bibliotek czy wzorców projektowych.

Tutaj problemem jest akurat to, że rynek programistów Androida jest bardzo kreowany modą, pomijając frontend (chociaż nie wiem czy ostatnio nie zaczął wyprzedzać w tym wszystkim i frontendowej gonitwy). Wydaje mi się, że wynika to z kilku rzeczy. Po pierwsze Google przez długi, długi, długi czas w dokumentacji i przykładach miał przedstawione bardzo mierne rozwiązania. Jeżeli ktoś się uczył tylko i wyłącznie na podstawie ich kodu, to kończył z kodem spaghetti, którego nie dało się utrzymać. Dodatkowym problemem w tym wszystkim jest to, że Google pomimo robienia wielu fajnych rzeczy, robie też rzeczy obrzydliwe. Jeszcze gorzej dla nas, bo są wbudowane bezpośrednio w Androida. Świeża osoba myśli sobie, że skorzysta z tych rzeczy, żeby za jakiś czas ugrząźć w złych abstrakcjach albo niewystarczającym API. Sfrustrowany developer szukał wtedy jakiegokolwiek rozwiązania i sprawdzał miliony rzeczy albo pisał własne, które niestety miały zastosowanie w kilku konkretnych przypadkach albo nie dostarczały wystarczająco wiele i koło się napędzało.

Drugi problem jest taki, że w Google jesteś nagradzany głównie za innowacyjność. Jeżeli biblioteka jest pełna bajerów, fajerwerków itd. to będzie miałą wyższy priorytet niż np. udogodnienia do testowania rzeczy związanych z frameworkiem. Kończy się to wieloma nowymi rozwiązaniami, które Google promuje i które ludzie sprawdzają i adaptują w projektach. To jest akurat naturalne, że chcemy się bawić nowymi zabawkami zamiast zostawać przy starych. Niestety tych zabawek robi się za dużo i nierzadko robi się je źle.

Po trzecie Android jakotaki jest relatywnie młody i nie ma wielu doświadczonych programistów. Im mniej doświadczenia, tym łatwiej o pokusę.

wioletta90 napisał(a):
  • W jakim celu 25letni Androidowi Seniorzy/Team Leaderzy wymagają MVVM z databindingiem(ten od Googla), Daggera i jakiś dziwnych ORMów.

Zakładam, że chodzi o bibliotekę MVVM. Ogólnie należy korzystać jakiegoś MV-X (czy to P, C, VM, cokolwiek), ale o tym w innym pytanie. Czemu akurat chcą MVVM? To pytanie raczej do nich. Sam w pracy korzystam z MVVM, mimo że biblioteka jest moim zdaniem zbędna i nie wnosi niczego. Dlaczego? Bo jeżeli jest duża rotacja w projektach, to dużo łatwiej jest wejść w projektu, który korzysta ze znanych przeciętnemu klepaczowi rozwiązań. To akurat jest wymówka z mojej strony. Gdybym miał czas, to wywaliłbym MVVM z projektu, ale niestety germańscy klienci + germańscy architekci + germański menadżment = brak czasu na cokolwiek poza absolutnym minimum.

Czemu DataBinding? Nie mam pojęcia, bo nie jestem masochistą i uważam, że jest zła. Możesz przejrzeć ten temat, żeby poznać moje zdanie bardziej, jeśli Cię interesuje - Korzyści z DataBinding. Ostatecznie, to mnie nie obchodzi z czego ludzie korzystają, bo to ich sprawa. Są ludzie, którym ta biblioteka przyspiesza i usprawnia pracę. Na zdrowie. U mnie wywołuje odruch wymiotny.

O Daggerze i ORMach w kolejnych pytaniach.

wioletta90 napisał(a):
  • Czy ten Dagger to naprawde główna biblioteka ? Czy tak ciężko wstrzyknać te obiekty przez konstruktor ? Nawet na studiach nie jest poruszane wstrzykiwane zależności, bo to tylko wypadkowa myślenia człowieka który poradził sobie z maturą. Tak, zgadzam się, że można wymyślić przykład matrioszki w której użycie Daggera będzie łatwiejsze, ale bez przesady, ile razy trafimy na takie coś w realnym projekcie ? Nawet przyjemnie będzie to napisać w Javie.

Zależy. Poniżej Androida 28 nie ma możliwość wstrzykiwać przez konstruktor, bo nie ma się do niego dostępu na poziomie frameworka. AppComponentFactory zostało dodane dopiero w API 28, więc poczekamy jeszcze 3, 4 lata zanim będzie można rzeczywiście używać.

Natomiast sam Dagger, o ile dobrze skonfigurowany, robi dokładnie to, co napisałaś. Przekazuje obiekty przez konstruktor. Możesz nawet podejrzeć wygenerowany kod, żeby zobaczyć, jak to jest robione. Wyjątkiem są klasy Androidowe, do których wsrzykuje się przez odwołanie się do kontenera (inaczej się na tę chwilę nie da). Z tego powodu WSZYSTKO, co związane z Androidem, powinno mieć jak najmniej zależności.

Teraz pytanie, po co Dagger, skoro samemu można napisać cały ten kod? Przede wszystkim, żeby ułatwić testowanie end-to-end, integracyjne i przyspieszyć konfigurowanie aplkacji. Tu wychodzi lekki problem, bo żeby zobaczyć korzyści wynikające z korzystania z tej bibloteki, aplikacja tych zależności musi trochę mieć. Pi razy drzwi tych zależności musi być w górnym przedziale dziesiątek, żeby odczuć zalety. Bo niestety Dagger jest bilbioteką skomplikowaną i wymaga trochę konfiguracji. Dodatkowo można go skonfigurować niewydajnie dosyć łatwo - nie że będzie jakoś specjalnie zamulał, ale można często dużo rzeczy usprawnić w typowych konfiguracjach, jakie zazwyczaj widzę. Czy są alternatywy? Są. Czy są lepsze? Moim zdaniem nie, ale nie będę się na wstępie o tym rozpisywał.

wioletta90 napisał(a):
  • Dlaczego nie możemy informować innych miejsc w aplikacji o jakiejś zmianie używając natywnego BroadcastReceivera tylko robimy to przez RxJave?

Pierwsza ważna rzecz to sposób przesyłania danych za pomocą Receivera jest ograniczony. Tracisz bardzo dużo ze statycznego typowania. Kod zaczyna wtedy przypomniać trochę JavaScript, a jednak fajnie jest zrzucić na kompilator tak dużo, jak to tylko możliwe. Dodatkowo, Twoje klasy muszą implementować Parcelable, więc zaczynają zależeć od frameworka. Jeżeli chcemy tego uniknąć, to musimy tworzć nowe klasy i robić dla nich mapowania. Trochę lipa.

Problem numer dwa to testowanie takiego kodu. Receivery same w sobie należą do frameworka. Gdyby Twoja klasa biznesowa zależała od takiego Receivera to masz problem. Masz kilka wyjść i żadne nie jest fajne.

  • Piszesz testy integracyjne i odpalasz je na telefonie. Takie testy pisze się ciężko (niektórych praktycznie się nie da) i odpala się powoli, co skutkuje małą iteracją.
  • Mockujesz na potęgę i nie testujesz tak naprawdę niczego.
  • Korzystasz z np. Robolectric, co skutkuje ponownie mockowaniem na potęgę oraz wyrywaniem sobie włosów z głowy co jakiś czas, bo Robolectric nagle przestał działać.

Problem numer trzy to liche (a dokładnie żadne) API dla BroadcastReceivera. Nie możesz robić fajnych rzeczy, na które pozwala RxJava. Natomiast Receivery i Rx nie są w stosunku do siebie ortogonalne. Receivery można opakować w Rx i mieć dostęp do genialnego API.

wioletta90 napisał(a):

To samo z ORM'ami, natywną bazę danych możemy zmieścić w 1 klasie i mamy pełniejszą kontrolę nad tym co się dzieje.

ORM'ami gardzę. Zwłaszcza na Androidzie, gdzie nie wpasowują się w model wątkowy platformy (Baza danych w Androidzie). Natomiast jakaś abstrakcja mądra abstrakcja jest przydatna. Unika się wtedy błędów w runtimie dzięki wsparciu IDE albo kompilatora.

wioletta90 napisał(a):
  • Teraz tak bardziej projektowo. MVP? MVVM ? HWDP ? Na co to komu ? Wystarczy odrobina rozsądku żeby ładnie odseparować modele, widoki czy co tam chcecie. Czasami przy prostych projektach widzę taką abstrakcję, że nie umiem zmienić wyświetlającego się tekstu na ekranie.
    No i oczywiście nigdy idealnie nie zrobicie wszystkiego zgodnie z jednym wzorcem projektowym + każdy interpetuje go inaczej, już nie raz nie dwa widziałam na tym forum awanturę doświadczonych osobników inaczej rozumiejących MVC.

Temat rzeka (jak każdy tutaj ;)). Co do skrótowców - zgadzam się jak najbardziej. Idiotyzm do kwadratu, wynikający głównie z problemu wspomnianego w pierwszym pytani, czyli gonieniem za modą. Natomiast na co to komu? Bo są pewne rozwiązania, które ułatwiają rozwijanie aplikacji. Czyli tak jak napisałaś - odseparować model od widoku. Aczkolwiek należy pamiętać, że Model (ten przez wielkie M) to nie jest Pies.java, Drukarka.java, LampkaNocna.java. Tylko wszystkie klasy, które wprowadzają interakcję między tymi przykładowymi klasami. Są też architektury, gdzie klasy typu Skarpeta.java są Modelem, ale nie będę robił dygresji na ten temat. Kolejny temat podlinkuję - Architektura MVP z Interactorem i Repository.

wioletta90 napisał(a):
  • Nie można po staremu zrobić katalogów z aktywnościami, fragmentami, serwisami, modelami itp ? Każdy będzie wiedział o co chodzi.

Można, ale ciężko taką aplikację rozwijać, testować i utrzymywać. Tzn. taką w oparciu tylko o te komponenty.

wioletta90 napisał(a):
  • Clean architecture ? - tego w ogóle nie znam więc nie krytykuję, ale może ktoś ma coś do powiedzenia.

Clean architecture jest fajne, bo uczy, że należy Androida (i każdy inny framework) traktować jak wroga. Jako coś, co psuje nasz aplikację i chce ją sobą zarazić. Bo framework powinien być pluginem do naszej aplikacji, który wyświetla obliczone przez nią wyniki i ewentualnie dostarcza dane od użytkownika.

wioletta90 napisał(a):
  • Pozbycie się fragmentów - w jakim celu ?

Ponieważ Fragmenty razem z FragmentManagerem są jednym z grzechów głównych Googla. Zachowują się w sposób nieprzywidywalny, są piekielnie trudne do debugowania i robią za dużo jednocześnie. Jest o tyle dobrze, że natywne Fragmenty już nie są wspierane i kiedyś w odległej przyszłości (oby przed śmiercią cieplną Wszechświata) Google je usunie z SDK. Żeby zrozumieć problemy związane z nimi wystarczy popatrzeć na ten obrazek. Z tym się nie da logicznie dyskutować. Zwłaszcza w przypadku bugów. A dodaj do tego, że cykl życia Fragmentu zależy od cyklu życia Activity.

FragmentManager z kolei, to najbardziej chory wymysł, jaki mógł powstać. Zamiast śledzić jaka była historia np. jakichś kluczy, po których można się poruszać w aplikacji i dać do nich dostęp, żeby móc tym łatwo manipulować, to nie. Google musiał zlecić tę klasę do zaprojektowania upośledzonemu koniowi i zapisywać transakcję między jednym fragmentem a drugim. Powodzenia w manipulowaniu tym. Na szczęście można z Fragmentów korzystać bez FragmentManagera i napisać jakiś własny stos. W projekcie tak mam. Fragmentów nie wyrzuciłem przez te same problemy, co z MVVM.

To sobie ponarzekałem. Natomiast jeżeli ktoś ma aplikację na dwa ekrany, wie, że tak zostanie na amen, i nie pisze jej dla nauki / rozrywki, to oczywiście nie ma sensu robić niewadomo jakich abstrakcji i korzystać z multum bibliotek. Za każdym razem jak widzę, że ktoś dodaje RxJavę tylko dlatego, że nie umie poradzić sobie z asynchornicznymi zapytaniami, to umieram w środku. Nie trzeba takiej kobyły do tego.

Może pytanie do Ciebie skoro niektóre rzeczy wydają Ci się zbędne i wnoszą niepotrzebny chaos - jak duża była największa aplikacja, którą napisałaś i co robiła? Pytanie bonusowe - czy była pokryta testami?

0

Moje prywatne projekty nie przekraczały 10 fragmentów i 2 aktywności, natomiast największy komercyjny posiadał kilkanaście aktywności i blisko 100 fragmentów - 0 testów, prawdopodobnie tu jest mój problem.
Właśnie mam zamiar napisać aplikację pokrytą testami i zbieram wiedzę.

  • Czym należy takie fragmenty zastąpić ? Na czym wyświetlać elementy UI ?
  • Do czego ograniczyć się w aktywności ? Takie np. sprawdzanie uprawnień też należy umieścić poza aktywnością ?
  • MVP vs MVVM - gdybyś miał wybrać to który, a może jest jeszcze lepszy ?
  • Skąd informacja że Fragmenty nie są już wspierane ?
0
wioletta90 napisał(a):

Czym należy takie fragmenty zastąpić ? Na czym wyświetlać elementy UI ?

Według mnie nie ma czym. To takie narzekanie dla samego narzekania. Jaki to zły jest framework, jakie to złe są same bebechy Androida, jego api. A zdanie o "traktowaniu wstrętnego frameworka jako wroga naszej pięknej, czystej aplikacji" to już brzmi dla mnie jak wypowiedź schizofrenika. No, ale to tylko moje zdanie. Każdy pisze, że zrobiłby lepiej to a to, a jakoś nie widzę na rynku systemu mobilnego, który byłby taki piękny, miał "clean code" w środku i żeby wszystkim dogodzić. Za to wymyślane są różne cuda na kiju, tak że człowiek, który przeszedł kurs Google na temat programowania na jego system nie mógł z kodu aplikacji zrozumieć absolutnie nic. Trzeba się uczyć podwójnie - najpierw tego, jak Google każe pisać aplikacje na swój system, a potem cudów używanych przez "clean code", MVVM, MVP, HWDP. Daggera, RX, projekt wywrócony całkowicie do góry nogami względem tego, co jest w tutorialach Google i szablonach generowanych prze IDE.

P.S. Jako nowosć jest Flutter, całkowite odciecie się od Androida i jego filozofii. I zgadnijcie co - czytam burczenie, że to jest napisane znów bardzo źle. Trzeba zrobić lepiej i znów traktować framework jako wroga. Deja Vu. Jednym słowem - tak będzie zawsze.

Tak btw, dotyczy to nie tylko Androida. Jeśli myślisz, że inne technologie nie generują podobnych problemów, to się mylisz.

2
wioletta90 napisał(a):
  • Czym należy takie fragmenty zastąpić ? Na czym wyświetlać elementy UI ?

Nie wiem czy miałaś to dokładne na myśli, ale Fragmenty i Activity (jak i każdy inny, z braku lepszego słowa, kontroler) nie służą do wyświetlania UI. Wystarczy spojrzeć na hierarchię widoków, żeby się o tym przekonać. Nigdzie tam nie występują te klasy. Fragmenty i Activity służą do kontroli elementów UI - ustawiania tekstów, chowania w zależności od jakichś danych itd. Na tym powinno się skończyć ich zadanie. Takie kontrolery powinny być dziurką od klucza na stan aplikacji i reagować na zmiany tego stanu. Dokładnie to robi DataBinding, tylko nieopatrznie wymaga logiki w XMLu.

Czym zastąpić Fragmenty? Na starcie niczym bym nie zastępywał. Przede wszystkim jeżeli u Ciebie się sprawdzają i nie sprawiają bólu głowy - korzystaj. Jak nie będziesz miała z nim problemów podczas animacji przejść między ekranami, kontroli stosu nawigacyjnego, cyklem życia albo wspieraniu modularnych layoutów (na ten aspekt akurat nie mam ani jednego dobrego rozwiązania) to tym lepiej. Jeżeli problemy się pojawią albo chcesz zobaczyć alternatywy, to na szybko mogę polecić dwie biblioteki.

wioletta90 napisał(a):
  • Do czego ograniczyć się w aktywności ? Takie np. sprawdzanie uprawnień też należy umieścić poza aktywnością ?

Aktywności powinno się ograniczyć do reagowania na stan aplikacji, który przychodzi do niego z niższych warstw. Ewentualnie do propagacji tego stanu do innych kontrolerów, jeżeli mamy aplikację, która ma już kilka różnych ekranów. Uprawnienia muszą w zasadzie pochodzić z Activity, bo nie ma innego wyboru. Jeżeli pytamy o wszystkie uprawnienia na starcie, to można to i tam zrobić. Nie jest to najlepszy UX, ale rozwiązanie spełnia swoją rolę. Jeżeli chcemy mieć "mądrzejszą" kontrolę nad uprawnieniami, to możemy zaincjalizować w Activity coś, co będzie odpowiedzialne za propagację uprawnień w odpowiednich momentach i reagować na taki stan dopiero wtedy. W skrócie w Activity powinna być inicjalizacja komponentów, które wymagają kontekstu Activity do działania - zazwyczaj rzeczy związane z widokiem.

wioletta90 napisał(a):
  • MVP vs MVVM - gdybyś miał wybrać to który, a może jest jeszcze lepszy ?

Bardzo nie lubię skótowcowych rozgranicznień, bo nie do końca wiem, o czym wtedy się rozmawia. Zakładając, że kiedy mówimy o MVVM chodzi nam o jednokierukowy przepłwy danych, to lepszy dla Androida jest moim zdaniem MVVM. Android z natury jest po prostu asynchroniczny. Praktycznie wszystko w tym systemie takie jest i nieimperatywny przepływ danych w jednym kierunku sprawdza się tu lepiej. Aczkolwiek MVP nie jest złe. Spełnia swoją funkcję bardzo dobrze i na starcie jest na pewno dużo bardziej zrozumiałe.

  • Skąd informacja że Fragmenty nie są już wspierane ?

Stąd - https://developer.android.com/reference/android/app/Fragment.

This class was deprecated in API level 28.
Use the Support Library Fragment for consistent behavior across all devices and access to Lifecycle.

Oczywiście nienatywne Fragmenty dalej są rozwijane. Problemy mają te same, ale przynajmniej można w nich dbać o kompatybilność wsteczną.

2
wioletta90 napisał(a):

W jakim celu 25letni Androidowi Seniorzy/Team Leaderzy wymagają MVVM z databindingiem(ten od Googla), Daggera i jakiś dziwnych ORMów.

Z tej samej przyczyny, dla której moja mama, kiedy była seniorem, a ja jeszcze nieopierzonym juniorem, wymagała, żebym zakładał jakąś dziwną czapkę i szaliczek ;) Dzięki większemu doświadczeniu widziała świat w dłuższej perspektywie czasowej i starała się zapobiec wystąpieniu przyszłego problemu, którego sam nie byłbym w stanie zawczasu przeczuć.

  • Czy ten Dagger to naprawde główna biblioteka ? Czy tak ciężko wstrzyknać te obiekty przez konstruktor ? Nawet na studiach nie jest poruszane wstrzykiwane zależności, bo to tylko wypadkowa myślenia człowieka który poradził sobie z maturą. Tak, zgadzam się, że można wymyślić przykład matrioszki w której użycie Daggera będzie łatwiejsze, ale bez przesady, ile razy trafimy na takie coś w realnym projekcie ?

Najbardziej typowy przykład użycia DI to podmiana produkcyjnych zależności mockami na potrzeby testów jednostkowych. Jak osiągnęłabyś to bez DI? Doprowadziłoby to pewnie do napisania jakiegoś własnego, naiwnego service locatora.

Zarazem zgadzam się, że Dagger, który wymaga sporej ilości abstrakcji, może nieraz stanowić overkill. Do rozważenia są, zwłaszcza jeśli piszemy w Kotlinie (a powinniśmy), prostsze i lżejsze alternatywy, jak Koin czy Kodein.

  • Dlaczego nie możemy informować innych miejsc w aplikacji o jakiejś zmianie używając natywnego BroadcastReceivera tylko robimy to przez RxJave ?

Ale RxJava nie jest tylko do "informowania o jakiejś zmianie". Pozwala m.in. na łatwą obsługę wątków, cyklu życia strumieni, przetwarzania danych w tych strumieniach itd. Robisz search, który zaciąga na bieżąco wyniki z API, ale powinny się odświeżać tylko, jeśli użytkownik przestanie pisać na dwie sekundy? W RxJavie to będzie jedna linijka. Miłego pisania tego w BroadcastReceiverze... Chcesz stworzyć abstrakcję, która umiejętnie połączy w sobie kilka różnych wywołań API, z których kolejne uzupełniają informacje z pierwszych? W RxJavie można to zaimplementować szybko, łatwo i czytelnie. Przy robieniu tego ręcznie powstałby koszmar, na dodatek najeżony bugami, bo RxJava jest testowana nieustannie, a nasz świeżo powstały kod testujemy wyłącznie my sami.

  • Teraz tak bardziej projektowo. MVP? MVVM ? HWDP ? Na co to komu ? Wystarczy odrobina rozsądku żeby ładnie odseparować modele, widoki czy co tam chcecie.

Problem w tym, że u każego ta "odrobina rozsądku" działa ciut inaczej. Kiedy nad projektem pracuje trzech developerów, po jakimś czasie w projekcie będziemy mieć pięć z osobna rozsądnych, ale różniących się od siebie pomysłów np. na obsługę cyklu życia i zapisu stanu ekranów. Praca w takiej aplikacji robi się ciężka. Zastosowanie wzorca opartego o konkretne zasady wymusza pewną standardyzację podejścia.

No i oczywiście nigdy idealnie nie zrobicie wszystkiego zgodnie z jednym wzorcem projektowym + każdy interpetuje go inaczej, już nie raz nie dwa widziałam na tym forum awanturę doświadczonych osobników inaczej rozumiejących MVC.

To prawda. I te rozbieżne interpretacje ujawnią się tym bardziej, jeśli każdy będzie improwizował.

  • Clean architecture ? - tego w ogóle nie znam więc nie krytykuję, ale może ktoś ma coś do powiedzenia.

Traktowana ortodoksyjnie wymaga sporej ilości boilerplate'u. Widywałem jej implementacje na Androidzie, i też nie byłem zachwycony. Miałem wrażenie, że to podejście wypada chyba lepiej w dużych aplikacjach webowych. Natomiast jeśli traktować jej wytyczne liberalnie, to różnice względem czysto zaimplementowanego MVP czy MVVM staną się akademickie...

  • Pozbycie się fragmentów - w jakim celu ?

To jedna ze szkół myślenia. Fragmenty mają dość skomplikowane API i kryją sporo pułapek, np. jeśli chodzi o cykl życia (a już nie daj Boże pracować z fragmentami zagnieżdżonymi). Nabawiły się przez to swoich antyfanów, którzy starają się nie używać Fragmentów. Zob. np. https://medium.com/square-corner-blog/advocating-against-android-fragments-81fd0b462c97

0

@V-2 ale nie ma alternatywy dla fragmentów. Tak to zostało wymyślone i tyle, trzeba to przełknąć. Nawet jeśli ktoś sobie napisał własną obsługę dynamicznych widoków, to i tak nie zawsze się da to zastosować i mam obawy czy po którejś aktualizacji api Androida nie posypie się to - tak często bywa z niestandardowymi bibliotekami. Jeśli jest to coś szeroko używanego i znanego, jak Rx albo Dagger to ok, ale opieranie całej aplikacji na jakiejś mało znanej bibliotece, która w każdej chwili może przestać być rozwijana i zacząć się sypać przy kolejnym target api, tego raczej bym unikał.

Trochę chyba Google chce to ucywilizować, dodali nawet do IDE szablon Fragment + ViewModel, gdzie jest prostsza komunikacja pomiędzy fragmentami albo fragmentem z activity i vice versa. Ale ogólnie cała obsługa fragmentów jest upierdliwa, tu nie ma dyskusji.

A tak btw, czy obsługa cyklu życia nie jest uproszczona przez zastosowanie LiveData/MutableLiveData? I ogólnie całe android.arch.lifecycle (pewnie zaraz się dowiem, że to też guano)

1 użytkowników online, w tym zalogowanych: 0, gości: 1