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

Preview:

Citation preview

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‣ CLERTONLEAL@GMAIL.COM ‣ @CLERTONLEAL