SlideShare uma empresa Scribd logo
1 de 55
Baixar para ler offline
Arquitetura para projetos
Android
Caique Oliveira
Graduado em Ciência da computação - UFS
Android developer - Stone
Apresentação
Agenda
- Introdução
- Problemas comuns no desenvolvimento
- Arquitetura Limpa(Clean Architecture)
- Dependências úteis
No começo do aprendizado
- Documentação oficial
- Stack Overflow
- Samples do google no github
No começo do aprendizado
- Tudo na activity ou fragment
- Pouca preocupação com organização
- View Einstein
- Não me chamo MainActivity atoa
No começo do aprendizado
- Pouca separação de responsabilidades
- Negócio misturado com framework
Por que isso acontece?
A preocupação é de passar conhecimento sobre determinado assunto
Quais as consequências ?
Código acoplado
Dificuldade em resolver um erro
z23678’z23678
Realmente o erro foi corrigido?
A correção não causa uma nova inconsistência?
Péssima testabilidade
- Ruim de escalar
- Parece um hackathon
Resumindo...
Como melhorar?
- Arquitetura de software
- Aquela disciplina chata da faculdade serve pra alguma coisa!
Arquitetura de software
Como eu posso criar um projeto de forma a não ser xingado por quem pegar
meu código?
Arquitetura de software
Definem estruturas de projeto visando uma boa qualidade de Software
Arquitetura de software
- Desacoplar o código
- Passar a usar o framework ao invés de depender dele
- Separar responsabilidades
- Testabilidade
- Manutenibilidade
- Escalabilidade
Desacoplando do framework
- A view deve apenas exibir informações
- Remover lógica da sua view
- Remover acesso a banco de dados
- Remover request
Einstein Activity
class EinsteinActivity: AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
showList()
}
fun showList() {
retrofit.enqueue(object : Callback<Contacts> {
override fun onResponse(call: Call<Contacts>, response: Response<Contacts>) {
// exibe lista
}
override fun onFailure(call: Call<Contacts>, t: Throwable) {
// exibe erro
}
})
}
}
Desacoplando do framework
interface Contract {
interface View {
fun showContacts(contacts: ArrayList<Contacts>)
fun showError(msg: String)
}
}
class MainActivity : AppCompatActivity(), Contract.View {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
override fun showContacts(contacts: ArrayList<Contacts>) {
//exibe lista
}
override fun showError(msg: String) {
//mostra erro
}
}
Desacoplando do framework
interface Contract {
interface View {
fun showContacts(contacts: ArrayList<Contacts>)
fun showError(msg: String)
}
interface Presenter {
fun loadContacts()
}
}
class Presenter : Contract.Presenter {
override fun loadContacts(){
// faz algo aqui
}
}
Mas qual conceito aplicado?
Modelos de arquitetura
- MVP
- MVVM
- Viper
- Clean Architecture
- Hexagonal
- ...
Clean Architecture
- Frameworks são detalhes(rest,banco,etc)
- Casos de Usos são essenciais
- Entidades são essenciais
Clean Architecture
- Depender o mínimo possível de framework
- Depender de comportamentos(interface)
- Núcleo Testável
Dependency rule
Ubiratan Soares
Q?
Vamos lá
- Camadas
- Presentation
- Domain
- Data
Cada camada pode ser um módulo no Android Studio
Domain
- Regras de negócio
- Entidades
- Sabe executar uma operação
- Dependência apenas da linguagem de programação usada
Domain
UseCasePayment.performPayment(...)
UseCaseProfile.updateProfile(...)
UseCaseProfile.uploadPhoto(...)
interface PhotoRepository {
fun photoUpload(string: String, callback: ResultCallback)
}
interface ResultCallback(){
fun success(result:String)
fun 4xx()
fun 5xx()
fun timeOut()
}
data class User(
val id: Int,
val name: String,
val email: String,
val phone: String,
val birthDate: Date,
val photoUrl: String)
Data
- Entrada e saída de dados
- Rest
- Banco de dados
- Cache
- Deve ser fácil de substituir
- Implementação dos contratos definidos pelo Domain(Repository)
class PhotoManager : PhotoRepository {
var photoService: PhotoService
override fun photoUpload(string: String, callbackResult :ResultCallback){
photoService.upload(string).enqueue(object : Callback<String>{
override fun onResponse(call: Call<String>, response:Response<String>) {
callbackResult.success(response.body())
}
override fun onFailure(call: Call<String>, t: Throwable) {
//trata erro e passa para callbackResult
}
})
}
}
interface PhotoRepository {
fun photoUpload(string: String,
callback: ResultCallback)
}
interface ResultCallback(){
fun success(result:String)
fun 4xx()
fun 5xx()
fun timeOut()
}
Presentation
Sabe como se comunicar com o domínio da aplicação
Fornece os dados para o framework
- Data formatada
- Entrega tudo mastigado para a view só exibir
class SearchPresenter() : SearchContract.Presenter {
var useCase = SearchUseCase()
var view: SearchContract.View
override fun search(name: String) {
useCase.execute(name,object : OnComplete {
override fun success(result: String) {
view.showSearch(result)
}
override fun error(t: Throwable) {
view.showError(“msg”)
}
})
}
}
interface OnComplete {
fun success(result: String)
fun error(t: Throwable)
}
Establishment{
id = 123
address{
address = "R. Visconde",
number = "414",
state = "Rio de Janeiro",
city = "Rio de Janeiro",
district = "Ipanema",
zip_code = "22410-002",
latitude = 22.9837684,
longitude = -43.2074878
}
name = "Estabelecimento do
bolinha"
status : enum = [open, close]
}
Data Domain Presentation
Establishment{
id = 123
address{
"address": "R. Visconde",
"number": "414",
"state": "Rio de Janeiro",
"city": "Rio de Janeiro",
"district": "Ipanema",
"zip_code": "22410-002"
}
name = "Estabelecimento
do bolinha"
distance = 1400
status= true
}
Establishment{
id = 123
address=”Rua visconde, 414, Rio
de janeiro - Rj”
name = "Estabelecimento do
bolinha"
distance = 1,4Km
status= “Aberto”
}
Organização de pacotes
Passo a passo
Passo a passo
Defina uma interface para
repository
Defina seus casos de uso e
suas entidades
interface ResultCallback{
fun success(profile:Profile)
fun 4xx()
fun 5xx()
fun error()
}
interface AuthenticationRepository{
fun login(credential: Credential, callback:ResultCallback)
}
class LoginUseCase(){
fun login(credentials: Credentials){
return authenticationRepository.login(credentials,callback)
}
}
data class Profile(var name: String, var age : Int)
data class Credential(var email: String, var password)
Passo a passo
Implemente seu repository
interface Service {
@Get(...)
fun signIn(@Body credential: Credential): Call<ProfileResponse>
}
class AuthenticatorManager(): AuthenticationRepository{
val service : Service
override fun login(credential,callback){
service.signIn(credential).enqueue(
success(profileResponse){
callback.success(Mapper.toProfile(responsse))
}
error(){
// controle o erro aqui
})
}
}
Passo a passo
Defina o contrato para
View e Presenter
interface Contract {
inteface View(){
fun showProfile(profile: ProfilePresentation)
}
interface Presenter {
fun attachView(view: View)
fun login(email: String, password: String)
}
}
Passo a passo
Implemente o presenter
inteface OnComplete{
fun onSuccess()
fun onError()
}
class Presenter(loginUseCase: LoginUseCase): Contract.Presenter{
val view : View?=null
override attachView(view : View){
this.view = view
}
override login(email: String, password : String){
loginUseCase.login(Credential(email,password),onComplete{
onSuccess(response){
view?.showProfile(Mapper.toProfilePresenter(response))
}
onError(throwable : Throwable){
//trata erro aqui
}
})
}
Passo a passo
Implemente o contrato
da View
class ProfileFragment : Fragment(), Contract.View{
val presenter : Contract.Presenter ?= null
override fun onViewCreated(....) {
super.onViewCreated(....)
presenter = Presenter(...)
presenter.attachView(this)
}
override showProfile(profile: ProfilePresentation){
nameTextView.text = profile.name
ageTextView.text = profile.age
}
override showErrorLogin(msg: String){
toast(msg)
}
@OnClick(R.id.loginButton)
fun onClick(){
presenter.login(emailEditText.text.toString, passwordEditText.text.toString())
}
}
Dependências úteis
Dagger 2
Rxjava 2
Dúvidas?
Exemplo clean
https://goo.gl/R2MzkK
Referências
Escaping from framework(Ubiratan soares)
https://speakerdeck.com/ubiratansoares/escaping-from-the-framework
The clean architecture(Uncle Bob):
https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html
Obrigado!
twitter: @_josecaique
email: jcaique.jc@gmail.com
slack android dev br: caique
github: jcaiqueoliveira
https://goo.gl/xjnnWs
Temos vagas!
enter.stone.com.br

Mais conteúdo relacionado

Semelhante a Android Dev Conference 2017 - Arquitetura para projetos Android

HTTP, JSON, REST e AJAX com AngularJS
HTTP, JSON, REST e AJAX com AngularJSHTTP, JSON, REST e AJAX com AngularJS
HTTP, JSON, REST e AJAX com AngularJSRodrigo Branas
 
Evolução e futuro do uso de paradigmas no JavaScript
Evolução e futuro do uso de paradigmas no JavaScriptEvolução e futuro do uso de paradigmas no JavaScript
Evolução e futuro do uso de paradigmas no JavaScriptJean Carlo Emer
 
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015  Porto Alegre - Interfaces ricas com Rails e React.JSTDC2015  Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JSRodrigo Urubatan
 
Repositório Social de Serviços Web
Repositório Social de Serviços WebRepositório Social de Serviços Web
Repositório Social de Serviços WebHenrique Dias
 
Tornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JSTornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JSMatheus Donizete
 
Backbone.js + Rails - Front-end e back-end conectados
Backbone.js + Rails - Front-end e back-end conectadosBackbone.js + Rails - Front-end e back-end conectados
Backbone.js + Rails - Front-end e back-end conectadosHenrique Gogó
 
JQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBJQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBLuciano Borges
 
Automação de Testes com AngularJS
Automação de Testes com AngularJSAutomação de Testes com AngularJS
Automação de Testes com AngularJSRodrigo Branas
 
Intervalo Técnico - QG Mobile
Intervalo Técnico - QG MobileIntervalo Técnico - QG Mobile
Intervalo Técnico - QG MobileVitor Albuquerque
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkPablo Dall'Oglio
 
TDC São Paulo 2015 - Interfaces Ricas com Rails e React.JS
TDC São Paulo 2015  - Interfaces Ricas com Rails e React.JSTDC São Paulo 2015  - Interfaces Ricas com Rails e React.JS
TDC São Paulo 2015 - Interfaces Ricas com Rails e React.JSRodrigo Urubatan
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Androidtdc-globalcode
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Androidtdc-globalcode
 
Android chat app com Node.js
Android chat app com Node.jsAndroid chat app com Node.js
Android chat app com Node.jsLuiz Duarte
 
Workshop Node.js + MongoDB + Mongoose
Workshop Node.js + MongoDB + MongooseWorkshop Node.js + MongoDB + Mongoose
Workshop Node.js + MongoDB + MongooseLuiz Duarte
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o JavascriptMichel Ribeiro
 
Aula 12 funcoes - Programação 1
Aula 12 funcoes - Programação 1Aula 12 funcoes - Programação 1
Aula 12 funcoes - Programação 1Isaac Barros
 
Desvendando as ferramentas e serviços para o desenvolvedor Android
Desvendando as ferramentas e serviços para o desenvolvedor AndroidDesvendando as ferramentas e serviços para o desenvolvedor Android
Desvendando as ferramentas e serviços para o desenvolvedor Androidjoaobmonteiro
 

Semelhante a Android Dev Conference 2017 - Arquitetura para projetos Android (20)

DDD > Experiências
DDD > ExperiênciasDDD > Experiências
DDD > Experiências
 
HTTP, JSON, REST e AJAX com AngularJS
HTTP, JSON, REST e AJAX com AngularJSHTTP, JSON, REST e AJAX com AngularJS
HTTP, JSON, REST e AJAX com AngularJS
 
Evolução e futuro do uso de paradigmas no JavaScript
Evolução e futuro do uso de paradigmas no JavaScriptEvolução e futuro do uso de paradigmas no JavaScript
Evolução e futuro do uso de paradigmas no JavaScript
 
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015  Porto Alegre - Interfaces ricas com Rails e React.JSTDC2015  Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
 
Repositório Social de Serviços Web
Repositório Social de Serviços WebRepositório Social de Serviços Web
Repositório Social de Serviços Web
 
Tornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JSTornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JS
 
Backbone.js + Rails - Front-end e back-end conectados
Backbone.js + Rails - Front-end e back-end conectadosBackbone.js + Rails - Front-end e back-end conectados
Backbone.js + Rails - Front-end e back-end conectados
 
JQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBJQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEB
 
Automação de Testes com AngularJS
Automação de Testes com AngularJSAutomação de Testes com AngularJS
Automação de Testes com AngularJS
 
Intervalo Técnico - QG Mobile
Intervalo Técnico - QG MobileIntervalo Técnico - QG Mobile
Intervalo Técnico - QG Mobile
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um Framework
 
TDC São Paulo 2015 - Interfaces Ricas com Rails e React.JS
TDC São Paulo 2015  - Interfaces Ricas com Rails e React.JSTDC São Paulo 2015  - Interfaces Ricas com Rails e React.JS
TDC São Paulo 2015 - Interfaces Ricas com Rails e React.JS
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
 
Android chat app com Node.js
Android chat app com Node.jsAndroid chat app com Node.js
Android chat app com Node.js
 
Workshop Node.js + MongoDB + Mongoose
Workshop Node.js + MongoDB + MongooseWorkshop Node.js + MongoDB + Mongoose
Workshop Node.js + MongoDB + Mongoose
 
Node.js: serious business
Node.js: serious businessNode.js: serious business
Node.js: serious business
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o Javascript
 
Aula 12 funcoes - Programação 1
Aula 12 funcoes - Programação 1Aula 12 funcoes - Programação 1
Aula 12 funcoes - Programação 1
 
Desvendando as ferramentas e serviços para o desenvolvedor Android
Desvendando as ferramentas e serviços para o desenvolvedor AndroidDesvendando as ferramentas e serviços para o desenvolvedor Android
Desvendando as ferramentas e serviços para o desenvolvedor Android
 

Mais de iMasters

O que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
O que você precisa saber para modelar bancos de dados NoSQL - Dani MonteiroO que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
O que você precisa saber para modelar bancos de dados NoSQL - Dani MonteiroiMasters
 
Postgres: wanted, beloved or dreaded? - Fabio Telles
Postgres: wanted, beloved or dreaded? - Fabio TellesPostgres: wanted, beloved or dreaded? - Fabio Telles
Postgres: wanted, beloved or dreaded? - Fabio TellesiMasters
 
Por que minha query esta lenta? - Suellen Moraes
Por que minha query esta lenta? - Suellen MoraesPor que minha query esta lenta? - Suellen Moraes
Por que minha query esta lenta? - Suellen MoraesiMasters
 
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...iMasters
 
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalvesORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalvesiMasters
 
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...iMasters
 
Arquitetando seus dados na prática para a LGPD - Alessandra Martins
Arquitetando seus dados na prática para a LGPD - Alessandra MartinsArquitetando seus dados na prática para a LGPD - Alessandra Martins
Arquitetando seus dados na prática para a LGPD - Alessandra MartinsiMasters
 
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...iMasters
 
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana ChahoudDesenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana ChahoudiMasters
 
Use MDD e faça as máquinas trabalharem para você - Andreza Leite
 Use MDD e faça as máquinas trabalharem para você - Andreza Leite Use MDD e faça as máquinas trabalharem para você - Andreza Leite
Use MDD e faça as máquinas trabalharem para você - Andreza LeiteiMasters
 
Entendendo os porquês do seu servidor - Talita Bernardes
Entendendo os porquês do seu servidor - Talita BernardesEntendendo os porquês do seu servidor - Talita Bernardes
Entendendo os porquês do seu servidor - Talita BernardesiMasters
 
Backend performático além do "coloca mais máquina lá" - Diana Arnos
Backend performático além do "coloca mais máquina lá" - Diana ArnosBackend performático além do "coloca mais máquina lá" - Diana Arnos
Backend performático além do "coloca mais máquina lá" - Diana ArnosiMasters
 
Dicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato GroffeDicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato GroffeiMasters
 
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
7 dicas de desempenho que equivalem por 21 - Danielle MonteiroiMasters
 
Quem se importa com acessibilidade Web? - Mauricio Maujor
Quem se importa com acessibilidade Web? - Mauricio MaujorQuem se importa com acessibilidade Web? - Mauricio Maujor
Quem se importa com acessibilidade Web? - Mauricio MaujoriMasters
 
Service Mesh com Istio e Kubernetes - Wellington Figueira da Silva
Service Mesh com Istio e Kubernetes - Wellington Figueira da SilvaService Mesh com Istio e Kubernetes - Wellington Figueira da Silva
Service Mesh com Istio e Kubernetes - Wellington Figueira da SilvaiMasters
 
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto PascuttiErros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto PascuttiiMasters
 
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...
Elasticidade e engenharia de banco de dados para alta performance  - Rubens G...Elasticidade e engenharia de banco de dados para alta performance  - Rubens G...
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...iMasters
 
Construindo aplicações mais confiantes - Carolina Karklis
Construindo aplicações mais confiantes - Carolina KarklisConstruindo aplicações mais confiantes - Carolina Karklis
Construindo aplicações mais confiantes - Carolina KarklisiMasters
 
Monitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe RegalgoMonitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe RegalgoiMasters
 

Mais de iMasters (20)

O que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
O que você precisa saber para modelar bancos de dados NoSQL - Dani MonteiroO que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
O que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
 
Postgres: wanted, beloved or dreaded? - Fabio Telles
Postgres: wanted, beloved or dreaded? - Fabio TellesPostgres: wanted, beloved or dreaded? - Fabio Telles
Postgres: wanted, beloved or dreaded? - Fabio Telles
 
Por que minha query esta lenta? - Suellen Moraes
Por que minha query esta lenta? - Suellen MoraesPor que minha query esta lenta? - Suellen Moraes
Por que minha query esta lenta? - Suellen Moraes
 
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
 
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalvesORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
 
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
 
Arquitetando seus dados na prática para a LGPD - Alessandra Martins
Arquitetando seus dados na prática para a LGPD - Alessandra MartinsArquitetando seus dados na prática para a LGPD - Alessandra Martins
Arquitetando seus dados na prática para a LGPD - Alessandra Martins
 
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
 
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana ChahoudDesenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
 
Use MDD e faça as máquinas trabalharem para você - Andreza Leite
 Use MDD e faça as máquinas trabalharem para você - Andreza Leite Use MDD e faça as máquinas trabalharem para você - Andreza Leite
Use MDD e faça as máquinas trabalharem para você - Andreza Leite
 
Entendendo os porquês do seu servidor - Talita Bernardes
Entendendo os porquês do seu servidor - Talita BernardesEntendendo os porquês do seu servidor - Talita Bernardes
Entendendo os porquês do seu servidor - Talita Bernardes
 
Backend performático além do "coloca mais máquina lá" - Diana Arnos
Backend performático além do "coloca mais máquina lá" - Diana ArnosBackend performático além do "coloca mais máquina lá" - Diana Arnos
Backend performático além do "coloca mais máquina lá" - Diana Arnos
 
Dicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato GroffeDicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato Groffe
 
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
 
Quem se importa com acessibilidade Web? - Mauricio Maujor
Quem se importa com acessibilidade Web? - Mauricio MaujorQuem se importa com acessibilidade Web? - Mauricio Maujor
Quem se importa com acessibilidade Web? - Mauricio Maujor
 
Service Mesh com Istio e Kubernetes - Wellington Figueira da Silva
Service Mesh com Istio e Kubernetes - Wellington Figueira da SilvaService Mesh com Istio e Kubernetes - Wellington Figueira da Silva
Service Mesh com Istio e Kubernetes - Wellington Figueira da Silva
 
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto PascuttiErros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
 
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...
Elasticidade e engenharia de banco de dados para alta performance  - Rubens G...Elasticidade e engenharia de banco de dados para alta performance  - Rubens G...
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...
 
Construindo aplicações mais confiantes - Carolina Karklis
Construindo aplicações mais confiantes - Carolina KarklisConstruindo aplicações mais confiantes - Carolina Karklis
Construindo aplicações mais confiantes - Carolina Karklis
 
Monitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe RegalgoMonitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe Regalgo
 

Android Dev Conference 2017 - Arquitetura para projetos Android

  • 2. Caique Oliveira Graduado em Ciência da computação - UFS Android developer - Stone Apresentação
  • 3. Agenda - Introdução - Problemas comuns no desenvolvimento - Arquitetura Limpa(Clean Architecture) - Dependências úteis
  • 4. No começo do aprendizado - Documentação oficial - Stack Overflow - Samples do google no github
  • 5. No começo do aprendizado - Tudo na activity ou fragment - Pouca preocupação com organização - View Einstein - Não me chamo MainActivity atoa
  • 6. No começo do aprendizado - Pouca separação de responsabilidades - Negócio misturado com framework
  • 7. Por que isso acontece? A preocupação é de passar conhecimento sobre determinado assunto
  • 12. Realmente o erro foi corrigido? A correção não causa uma nova inconsistência?
  • 14. - Ruim de escalar - Parece um hackathon
  • 16. Como melhorar? - Arquitetura de software - Aquela disciplina chata da faculdade serve pra alguma coisa!
  • 17. Arquitetura de software Como eu posso criar um projeto de forma a não ser xingado por quem pegar meu código?
  • 18. Arquitetura de software Definem estruturas de projeto visando uma boa qualidade de Software
  • 19. Arquitetura de software - Desacoplar o código - Passar a usar o framework ao invés de depender dele - Separar responsabilidades - Testabilidade - Manutenibilidade - Escalabilidade
  • 20. Desacoplando do framework - A view deve apenas exibir informações - Remover lógica da sua view - Remover acesso a banco de dados - Remover request
  • 21. Einstein Activity class EinsteinActivity: AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { showList() } fun showList() { retrofit.enqueue(object : Callback<Contacts> { override fun onResponse(call: Call<Contacts>, response: Response<Contacts>) { // exibe lista } override fun onFailure(call: Call<Contacts>, t: Throwable) { // exibe erro } }) } }
  • 22. Desacoplando do framework interface Contract { interface View { fun showContacts(contacts: ArrayList<Contacts>) fun showError(msg: String) } } class MainActivity : AppCompatActivity(), Contract.View { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } override fun showContacts(contacts: ArrayList<Contacts>) { //exibe lista } override fun showError(msg: String) { //mostra erro } }
  • 23. Desacoplando do framework interface Contract { interface View { fun showContacts(contacts: ArrayList<Contacts>) fun showError(msg: String) } interface Presenter { fun loadContacts() } } class Presenter : Contract.Presenter { override fun loadContacts(){ // faz algo aqui } }
  • 24. Mas qual conceito aplicado?
  • 25.
  • 26. Modelos de arquitetura - MVP - MVVM - Viper - Clean Architecture - Hexagonal - ...
  • 27. Clean Architecture - Frameworks são detalhes(rest,banco,etc) - Casos de Usos são essenciais - Entidades são essenciais
  • 28. Clean Architecture - Depender o mínimo possível de framework - Depender de comportamentos(interface) - Núcleo Testável
  • 31. Q?
  • 32. Vamos lá - Camadas - Presentation - Domain - Data
  • 33. Cada camada pode ser um módulo no Android Studio
  • 34. Domain - Regras de negócio - Entidades - Sabe executar uma operação - Dependência apenas da linguagem de programação usada
  • 36. interface PhotoRepository { fun photoUpload(string: String, callback: ResultCallback) } interface ResultCallback(){ fun success(result:String) fun 4xx() fun 5xx() fun timeOut() } data class User( val id: Int, val name: String, val email: String, val phone: String, val birthDate: Date, val photoUrl: String)
  • 37. Data - Entrada e saída de dados - Rest - Banco de dados - Cache - Deve ser fácil de substituir - Implementação dos contratos definidos pelo Domain(Repository)
  • 38. class PhotoManager : PhotoRepository { var photoService: PhotoService override fun photoUpload(string: String, callbackResult :ResultCallback){ photoService.upload(string).enqueue(object : Callback<String>{ override fun onResponse(call: Call<String>, response:Response<String>) { callbackResult.success(response.body()) } override fun onFailure(call: Call<String>, t: Throwable) { //trata erro e passa para callbackResult } }) } } interface PhotoRepository { fun photoUpload(string: String, callback: ResultCallback) } interface ResultCallback(){ fun success(result:String) fun 4xx() fun 5xx() fun timeOut() }
  • 39. Presentation Sabe como se comunicar com o domínio da aplicação Fornece os dados para o framework - Data formatada - Entrega tudo mastigado para a view só exibir
  • 40. class SearchPresenter() : SearchContract.Presenter { var useCase = SearchUseCase() var view: SearchContract.View override fun search(name: String) { useCase.execute(name,object : OnComplete { override fun success(result: String) { view.showSearch(result) } override fun error(t: Throwable) { view.showError(“msg”) } }) } } interface OnComplete { fun success(result: String) fun error(t: Throwable) }
  • 41. Establishment{ id = 123 address{ address = "R. Visconde", number = "414", state = "Rio de Janeiro", city = "Rio de Janeiro", district = "Ipanema", zip_code = "22410-002", latitude = 22.9837684, longitude = -43.2074878 } name = "Estabelecimento do bolinha" status : enum = [open, close] } Data Domain Presentation Establishment{ id = 123 address{ "address": "R. Visconde", "number": "414", "state": "Rio de Janeiro", "city": "Rio de Janeiro", "district": "Ipanema", "zip_code": "22410-002" } name = "Estabelecimento do bolinha" distance = 1400 status= true } Establishment{ id = 123 address=”Rua visconde, 414, Rio de janeiro - Rj” name = "Estabelecimento do bolinha" distance = 1,4Km status= “Aberto” }
  • 42.
  • 45. Passo a passo Defina uma interface para repository Defina seus casos de uso e suas entidades interface ResultCallback{ fun success(profile:Profile) fun 4xx() fun 5xx() fun error() } interface AuthenticationRepository{ fun login(credential: Credential, callback:ResultCallback) } class LoginUseCase(){ fun login(credentials: Credentials){ return authenticationRepository.login(credentials,callback) } } data class Profile(var name: String, var age : Int) data class Credential(var email: String, var password)
  • 46. Passo a passo Implemente seu repository interface Service { @Get(...) fun signIn(@Body credential: Credential): Call<ProfileResponse> } class AuthenticatorManager(): AuthenticationRepository{ val service : Service override fun login(credential,callback){ service.signIn(credential).enqueue( success(profileResponse){ callback.success(Mapper.toProfile(responsse)) } error(){ // controle o erro aqui }) } }
  • 47. Passo a passo Defina o contrato para View e Presenter interface Contract { inteface View(){ fun showProfile(profile: ProfilePresentation) } interface Presenter { fun attachView(view: View) fun login(email: String, password: String) } }
  • 48. Passo a passo Implemente o presenter inteface OnComplete{ fun onSuccess() fun onError() } class Presenter(loginUseCase: LoginUseCase): Contract.Presenter{ val view : View?=null override attachView(view : View){ this.view = view } override login(email: String, password : String){ loginUseCase.login(Credential(email,password),onComplete{ onSuccess(response){ view?.showProfile(Mapper.toProfilePresenter(response)) } onError(throwable : Throwable){ //trata erro aqui } }) }
  • 49. Passo a passo Implemente o contrato da View class ProfileFragment : Fragment(), Contract.View{ val presenter : Contract.Presenter ?= null override fun onViewCreated(....) { super.onViewCreated(....) presenter = Presenter(...) presenter.attachView(this) } override showProfile(profile: ProfilePresentation){ nameTextView.text = profile.name ageTextView.text = profile.age } override showErrorLogin(msg: String){ toast(msg) } @OnClick(R.id.loginButton) fun onClick(){ presenter.login(emailEditText.text.toString, passwordEditText.text.toString()) } }
  • 53. Referências Escaping from framework(Ubiratan soares) https://speakerdeck.com/ubiratansoares/escaping-from-the-framework The clean architecture(Uncle Bob): https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html
  • 54. Obrigado! twitter: @_josecaique email: jcaique.jc@gmail.com slack android dev br: caique github: jcaiqueoliveira https://goo.gl/xjnnWs