44
CLÊRTON LEAL

Arquitetura para aplicações Android. Do MVP ao MVVM

Embed Size (px)

Citation preview

Page 1: Arquitetura para aplicações Android. Do MVP ao MVVM

CLÊRTON LEAL

Page 2: Arquitetura para aplicações Android. Do MVP ao MVVM

QUEM SOU EU

▸ Clêrton Leal

▸ Nascido e criado na cidade de Fortaleza

▸ Trabalhando como consultor para a Avenue Code de Belo Horizonte

▸ Morando em BH a pouco mais de 6 meses =)

Page 3: Arquitetura para aplicações Android. Do MVP ao MVVM

ARQUITETURA DE SOFTWARE

Page 4: Arquitetura para aplicações Android. Do MVP ao MVVM

O QUE VAMOS VER HOJE?

▸ Arquitetura padrão para aplicações Android (Ou a falta dela)

▸ Model-View-Presenter - MVP

▸ Model-View-ViewModel - MVVM

▸ DataBinding Library by Google

▸ Testabilidade

Page 5: Arquitetura para aplicações Android. Do MVP ao MVVM

TESTES!!!!

Page 6: Arquitetura para aplicações Android. Do MVP ao MVVM

ARQUITETURA DE SOFTWARE

Page 7: Arquitetura para aplicações Android. Do MVP ao MVVM

“UM PADRÃO ARQUITETURAL É UMA SOLUÇÃO GERAL E REUSAVEL PARA UM PROBLEMA RECORRENTE EM DESENVOLVIMENTO DE SOFTWARE"

Page 8: Arquitetura para aplicações Android. Do MVP ao MVVM
Page 9: Arquitetura para aplicações Android. Do MVP ao MVVM

QUAIS OS PROBLEMAS RECORRENTES AO CONSTRUIR UM APP ANDROID?????

Page 10: Arquitetura para aplicações Android. Do MVP ao MVVM

VAMOS ANALISAR A ESTRUTURA DE UMA ACTIVITY

Page 11: Arquitetura para aplicações Android. Do MVP ao MVVM

Activity-> UI

-> Lógica de apresentação

-> Requisições de Rede

-> Regras de negócio

-> Outras bagunças incompreensíveis

Page 12: Arquitetura para aplicações Android. Do MVP ao MVVM

Deus do código Macarrônico

Primeiro engenheiro Android

Page 13: Arquitetura para aplicações Android. Do MVP ao MVVM

PROBLEMAS EM APPS ANDROID

▸ Muito Difícil de testar

▸ Difícil de entender o código gerado

▸ Dificuldade de manutenção

▸ Falta de confiabilidade de software

Page 14: Arquitetura para aplicações Android. Do MVP ao MVVM

BENEFICIOS DE UMA ARQUITETURA FORTE

▸ Código legível e de fácil entendimento

▸ Fácil de escalar

▸ Fácil de testar <3

▸ Fácil de corrigir bugs (Tudo está no seu devido lugar)

▸ Redução de riscos técnicos

Page 15: Arquitetura para aplicações Android. Do MVP ao MVVM

MORTE A

ACTIVITY GOD

Page 16: Arquitetura para aplicações Android. Do MVP ao MVVM

TEMOS DE IMPLEMENTAR UMA ARQUITETURA PERSONALIZADA AO DESENVOLVER UMA APLICAÇÃO ANDROID

Page 17: Arquitetura para aplicações Android. Do MVP ao MVVM

“UMA BOA ARQUITETURA ISOLA A VIEW DE TODO O RESTANTE DA APLICAÇÃO. ASSIM, PODEREMOS EXTRAI-LÁ SEMPRE QUE NECESSÁRIO.”

Page 18: Arquitetura para aplicações Android. Do MVP ao MVVM

MVC MVP VIPER

CLEAN MVVM

Page 19: Arquitetura para aplicações Android. Do MVP ao MVVM

MVP

Page 20: Arquitetura para aplicações Android. Do MVP ao MVVM

MVP É UMA DERIVAÇÃO DO MVC, FOCADO O ISOLAMENTO DA VIEW

Page 21: Arquitetura para aplicações Android. Do MVP ao MVVM

FOI CRIADO EM 1990 POR UMA EMPRESA CHAMADA TALIGENT, PARA SER USADO EM SUAS APLICAÇÕES EM C++

Page 22: Arquitetura para aplicações Android. Do MVP ao MVVM

SIM, O MVP É UMA PADRÃO COM MAIS DE 25 ANOS DE IDADE!!!

Page 23: Arquitetura para aplicações Android. Do MVP ao MVVM

VIEW PRESENTER MODELrequestUser(userId)

showUser(user)

requestUser(userId)

showUser(user)

Android Java Puro

XML + Activity/Fragment Logica de Apresentação Regras de negócio

File System

Banco de dados

Sensores

Dependências Android injetadas

Regras de negócios

+

Page 24: Arquitetura para aplicações Android. Do MVP ao MVVM

PONTOS POSITIVOS

▸ Camadas de Presenter e Model são testáveis

▸ Muita lógica removida de dentro das Views

▸ Camadas bem definidas facilitam o intendimento do código

▸ Entendimento muito simples de sua implementação

Page 25: Arquitetura para aplicações Android. Do MVP ao MVVM

MUITO CÓDIGO ADICIONAL PARA CRIAR OS PRESENTERS E INTERFACES DE COMUNICAÇÃO

Page 26: Arquitetura para aplicações Android. Do MVP ao MVVM

INTERFACES DE COMUNICAÇÃO

public interface CreateUserView { void userCreated(User user); String getEmail(); String getCpf(); String getRg(); String getLastName(); String getFirstName(); void setEmailError(); void setCpfError(); void setRgError(); void setLastNameError(); void setFirstNameError(); }

Page 27: Arquitetura para aplicações Android. Do MVP ao MVVM

AS INTERFACES DE COMUNICAÇÃO DO MVP SÃO UM PROBLEMA. =/

Page 28: Arquitetura para aplicações Android. Do MVP ao MVVM

MVVM

Page 29: Arquitetura para aplicações Android. Do MVP ao MVVM

O MVVM FOI DESENVOLVIDO PELA MICROSOFT EM 2005.

Page 30: Arquitetura para aplicações Android. Do MVP ao MVVM

COM O INTUITO DE FACILITAR A IMPLEMENTAÇÃO DE PROGRAMAÇÃO ORIENTADA A EVENTOS PARA UI

Page 31: Arquitetura para aplicações Android. Do MVP ao MVVM
Page 32: Arquitetura para aplicações Android. Do MVP ao MVVM

MVVM IMPLICA NO USO DE UMA API DE DATABINDING

Page 33: Arquitetura para aplicações Android. Do MVP ao MVVM
Page 34: Arquitetura para aplicações Android. Do MVP ao MVVM

DATABINDING MUDA COMPLETAMENTE O MODO DE DESENVOLVER APPS ANDROID

Page 35: Arquitetura para aplicações Android. Do MVP ao MVVM

VIEW View-Model MODEL

Android Java Puro

XML + Activity/Fragment

DataBinding

Dependências Android injetadas+

File System

Banco de dados

Sensores

Regras de negócios

Page 36: Arquitetura para aplicações Android. Do MVP ao MVVM
Page 37: Arquitetura para aplicações Android. Do MVP ao MVVM

public class User { private String firstName; private String lastName; private String rg; private String cpf; private String email; public User() {} public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; }

Page 38: Arquitetura para aplicações Android. Do MVP ao MVVM

public class User { private String firstName; private String lastName; private String rg; private String cpf; private String email; public User() {} public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getRg() { return rg;

Page 39: Arquitetura para aplicações Android. Do MVP ao MVVM

TEXTO

<EditText android:id="@+id/first_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/first_name" app:fillError="@{viewModel.firstNameError}" android:text="@={viewModel.user.firstName}" android:layout_marginBottom="10dp"/> <EditText android:id="@+id/last_name" android:layout_width="match_parent" android:layout_height="wrap_content" app:fillError="@{viewModel.lastNameError}" android:text="@={viewModel.user.lastName}" android:layout_marginBottom="10dp"/> <EditText android:id="@+id/rg" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="10dp" app:fillError="@{viewModel.rgError}" android:text="@={viewModel.user.rg}"/>

Page 40: Arquitetura para aplicações Android. Do MVP ao MVVM

VIEW View-Model MODEL

Android Java Puro

XML + Activity/Fragment

DataBinding

firstName firstName

lastName lastName

email email

RG RG

CPF CPF

Page 41: Arquitetura para aplicações Android. Do MVP ao MVVM

public class UserCreateViewModel { private User user = new User(); public ObservableField<String> firstNameError = new ObservableField<>(); public ObservableField<String> lastNameError = new ObservableField<>(); public ObservableField<String> rgError = new ObservableField<>(); public ObservableField<String> cpfError = new ObservableField<>(); public ObservableField<String> emailError = new ObservableField<>(); public void userCreated(User user) { if (isFormFilled(user)) { createUserView.onUserCreated(user); } } private boolean isFormFilled(User user) { if (TextUtils.isEmpty(user.getFirstName())) { firstNameError.set(createUserView.getString(R.string.mandatory_field)); return false; } else if (TextUtils.isEmpty(user.getLastName())) { lastNameError.set(createUserView.getString(R.string.mandatory_field)); return false; } else if (TextUtils.isEmpty(user.getRg())) { rgError.set(createUserView.getString(R.string.mandatory_field)); return false; } else if (TextUtils.isEmpty(user.getCpf())) { cpfError.set(createUserView.getString(R.string.mandatory_field)); return false; } else if (TextUtils.isEmpty(user.getEmail())) { emailError.set(createUserView.getString(R.string.mandatory_field)); return false; } return true; } }

Page 42: Arquitetura para aplicações Android. Do MVP ao MVVM

VAMOS VER UNS CÓDIGOS. =D

Page 43: Arquitetura para aplicações Android. Do MVP ao MVVM

HTTPS://GITHUB.COM/CLERTONLEAL/ANDROID-ARCHITECTURE

CÓDIGO DE EXEMPLO

Page 44: Arquitetura para aplicações Android. Do MVP ao MVVM

OBRIGADO‣ [email protected] ‣ @CLERTONLEAL