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
 

Último

ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx2m Assessoria
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx2m Assessoria
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx2m Assessoria
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsDanilo Pinotti
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx2m Assessoria
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploDanilo Pinotti
 

Último (6)

ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 

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