Czy schemat Model-View-Presenter (MVP) jest przydatny dla Androida?

34

Jak oddzielić View i Presenter w Androidzie, podczas gdy reakcje na działania użytkownika (Presenter część MVP) są ustawione na te same działania, które pokazują elementy GUI (View część MVP).

„W prezenterie widoku modelu, jak mówią Martin Fowler lub Michael Feathers [2], logika interfejsu użytkownika jest podzielona na klasę o nazwie prezenter, która obsługuje wszystkie dane wejściowe od użytkownika i która mówi„ głupemu ”widokowi, co i kiedy zrobić display ”(cytowano stąd ).

Do tej pory myślałem, że jedną z głównych funkcji Androida jest inteligentna Aktywność, która podejmuje działania, reaguje na nie i pokazuje wyniki. Czy schemat MVP jest sprzeczny z filozofią Androida? Czy warto to zrealizować na Androidzie? Jeśli tak, jak można to zrobić?

Gangnus
źródło
2
+1 Dobre pytanie, ponieważ jeszcze nie widziałem mvp / mvvm w źródłach aplikacji na Androida. Byłoby interesujące zobaczyć przykłady mvp dla Androida i ile produkują kodu / lib. Ten problem nie był omawiany na Stackoverflow zalecanych metodach produkcji aplikacji przenośnych między platformami Android i innymi platformami
k3b
Może mógłbym umieścić go w Stackoverflow, czy byłoby to niezgodne z regułami?
Gangnus
Możesz poprosić jednego z administratorów o migrację tego pytania zamiast duplikowania Qestion. Tutaj na programmerspytania są bardziej kontrowersyjne pytanie „co sądzisz o… / czy to dobrze, czy źle…”, podczas gdy stackoverflowbyłoby bardziej jak „Czy istnieją przykłady mvp w Androidzie”. Dla mnie oba miejsca są w porządku.
k3b
Bardzo mi przykro z powodu mojego nieszczęścia, ale do tej pory nie znalazłem sposobu, aby połączyć się z administratorami :-(
Gangnus
To pytanie NIE jest odpowiednie w przypadku przepełnienia stosu. BTW - możesz skontaktować się z moderatorami, oznaczając swój post za pomocą linku „flag”.
ChrisF

Odpowiedzi:

15

Aplikacje na Androida są zasadniczo zbudowane wokół Model-View-Controller (MVC) - MVP brzmi tak samo, chociaż nie słyszałem wcześniej tego terminu. Działania wypełniają rolę Kontrolera, Widoki XML są po prostu takie (chociaż można je programowo budować w Działaniu - po prostu łatwiej i prościej jest to zrobić w XML), a Model sam piszesz. Tak, ten model jest całkiem praktyczny.

Możliwym powodem, dla którego mogłeś nie słyszeć dużo o tym modelu projektowym, jest to, że struktura systemu Android zmusza Cię do oddzielenia widoku. Ponieważ aplikacja na urządzenia mobilne jest zwykle niewielka, ludzie nie używają w pełni MVC; mają tendencję do tworzenia warstw widoku i akcji, w których warstwa akcji wykonuje większą część (małego) modelu.

Jeśli piszesz aplikację wieloplatformową, możesz przyjrzeć się czterowarstwowemu podejściu: Widok, Działanie, Logika biznesowa i Model. Warstwy Widok i Działanie byłyby specyficzne dla platformy, podczas gdy Logika biznesowa i Model nie zmieniłyby się. Zasadniczo dzielisz interakcje prezentera i użytkownika na warstwę akcji, która wywołuje warstwę logiki biznesowej w celu wykonania żądanej przez użytkownika akcji.

Michael K.
źródło
+1! Czy mógłbyś podać jakieś dwa dobre teksty na ten temat?
Gangnus
4
Myślałem, że MVP oferuje również możliwość zachowania Actionniezależności platformy warstwy (= Prezentacja) - przynajmniej wtedy, gdy różne platformy oferują podobne możliwości interfejsu użytkownika.
Doc Brown
@DocBrown Teoretycznie tak. W praktyce nie jestem pewien, czy kiedykolwiek będzie to możliwe, ponieważ interakcje użytkownika mogą trafić zarówno w widok, jak i prezentera. Na przykład w Androidzie przeciągnięcia są obsługiwane przez aktywność, ale na stronach internetowych byłby obsługiwany przez widok (przeglądarkę).
Michael K
12
„Aplikacje na Androida są zbudowane wokół Model-View-Controller” - to po prostu źle na wielu poziomach, przepraszam. Architektura frameworka systemu Android jest zbudowana wokół Boskich klas, w których logika widoku / kontrolera jest zagracona.
Igor Filippov
2
Chciałbym móc wypowiedzieć się na temat komentarza @ IgoraFilippova więcej niż raz. Pomysł, że aplikacje na Androida implementują MVC zgodnie z projektem, jest powszechnym nieporozumieniem. W przeciwieństwie do iOS żadna architektura GUI nie jest wymuszana przez system Android z wyraźnym oddzieleniem problemów i umożliwieniem wyizolowania, łatwego do przetestowania Modelu. Musisz sam go dostarczyć, czy to MVP, MVC czy coś innego.
Piovezan
6

Nie mam doświadczenia w programowaniu na Androida, ale po zapoznaniu się z niektórymi wprowadzającymi samouczkami programowania na Androida nie widzę powodu, dla którego MVP powinien być mniej przydatny, jak w jakimkolwiek innym frameworku sterowanym zdarzeniami. ActivityKlasa nie jest bardzo różni się od Dialoglub Formna innych forach, więc powinno być łatwe, aby stworzyć klasę „Activitity Presenter” dla każdej podklasy aktywność danej aplikacji i umieścić tam chipsetów.

Zdarzenia wysyłane do „Aktywności” muszą być przekazane prezenterowi, a jeśli prezenter sam wysyła zdarzenia lub wywołuje inne funkcje zależne od systemu, Aktywność musi zapewniać powiązane funkcje za pośrednictwem interfejsu udostępnianego prezenterowi. Ale to w zasadzie to samo, co w każdym innym frameworku GUI, który znam.

Doktor Brown
źródło
+1 dziękuję za poświęcony czas. Ale jak widać z innej odpowiedzi, w Androidzie jest używany podobny, ale inny model. „Mówiłem prozą przez 50 lat i nie wiedziałem o tym!” Teraz spróbuję spojrzeć na różnice w modelach.
Gangnus
4
@Gangnus: MVP jest specjalną formą MVC, tutaj codebetter.com/jeremymiller/2007/07/26/ ... znajdziesz więcej informacji. I jestem prawie pewien, że nie jest to kwestia „albo MVC, albo MVP”. Działania mogą być formą „kontrolera”, ale zależą od platformy. Rozdzielenie logiki interfejsu użytkownika na niezależną od platformy klasę prezentera dla każdego działania prawdopodobnie ułatwi testowanie jednostkowe i będzie bardziej przenośne.
Doc Brown
5

MVP jest zdecydowanie przydatny dla Androida. Pomaga zorganizować i przetestować kod w jednostce. A najlepsze jest to, że nowi ludzie czytający Twój kod będą w stanie zrozumieć kod i zaczną w nim uczestniczyć, gdy tylko dowiedzą się, gdzie powinien iść. Oto bardzo pomocny link do zrozumienia MVP z przykładami .

Oto krótkie wyjaśnienie wszystkich trzech składników MVP

Widok

W Androidzie MVP widok zawiera dwie rzeczy Aktywność - zasób Androida Widok - interfejs Java Aktywność implementuje widok i wstrzykuje się (prezenter interfejsu) do prezentera, dzięki czemu prezenter może rozmawiać z aktywnością za pomocą interfejsu widoku. Pierwsze trzy bloki diagramu pokazują komunikację między View a Prezenterem.

Prezenter

Prezenter działa jako środkowa warstwa między Widokiem a danymi / modelem. View (Activity) wyświetla polecenia prezenterowi, aby coś zaprezentować, a następnie prezenter pobiera dane z bazy danych / modelu i przekazuje prezentowalną formę danych do View. Następnie View zajmuje się wyświetlaniem tych danych na ekranie. I pamiętaj, że Presenter to zwykła klasa Java, nie powinna zawierać żadnego z komponentów Androida, w przeciwnym razie utrudni to testowanie jednostki prezentera.

Jeśli chcesz użyć bazy danych w prezencie, spraw, aby aktywność utworzyła instancję bazy danych i wstrzyknęła ją do prezentera. Pomoże to wyśmiewać bazę danych podczas testów jednostkowych i umożliwi przetestowanie logiki biznesowej.

Model

Model w MVP to nic innego jak twoje źródło danych. Widok nie komunikuje się bezpośrednio z danymi, zamiast tego nakazuje Prezenterowi przetworzenie danych i przekazanie informacji, które można wyświetlić bez dalszych modyfikacji.

Ajit Singh
źródło
1
Informacje są przydatne, dziękuję, ale są podawane w zły sposób. Powinieneś nie tylko zacytować witrynę, nawet własną, ale podać tutaj informacje. Odpowiedzi referencyjne są niedozwolone. Zamiast tego użyj komentarzy. Nie oflaguję go tylko ze względu na przydatne informacje na twojej stronie. Zmień to w komentarz lub wpisz w odpowiedzi kilka kluczowych informacji odpowiadających treści pytania. Na pewno dostaniesz nie tylko mój plus, ale nawet odpowiedź.
Gangnus,
@Gangnus W odpowiedzi dostarczyłem niezbędne informacje, ponieważ umieszczenie całej zawartości sprawi, że odpowiedź będzie bardzo duża.
Ajit Singh,
1
Istnieją dwa rodzaje MVP. Widok pasywny (opisany tutaj) i Supervisoring Presenter, który umożliwia bezpośrednie powiązanie danych widoku z modelem (podobnie jak MVVM i wiele frameworków MVC w Internecie).
RubberDuck,