Arquitetura para aplicações Android. Do MVP ao MVVM.
-
Upload
clerton-leal -
Category
Software
-
view
94 -
download
1
Transcript of Arquitetura para aplicações Android. Do MVP ao MVVM.
CLÊRTON LEAL
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 =)
ARQUITETURA DE SOFTWARE
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
TESTES!!!!
ARQUITETURA DE SOFTWARE
“UM PADRÃO ARQUITETURAL É UMA SOLUÇÃO GERAL E REUSAVEL PARA UM PROBLEMA RECORRENTE EM DESENVOLVIMENTO DE SOFTWARE"
QUAIS OS PROBLEMAS RECORRENTES AO CONSTRUIR UM APP ANDROID?????
VAMOS ANALISAR A ESTRUTURA DE UMA ACTIVITY
Activity-> UI
-> Lógica de apresentação
-> Requisições de Rede
-> Regras de negócio
-> Outras bagunças incompreensíveis
Deus do código Macarrônico
Primeiro engenheiro Android
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
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
MORTE A
ACTIVITY GOD
TEMOS DE IMPLEMENTAR UMA ARQUITETURA PERSONALIZADA AO DESENVOLVER UMA APLICAÇÃO ANDROID
“UMA BOA ARQUITETURA ISOLA A VIEW DE TODO O RESTANTE DA APLICAÇÃO. ASSIM, PODEREMOS EXTRAI-LÁ SEMPRE QUE NECESSÁRIO.”
MVC MVP VIPER
CLEAN MVVM
MVP
MVP É UMA DERIVAÇÃO DO MVC, FOCADO O ISOLAMENTO DA VIEW
FOI CRIADO EM 1990 POR UMA EMPRESA CHAMADA TALIGENT, PARA SER USADO EM SUAS APLICAÇÕES EM C++
SIM, O MVP É UMA PADRÃO COM MAIS DE 25 ANOS DE IDADE!!!
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
+
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
MUITO CÓDIGO ADICIONAL PARA CRIAR OS PRESENTERS E INTERFACES DE COMUNICAÇÃO
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(); }
AS INTERFACES DE COMUNICAÇÃO DO MVP SÃO UM PROBLEMA. =/
MVVM
O MVVM FOI DESENVOLVIDO PELA MICROSOFT EM 2005.
COM O INTUITO DE FACILITAR A IMPLEMENTAÇÃO DE PROGRAMAÇÃO ORIENTADA A EVENTOS PARA UI
MVVM IMPLICA NO USO DE UMA API DE DATABINDING
DATABINDING MUDA COMPLETAMENTE O MODO DE DESENVOLVER APPS ANDROID
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
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 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;
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}"/>
VIEW View-Model MODEL
Android Java Puro
XML + Activity/Fragment
DataBinding
firstName firstName
lastName lastName
email email
RG RG
CPF CPF
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; } }
VAMOS VER UNS CÓDIGOS. =D
HTTPS://GITHUB.COM/CLERTONLEAL/ANDROID-ARCHITECTURE
CÓDIGO DE EXEMPLO
OBRIGADO‣ [email protected] ‣ @CLERTONLEAL