2014-07-11 17 views
8

Model-widok-prezenter (MVP) to dobrze znany wzorzec projektowania aplikacji GUI. W przypadku Androida wdrożenie logiki biznesowej w prostym module Java ułatwia testowanie bez konieczności używania emulatora Androida.Trudności związane z funkcją Model-View-Presenter w systemie Android

Jednak mam trudności wykonawcze wzór na Androida z powodu szczególnych wymagań do GUI aplikacji Android:

  • działalność może zostać zniszczony w dowolnym punkcie (połączenia przychodzącego, użytkownik naciska przycisk home, ...), a po odtworzeniu powinien znajdować się dokładnie w tym samym stanie, w jakim został. W przeciwieństwie do większości innych aplikacji GUI.

  • Aktywność może przejść przez wiele stanów cyklu życia. Można go wstrzymać, w którym to przypadku interfejs użytkownika działania nie powinien być modyfikowany. Jeśli na przykład niektóre dane są ładowane w tle, nie można ich przekazać do części widoku MVP (działanie), jeśli jest w stanie wstrzymania. Ponownie, jest to nietypowy wymóg.

Czytałem blogu MVP for Android i spojrzał na example source code. Ostatecznym celem, jaki staram się osiągnąć przy użyciu wzorca MVP, jest możliwość przetłumaczenia całej logiki biznesowej na Objective-C za pomocą transpilatora j2objc, tak, że logika biznesowa może zostać ponownie wykorzystana podczas wdrażania tej samej aplikacji na iOS.

Czy jest ktoś, kto pomyślnie wdrożył wzorzec MVP dla Androida, a w takim przypadku czego mi brakuje?

+0

Zastanawiam się: jeśli moduł logiki biznesowej jest zwykłym java bez potrzeby "kontekstu", dlaczego ma znaczenie cykl życia "Działanie"? Innymi słowy, dlaczego te specjalne wymagania GUI są problemem? – Blacklight

+0

Jeśli część "Widok" MVP może nie być aktualizowana w niektórych punktach (gdy jest wstrzymana), czy 'Presenter' lub' Model' nie znają? A czy "Model" nie powinien być tak stworzony, aby można go było przywrócić w późniejszym czasie? – foens

+1

Można argumentować, że działanie jest odpowiedzialne za zarządzanie cyklem życia i ustawianie/wstrzymywanie/odrywanie prezentera w razie potrzeby. Prezenter nie jest mądrzejszy w stosunku do twojego układu zależnego od ramek interfejsu użytkownika. – dcow

Odpowiedz

4

Sugeruję wdrożenie komponentu MVP bez angażowania Aktywności, być może koncepcyjnego myślenia o tym, co byłoby przydatne zarówno na Androidzie, jak i na GWT. Utwórz komponent za pomocą test-driven-development z fałszywym interfejsem View, dodając testy aż do pełnego wdrożenia i weryfikacji logiki biznesowej. TDD pomaga utrzymać API komponentu w sposób ubogi (dlaczego pisać testy na rzeczy, których nie potrzebujesz?), Co ułatwia przenoszenie komponentu.

Opisane poniżej wymagania dotyczące działania można uogólnić tak, aby były niezależne od platformy: komponent powinien być możliwy do serializowania (małe litery, a nie serializacji Java) i musi akceptować zdarzenia stanu cyklu życia. Te również można w pełni przetestować za pomocą makiet dla funkcji systemu. W trakcie tego kroku najprawdopodobniej zauważysz, że kilka wymagań dotyczących działania jest koniecznych dla systemu Android i może być użytecznych na innych platformach. Unikaj tworzenia ogromnych API usług; do obsługi serializacji, na przykład, wszystko, co jest potrzebne, to metody przechowywania/ładowania, a nie coś takiego jak Parcel API. Odkryłem, że opisywanie takich usług API dla innego programisty na tablicy jest świetnym sposobem na znalezienie niepotrzebnego puchu.

Następnie przenieś komponent do systemu Android, być może poprzez utworzenie działania, które deleguje do komponentu i przewiduje klasy implementacji specyficzne dla systemu Android dla wyśmiewanych interfejsów. Wszystko powinno "po prostu działać" za pierwszym razem, ale w rzeczywistości pewne wymagania mogły zostać pominięte, więc dodaj je do części niezależnej od platformy i powtórz.

Gdy jesteś gotowy na port na iOS, ponownie zaimplementuj te wcześniej wyśmiewane interfejsy. Jeśli te interfejsy są ubogie, prawdopodobnie łatwiej będzie je utworzyć bezpośrednio w Objective-C, importując nagłówki protokołów generowane przez j2objc. Na przykład klasa j2objc NSDictionaryMap implementuje java.util.Map z implementacją NSDictionary - nie trzeba pisać i tłumaczyć wersji Java, ponieważ używa ona tylko interfejsów API iOS.

+0

Cześć i dzięki za pomysły. Nie jestem do końca pewien, czym jest "składnik". Czy mówisz o prezencie? W twoim poście czuję, że opisujesz proces implementacji o nazwie [Presenter-First] (http://atomicobject.com/files/PresenterFirstAgile2006.pdf), czy poprawiam się w tym? Widoki powinny być interfejsami (bez specyfiki platformy) i powinny być implementowane przez działanie na Androida. Uważam, że wdrożenie procedur zapisywania/ładowania będzie wymagało znacznego wysiłku, co również skutecznie oznacza ponowne wdrożenie procesu odtwarzania systemu Android. – foens

+0

Nazywałem połączoną jednostką MVP komponent, czy jest lepsza nazwa? Wszystkie dostępne terminy wydają się przeciążone. Masz rację co do prezentera - po pierwsze, dziękuję za link, ponieważ nie przeczytałem tego artykułu. Zapis/ładunek powinien być wywoływany zewnętrznie z usługi archiwizowania specyficznej dla platformy, takiej jak serializacja Parcel lub Java - cały komponent powinien obsługiwać własny magazyn/przywracanie. Dzięki temu serwisowi kod specyficzny dla systemu Android będzie korzystał z tego samego kodu, który normalnie by obsługiwał aplikacja na Androida. – tball

1

Uważam, że wariant MVP Androida jest zbudowany wokół, jest krokiem w dobrym kierunku do izolowania logiki biznesowej w aplikacji.Jeśli jednak chcesz uzyskać lepszy rozdział obaw, a co za tym idzie logikę domeny/biznesu wielokrotnego użytku, polecam użyć Presenter First pattern (o czym krótko wspominasz w komentarzu). Oprócz zmniejszania sprzężenia, dobrze nadaje się także do TDD i pozwala na testowanie całej swojej logiki biznesowej.

Niedawno rozpocząłem repozytorium GitHub z prezenterami Pierwsze przykłady dla Androida. Ze względu na złożoność architektury Androida, implementacja wzorca nie jest prosta. Widoki wydają się być "grubsze" niż to, co wydaje się akceptowalne w zwykłej aplikacji Presenter First, głównie z powodu cyklu życia aktywności i innych dziwactw, o których wspominasz. Zrobiłem co w mojej mocy, aby oddzielić logikę biznesową od platformy, ale na pewno jest miejsce na ulepszenia. Można znaleźć przykłady na stronie:

http://github.com/olerass/presenter-first-android

Może można użyć kilka pomysłów stamtąd? Lub jeszcze lepiej dodaj swój własny.

Powiązane problemy