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

  • Published on
    20-Jan-2017

  • View
    92

  • Download
    1

Embed Size (px)

Transcript

  • CLRTON LEAL

  • QUEM SOU EU

    Clrton 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 padro para aplicaes Android (Ou a falta dela)

    Model-View-Presenter - MVP

    Model-View-ViewModel - MVVM

    DataBinding Library by Google

    Testabilidade

  • TESTES!!!!

  • ARQUITETURA DE SOFTWARE

  • UM PADRO ARQUITETURAL UMA SOLUO 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

    -> Lgica de apresentao

    -> Requisies de Rede

    -> Regras de negcio

    -> Outras bagunas incompreensveis

  • Deus do cdigo Macarrnico

    Primeiro engenheiro Android

  • PROBLEMAS EM APPS ANDROID

    Muito Difcil de testar

    Difcil de entender o cdigo gerado

    Dificuldade de manuteno

    Falta de confiabilidade de software

  • BENEFICIOS DE UMA ARQUITETURA FORTE

    Cdigo legvel e de fcil entendimento

    Fcil de escalar

    Fcil de testar

  • MORTE A

    ACTIVITY GOD

  • TEMOS DE IMPLEMENTAR UMA ARQUITETURA PERSONALIZADA AO DESENVOLVER UMA APLICAO ANDROID

  • UMA BOA ARQUITETURA ISOLA A VIEW DE TODO O RESTANTE DA APLICAO. ASSIM, PODEREMOS EXTRAI-L SEMPRE QUE NECESSRIO.

  • MVC MVP VIPER

    CLEAN MVVM

  • MVP

  • MVP UMA DERIVAO DO MVC, FOCADO O ISOLAMENTO DA VIEW

  • FOI CRIADO EM 1990 POR UMA EMPRESA CHAMADA TALIGENT, PARA SER USADO EM SUAS APLICAES EM C++

  • SIM, O MVP UMA PADRO 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 Apresentao Regras de negcio

    File System

    Banco de dados

    Sensores

    Dependncias Android injetadas

    Regras de negcios

    +

  • PONTOS POSITIVOS

    Camadas de Presenter e Model so testveis

    Muita lgica removida de dentro das Views

    Camadas bem definidas facilitam o intendimento do cdigo

    Entendimento muito simples de sua implementao

  • MUITO CDIGO ADICIONAL PARA CRIAR OS PRESENTERS E INTERFACES DE COMUNICAO

  • INTERFACES DE COMUNICAO

    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 COMUNICAO DO MVP SO UM PROBLEMA. =/

  • MVVM

  • O MVVM FOI DESENVOLVIDO PELA MICROSOFT EM 2005.

  • COM O INTUITO DE FACILITAR A IMPLEMENTAO DE PROGRAMAO 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

    Dependncias Android injetadas+

    File System

    Banco de dados

    Sensores

    Regras de negcios

  • 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

  • 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 firstNameError = new ObservableField(); public ObservableField lastNameError = new ObservableField(); public ObservableField rgError = new ObservableField(); public ObservableField cpfError = new ObservableField(); public ObservableField 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 CDIGOS. =D

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

    CDIGO DE EXEMPLO

    https://github.com/clertonleal/Android-Architecturehttps://github.com/clertonleal/Android-Architecture

  • OBRIGADO CLERTONLEAL@GMAIL.COM @CLERTONLEAL

    mailto:clertonleal@gmail.com