O esquema Model-View-Presenter (MVP) é útil para Android?

34

Como separar o View e o Presenter no Android, enquanto as reações nas ações do usuário (parte do Presenter do MVP) são definidas nas mesmas atividades que mostram os elementos da GUI (View parte of MVP).

"No apresentador de visualização de modelos, como Martin Fowler ou Michael Feathers [2] dizem, a lógica da interface do usuário é separada em uma classe chamada apresentador, que lida com toda a entrada do usuário e informa à visualização" burra "o que e quando display "(citado a partir daqui ).

Até agora, pensei que uma das principais características do Android é a Atividade inteligente que executa ações, reage a elas e mostra os resultados. O esquema MVP está em contradição com a filosofia do Android? Tem sentido tentar realizá-lo no Android? Se sim, como isso poderia ser feito?

Gangnus
fonte
2
+1 Boa pergunta, porque ainda não vi mvp / mvvm em fontes de aplicativos para Android. Seria interessante ver exemplos android mvp e quanto código / lib de sobrecarga eles produzem. Esta questão não foi discutida na Stackoverflow recomenda-maneiras-a produzir-app portátil-entre-android-e-outros-plataformas
k3b
Talvez, eu poderia colocá-lo no Stackoverflow, ou seria contra as regras?
Gangnus
Você pode solicitar que um dos administradores migre essa pergunta em vez de duplicar o Qestion. Aqui nas programmersperguntas há uma questão mais controversa "o que você acha ../é bom ou ruim para ...", enquanto stackoverflowseria mais parecido com "Existem exemplos de mvp no android". Para mim, ambos os lugares estão ok.
K3b
Sinto muito pela minha infelicidade, mas até agora não encontrei uma maneira de me conectar aos administradores :-(
Gangnus
Esta pergunta NÃO é adequada para estouro de pilha. BTW - você pode entrar em contato com os moderadores sinalizando sua postagem usando o link "sinalizador".
ChrisF

Respostas:

15

Os aplicativos Android são basicamente construídos em torno do Model-View-Controller (MVC) - o MVP parece a mesma coisa, embora eu nunca tenha ouvido o termo antes. As atividades desempenham o papel de Controller, as exibições XML são apenas isso (embora você possa construí-las programaticamente na Activity - é apenas mais fácil e mais simples fazê-lo em XML) e o modelo que você escreve. Então, sim, esse modelo é bastante prático.

Um possível motivo para você não ter ouvido falar muito sobre esse modelo de design é que a estrutura do Android obriga a separar a visualização. Como o aplicativo em dispositivos móveis costuma ser pequeno, as pessoas não costumam usar o MVC completo; eles tendem para as camadas de visualização e ação, nas quais a camada de ação executa grande parte do trabalho (pequeno) do modelo.

Se você estiver escrevendo um aplicativo de plataforma cruzada, convém observar uma abordagem em quatro camadas: Visualização, Ação, Lógica de negócios e Modelo. As camadas View e Action seriam específicas da plataforma, enquanto a lógica e o modelo de negócios não seriam alterados. Basicamente, você divide a interação do apresentador e do usuário na camada Ação, que chama a camada Lógica Comercial para executar a ação que o usuário deseja.

Michael K
fonte
+1! Por favor, você poderia dar uma ou duas referências a alguns bons textos?
Gangnus
4
Eu pensei que o MVP oferece a você a oportunidade de manter a Actionplataforma da camada (= Presentation) independente também - pelo menos quando suas plataformas diferentes oferecem recursos semelhantes de interface do usuário.
Doc Brown
@DocBrown Em teoria, sim. Na prática, não tenho certeza se isso será possível, porque as interações do usuário podem afetar a visualização ou o apresentador. Por exemplo, no Android, os furtos são tratados pela atividade, mas as páginas da Web são tratadas pela visualização (navegador).
Michael K
12
"Os aplicativos Android são basicamente construídos em torno do Model-View-Controller" - isso é errado em muitos níveis, me desculpe. A arquitetura da estrutura do Android é construída em torno das Classes God, nas quais a lógica do View / Controller é desordenada.
Igor Filippov
2
Eu gostaria de poder votar novamente o comentário de @ IgorFilippov mais de uma vez. A ideia de que aplicativos Android implementam MVC por design é um equívoco comum. Ao contrário do iOS, nenhuma arquitetura de GUI é imposta pelo Android com clara separação de preocupações e permitindo um modelo isolado e facilmente testável. Você deve fornecer um você mesmo, seja MVP, MVC ou qualquer outra coisa.
Piovezan
6

Não tenho experiência em programação para Android, mas, olhando rapidamente alguns tutoriais introdutórios de programação para Android, não vejo uma razão pela qual o MVP seja menos útil como em qualquer outra estrutura orientada a eventos. A Activityclasse não é muito diferente da Dialogou Formem outras estruturas, portanto, deve ser fácil criar uma classe "Activitity Presenter" para qualquer subclasse Activity do seu aplicativo e colocar a lógica principal lá.

Os eventos enviados para a sua "Atividade" devem ser delegados ao apresentador e, se o apresentador enviar eventos por conta própria ou chamar outros recursos dependentes do sistema, a Atividade deverá fornecer funções relacionadas por meio da interface que ele compartilha com o apresentador. Mas isso é basicamente o mesmo que em qualquer outra estrutura GUI que eu conheça.

Doc Brown
fonte
+1 obrigado pelo seu tempo. Mas como você vê em outra resposta, no Android é usado modelo semelhante, mas diferente. "Falei em prosa por 50 anos e não sabia disso!" Agora vou tentar olhar para as diferenças dos modelos.
Gangnus
4
@ Gangnus: MVP é uma forma especial de MVC, aqui codebetter.com/jeremymiller/2007/07/26/… você encontra mais informações. E eu tenho certeza que isso não é uma questão de "MVC ou MVP". As atividades podem ser uma forma de "controlador", mas são dependentes da plataforma. A separação da lógica da interface do usuário com uma classe de apresentador independente da plataforma para cada atividade provavelmente os tornará mais fáceis de serem testados por unidade e mais portáteis.
Doc Brown)
5

O MVP é definitivamente útil para o Android. Ajuda a organizar e testar seu código de unidade. E a melhor parte é que novas pessoas que leem seu código poderão entender o código e começarão a contribuir assim que souberem o que deve ir aonde. Aqui está um link muito útil para entender o MVP com exemplos .

Aqui está uma breve explicação de todos os três componentes do MVP

Visão

No MVP do Android, uma exibição contém duas coisas: Activity - recurso Android View - interface java Activity Implementa a View e ela se injeta (interface View) no apresentador para que o apresentador possa conversar com a atividade usando a interface view. Os três primeiros blocos do diagrama mostram a comunicação entre o View e o Presenter.

Apresentador

O Presenter atua como uma camada intermediária entre View e Data / Model. O View (Activity) comanda o apresentador para apresentar algo e o apresentador pega os dados do banco de dados / Modelo e devolve a forma apresentável dos dados para o View. O View cuida da exibição desses dados na tela. E lembre-se de que o Presenter é uma classe java simples, não deve incluir nenhum dos componentes do Android, caso contrário, tornará difícil o teste de unidade do apresentador.

Se você deseja usar o banco de dados no apresentador, faça com que a atividade crie uma instância de banco de dados e injete-a no apresentador. Isso ajudará você a zombar do banco de dados durante o teste de unidade e permitirá testar a lógica de negócios.

Modelo

O modelo no MVP nada mais é que a sua fonte de dados. O View não fala diretamente com os dados, em vez disso, comanda o Presenter para manipular os dados e devolver as informações que podem ser exibidas sem nenhuma modificação adicional.

Ajit Singh
fonte
1
Informações são úteis, obrigado, mas são fornecidas de maneira ruim. Você não deve apenas citar um site, mesmo que seja seu, mas fornecer informações aqui. Respostas de referência não são permitidas. Use comentários em seu lugar. Não estou sinalizando apenas por causa das informações úteis em seu site. Altere-o para um comentário ou coloque na resposta algumas informações importantes que estão respondendo ao corpo da pergunta. Então, certamente, você receberá não apenas minha vantagem, mas também a resposta.
Gangnus 22/09/2015
@ Gangnus Eu forneci as informações necessárias na resposta, porque colocar todo o conteúdo tornará a resposta muito grande.
precisa saber é o seguinte
1
Na verdade, existem dois tipos de MVP. Visão Passiva (o que você descreveu aqui) e Supervisão do Apresentador, que permite a ligação direta de dados da visão ao modelo (como MVVM e muitas estruturas da Web MVC).
precisa