SlideShare uma empresa Scribd logo
SOLID no Android
Android Dev Conference 2016
Esses são os slides que apresentei no
Android Dev Conference 2016.
Acreditei que por não conter nenhum
“voice over” seria justo fazer pequenas
adaptações para melhor entendimento,
espero que seja útil para você!
Twitter: http://twitter.com/marcellogalhard
LinkedIn: https://www.linkedin.com/in/marcellogalhardo
Github: https://github.com/marcellogalhardo
E-mail: marcello.galhardo@gmail.com
Medium: https://medium.com/@marcellogalhardo
Contatos.
Marcello Galhardo
Desenvolvedor Android
Criado em 2000 por
Robert C. Martin; 5
princípios de
programação.
"Paciência você deve
ter meu jovem
Padawan."
"Quem planta
gambiarras, colhe
bugs."
http://martinfowler.com/bliki/DesignStaminaHypothesis.html
Trade Off Qualidade
Princípio da
Responsabilidade
Única
Single Responsibility Principle
"Uma classe deve ter
um, e somente um,
motivo para mudar."
Violação.
public class Produto {
private String descricao;
private int quantidade;
private long preco;
// ... getters/setters
}
public class Pedido {
private int numeroDoPedido;
private List<Produto> produtos = new ArrayList<>();
// ... getters/setters
}
public class PedidoRecyclerAdapter
extends RecyclerView.Adapter<PedidoRecyclerAdapter.ViewHolder> {
private List<Pedido> pedidos;
public OrderRecyclerAdapter(List<Pedido> pedidos) {
this.pedidos = pedidos;
}
@Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
View v = inflater.inflate(R.layout.item_pedidos, parent, false);
return new ViewHolder(v);
}
@Override public void onBindViewHolder(ViewHolder holder, int position) {
// TODO: Faz o vínculo entre o modelo e a view
}
@Override public int getItemCount() {
return pedidos.size();
}
// ... ViewHolder e métodos
}
@Override public void onBindViewHolder(ViewHolder holder, int position) {
Pedido pedido = items.get(position);
holder.numeroDoPedido.setText(pedido.getNumeroDoPedido().toString());
long total = 0;
for (Produto produto : pedido.getProdutos()) {
total += produto.getPreco();
}
NumberFormat formatter = NumberFormat.getCurrencyInstance(Locale.US);
String valorTotal = formatter.format(total);
holder.valorTotalDoPedido.setText(valorTotal);
holder.itemView.setTag(pedido);
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView numeroDoPedido;
public TextView valorTotalDoPedido;
// FindViews.
}
long total = 0;
for (Produto produto : pedido.getProdutos()) {
total += produto.getPreco();
}
NumberFormat formatter = NumberFormat.getCurrencyInstance(Locale.US);
String valorTotal = formatter.format(total);
holder.valorTotalDoPedido.setText(valorTotal);
Solução.
public class Pedido {
private int numeroDoPedido;
private List<Produto> produtos = new ArrayList<>();
// ... getters/setters
public long getValorTotalDoPedido() {
long total = 0;
for (Produto produto : pedido.getProdutos()) {
total += produto.getPreco();
}
return total;
}
public String getValorTotalDoPedidoFormatado() {
long total = getValorTotalDoPedido();
NumberFormat formatter = NumberFormat.getCurrencyInstance(Locale.US);
String valorTotal = formatter.format(total);
return valorTotal;
}
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Pedido pedido = items.get(position);
holder.numeroDoPedido.setText(pedido.getNumeroDoPedidoFormatado());
holder.valorTotalDoPedido.setText(pedido.getValorTotalDoPedidoFormato());
holder.itemView.setTag(pedido);
}
Rigidez.
Princípio do
Aberto e Fechado
Open/Closed Principle
"Você deve ser capaz de
estender um
comportamento de uma
classe, sem modificá-lo."
Violação.
public class Pedido {
private int numeroDoPedido;
private List<Produto> produtos = new ArrayList<>();
// ... getters/setters
public long getValorTotalDoPedido() {
long total = 0;
for (Produto produto : pedido.getProdutos()) {
total += produto.getPreco();
}
return total;
}
public String getValorTotalDoPedidoFormatado() {
long total = getValorTotalDoPedido();
NumberFormat formatter = NumberFormat.getCurrencyInstance(Locale.US);
String valorTotal = formatter.format(total);
return valorTotal;
}
}
private static final int SEM_DESCONTO = 0;
private static final int DESCONTO_10_POR_CENTO = 1;
private static final int DESCONTO_15_POR_CENTO = 2;
private int tipoDeDesconto;
public long getValorTotalDoPedido() {
long total = 0;
for (Produto produto : pedido.getProdutos()) {
total += produto.getPreco();
}
if (tipoDeDesconto == DESCONTO_10_POR_CENTO) {
long descontoDe10PorCento = total * 0.1;
total += descontoDe10PorCento;
} else if (tipoDeDesconto == DESCONTO_15_POR_CENTO ) {
long descontoDe15PorCento = total * 0.15;
total += descontoDe15PorCento;
}
return total;
}
public class Pedido {
private static final int SEM_DESCONTO = 0;
private static final int DESCONTO_10_POR_CENTO = 1;
private static final int DESCONTO_15_POR_CENTO = 2;
private int numeroDoPedido;
private List<Produto> produtos = new ArrayList<>();
private int tipoDeDesconto;
// ... getters/setters
public long getValorTotalDoPedido() {
long total = 0;
for (Produto produto : pedido.getProdutos()) {
total += produto.getPreco();
}
if (tipoDeDesconto == DESCONTO_10_POR_CENTO) {
long descontoDe10PorCento = total * 0.1;
total += descontoDe10PorCento;
} else if (tipoDeDesconto == DESCONTO_15_POR_CENTO ) {
long descontoDe15PorCento = total * 0.15;
total += descontoDe15PorCento;
}
return total;
}
public String getValorTotalDoPedidoFormatado() {
long total = getValorTotalDoPedido();
NumberFormat formatter = NumberFormat.getCurrencyInstance(Locale.US);
String valorTotal = formatter.format(total);
return valorTotal;
}
}
private static final int SEM_DESCONTO = 0;
private static final int DESCONTO_10_POR_CENTO = 1;
private static final int DESCONTO_15_POR_CENTO = 2;
private static final int DESCONTO_20_POR_CENTO = 3;
private static final int DESCONTO_25_POR_CENTO = 4;
private int tipoDeDesconto;
public long getValorTotalDoPedido() {
long total = 0;
for (Produto produto : pedido.getProdutos()) {
total += produto.getPreco();
}
if (tipoDeDesconto == DESCONTO_10_POR_CENTO) {
long descontoDe10PorCento = total * 0.1;
total += descontoDe10PorCento;
} else if (tipoDeDesconto == DESCONTO_15_POR_CENTO) {
long descontoDe15PorCento = total * 0.15;
total += descontoDe15PorCento;
} else if (tipoDeDesconto == DESCONTO_20_POR_CENTO) {
long descontoDe20PorCento = total * 0.20;
total += descontoDe20PorCento;
} else if (tipoDeDesconto == DESCONTO_25_POR_CENTO) {
long descontoDe25PorCento = total * 0.25;
total += descontoDe25PorCento;
}
return total;
}
Solução.
public interface Desconto {
long calculaDesconto(long valor);
}
public interface Desconto {
long calculaDesconto(long valor);
}
// Padrão de Projeto: Objeto Nulo.
public class SemDesconto implements Desconto {
public long calculaDesconto(long valor) {
return 0;
}
}
public class DescontoDe10PorCento implements Desconto {
public long calculaDesconto(long valor) {
return valor * 0.1;
}
}
public class DescontoDe15PorCento implements Desconto {
public long calculaDesconto(long valor) {
return valor * 0.15;
}
}
// Outros descontos.
Objeto Nulo
private Desconto desconto = new SemDesconto();
public long getValorTotalDoPedido() {
long total = 0;
for (Produto produto : pedido.getProdutos()) {
total += produto.getPreco();
}
// Não é necessário verificar se o desconto é null, pois
// sempre existirá um desconto vazio: SemDesconto.
desconto = desconto.calculaDesconto(total);
return total + desconto;
}
public class Pedido {
private int numeroDoPedido;
private List<Produto> produtos = new ArrayList<>();
private Desconto desconto = new SemDesconto();
// ... getters/setters
public long getValorTotalDoPedido() {
long total = 0;
for (Produto produto : pedido.getProdutos()) {
total += produto.getPreco();
}
desconto = desconto.calculaDesconto(total);
return total + desconto;
}
public String getValorTotalDoPedidoFormatado() {
long total = getValorTotalDoPedido();
NumberFormat formatter = NumberFormat.getCurrencyInstance(Locale.US);
String valorTotal = formatter.format(total);
return valorTotal;
}
}
Princípio da
Substituição de
Liskov
Liskov Substitution Principle
"Classes derivadas
devem ser
substituíveis por
suas classes base."
Violação.
// Violação do Princípio de Liskov.
public interface Carro {
public void partidaNoMotor();
}
public class Ferrari implements Carro {
@Override public double partidaNoMotor() {
// TODO: Lógica.
}
}
public class Tesla implements Carro {
@Override public void ligaCarro() {
// TODO: Lógica.
}
@Override public double partidaNoMotor() {
// TODO: Lógica.
}
}
// Iniciar Carro.
public void iniciarPartidaDeCarro(Carro carro) {
carro.partidaNoMotor();
}
// "Tentativa de correção" do princípio de Liskov.
public void iniciarPartidaDeCarro(Carro carro) {
if (carro instanceof Tesla) {
Tesla tesla = (Tesla) carro;
tesla.ligaCarro();
}
carro.partidaNoMotor();
}
Solução.
// Correção do Princípio de Liskov
public interface Carro {
public void partidaNoMotor();
}
public class Ferrari implements Carro {
@Override public double partidaNoMotor() {
// TODO: Implementação.
}
}
public class Tesla implements Carro {
// Implementação do ligaCarro();
@Override public double partidaNoMotor() {
if (!estaDescarregado) {
ligaCarro();
}
// TODO: Implementação.
}
}
// Iniciar Carro.
public void iniciarPartidaDeCarro(Carro carro) {
carro.partidaNoMotor();
}
Princípio da
Segregação de
Interface
Interface Segregation Principle
"Muitas interfaces
específicas são
melhores do que
uma interface
única."
Violação.
public interface OnClickListener {
void onClick(View v);
void onLongClick(View v);
void onTouch(View v, MotionEvent event);
}
// Violação do Princípio da Segregação de Interfaces
Button botao = (Button) findViewById(R.id.botao);
botao.setOnClickListener(new View.OnClickListener {
public void onClick(View v) {
// TODO: Faz algo bem legal...
}
public void onLongClick(View v) {
// Não precisamos disso.
}
public void onTouch(View v, MotionEvent event) {
// Disso também não.
}
});
Solução.
// Correção do Princípio da Segregação de Interfaces.
public interface OnClickListener {
void onClick(View v);
}
public interface OnLongClickListener {
void onLongClick(View v);
}
public interface OnTouchListener {
void onTouch(View v, MotionEvent event);
}
Princípio da
Inversão da
Dependência
Dependency Inversion Principle
"Dependa de uma
abstração e não de
uma
implementação."
Violação.
// Violação do Princípio da Inversão de Dependência.
class Presenter {
private final UsuarioRepositorio usuarioRepositorio
= new UsuarioRepositorio();
// TODO: Implementação diversas.
}
class UsuarioRepositorio {
public getUsuario() {
// TODO: Recupera o usuário conectado.
}
}
Solução.
// Correção do Princípio da Inversão de Dependência.
class Presenter {
private final UsuarioRepositorio usuarioRepositorio;
@Inject
public Presenter(UsuarioRepositorio usuarioRepositorio) {
this.usuarioRepositorio = usuarioRepositorio;
}
// TODO: Implementação diversas.
}
interface UsuarioRepositorio {
Usuario getUsuario();
}
class UsuarioManager implements UsuarioRepositorio {
@Override
public getUsuario() {
// TODO: Recupera o usuário conectado.
}
}
Android DevConference - SOLID no Android

Mais conteúdo relacionado

Semelhante a Android DevConference - SOLID no Android

Combatendo code smells em aplicações Java
Combatendo code smells em aplicações JavaCombatendo code smells em aplicações Java
Combatendo code smells em aplicações Java
Emmanuel Neri
 
TDD e Clean Code
TDD e Clean CodeTDD e Clean Code
TDD e Clean Code
Jorge Oleques
 
Lidando com Java obsoleto: do Struts 1.0 ao CDI - QConSP 2014
Lidando com Java obsoleto: do Struts 1.0 ao CDI - QConSP 2014Lidando com Java obsoleto: do Struts 1.0 ao CDI - QConSP 2014
Lidando com Java obsoleto: do Struts 1.0 ao CDI - QConSP 2014
David Robert Camargo de Campos
 
Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérg...
Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérg...Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérg...
Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérg...
Caelum
 
Vraptor
VraptorVraptor
Vraptor
clauvane1708
 
Flutter do zero a publicacao
Flutter do zero a publicacaoFlutter do zero a publicacao
Flutter do zero a publicacao
Cinthia Pineroli Galvão
 
Flutter do zero a publicacao
Flutter do zero a publicacaoFlutter do zero a publicacao
Flutter do zero a publicacao
Cinthia Pineroli Galvão
 
Use CDI em seus projetos Java !
Use CDI em seus projetos Java !Use CDI em seus projetos Java !
Use CDI em seus projetos Java !
Leonardo Brancalhão
 
Flutter do zero a publicacao
Flutter do zero a publicacaoFlutter do zero a publicacao
Flutter do zero a publicacao
Cinthia Pineroli Galvão
 
TDC2018SP | Trilha Mobile - Flutter: do zero a publicacao
TDC2018SP | Trilha Mobile - Flutter: do zero a publicacaoTDC2018SP | Trilha Mobile - Flutter: do zero a publicacao
TDC2018SP | Trilha Mobile - Flutter: do zero a publicacao
tdc-globalcode
 
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completaRefatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Eduardo Bregaida
 
[CLPE] Design patterns com c#
[CLPE] Design patterns com c#[CLPE] Design patterns com c#
[CLPE] Design patterns com c#
Felipe Pimentel
 
Programando Melhor - Flisol
Programando Melhor - FlisolProgramando Melhor - Flisol
Programando Melhor - Flisol
Leonn Leite
 
Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017
Luis Gustavo Almeida
 
Android na Prática
Android na PráticaAndroid na Prática
Android na Prática
Ramon Ribeiro Rabello
 
Refactoring - Design no Código
Refactoring - Design no CódigoRefactoring - Design no Código
Refactoring - Design no Código
Denis L Presciliano
 
Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014
Michael Castillo Granados
 
Introducao ao Spring Web MVC
Introducao ao Spring Web MVCIntroducao ao Spring Web MVC
Introducao ao Spring Web MVC
Eder Magalhães
 
Fazendo Injeção de dependência com Unity 1.2
Fazendo Injeção de dependência com Unity 1.2Fazendo Injeção de dependência com Unity 1.2
Fazendo Injeção de dependência com Unity 1.2
Giovanni Bassi
 
Conexao Java - Sua primeira app Android
Conexao Java - Sua primeira app AndroidConexao Java - Sua primeira app Android
Conexao Java - Sua primeira app Android
Suelen Carvalho
 

Semelhante a Android DevConference - SOLID no Android (20)

Combatendo code smells em aplicações Java
Combatendo code smells em aplicações JavaCombatendo code smells em aplicações Java
Combatendo code smells em aplicações Java
 
TDD e Clean Code
TDD e Clean CodeTDD e Clean Code
TDD e Clean Code
 
Lidando com Java obsoleto: do Struts 1.0 ao CDI - QConSP 2014
Lidando com Java obsoleto: do Struts 1.0 ao CDI - QConSP 2014Lidando com Java obsoleto: do Struts 1.0 ao CDI - QConSP 2014
Lidando com Java obsoleto: do Struts 1.0 ao CDI - QConSP 2014
 
Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérg...
Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérg...Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérg...
Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérg...
 
Vraptor
VraptorVraptor
Vraptor
 
Flutter do zero a publicacao
Flutter do zero a publicacaoFlutter do zero a publicacao
Flutter do zero a publicacao
 
Flutter do zero a publicacao
Flutter do zero a publicacaoFlutter do zero a publicacao
Flutter do zero a publicacao
 
Use CDI em seus projetos Java !
Use CDI em seus projetos Java !Use CDI em seus projetos Java !
Use CDI em seus projetos Java !
 
Flutter do zero a publicacao
Flutter do zero a publicacaoFlutter do zero a publicacao
Flutter do zero a publicacao
 
TDC2018SP | Trilha Mobile - Flutter: do zero a publicacao
TDC2018SP | Trilha Mobile - Flutter: do zero a publicacaoTDC2018SP | Trilha Mobile - Flutter: do zero a publicacao
TDC2018SP | Trilha Mobile - Flutter: do zero a publicacao
 
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completaRefatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
 
[CLPE] Design patterns com c#
[CLPE] Design patterns com c#[CLPE] Design patterns com c#
[CLPE] Design patterns com c#
 
Programando Melhor - Flisol
Programando Melhor - FlisolProgramando Melhor - Flisol
Programando Melhor - Flisol
 
Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017
 
Android na Prática
Android na PráticaAndroid na Prática
Android na Prática
 
Refactoring - Design no Código
Refactoring - Design no CódigoRefactoring - Design no Código
Refactoring - Design no Código
 
Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014
 
Introducao ao Spring Web MVC
Introducao ao Spring Web MVCIntroducao ao Spring Web MVC
Introducao ao Spring Web MVC
 
Fazendo Injeção de dependência com Unity 1.2
Fazendo Injeção de dependência com Unity 1.2Fazendo Injeção de dependência com Unity 1.2
Fazendo Injeção de dependência com Unity 1.2
 
Conexao Java - Sua primeira app Android
Conexao Java - Sua primeira app AndroidConexao Java - Sua primeira app Android
Conexao Java - Sua primeira app 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 Monteiro
iMasters
 
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
iMasters
 
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
iMasters
 
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çalves
iMasters
 
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 Martins
iMasters
 
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 Chahoud
iMasters
 
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
iMasters
 
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
iMasters
 
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
iMasters
 
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
iMasters
 
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
iMasters
 
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
iMasters
 
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
iMasters
 
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
iMasters
 
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 Karklis
iMasters
 
Monitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe RegalgoMonitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe Regalgo
iMasters
 

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

Manual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdfManual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdf
WELITONNOGUEIRA3
 
História da Rádio- 1936-1970 século XIX .2.pptx
História da Rádio- 1936-1970 século XIX   .2.pptxHistória da Rádio- 1936-1970 século XIX   .2.pptx
História da Rádio- 1936-1970 século XIX .2.pptx
TomasSousa7
 
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdfTOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
Momento da Informática
 
Certificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdfCertificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdf
joaovmp3
 
Logica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptxLogica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptx
Momento da Informática
 
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdfDESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
Momento da Informática
 

Último (6)

Manual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdfManual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdf
 
História da Rádio- 1936-1970 século XIX .2.pptx
História da Rádio- 1936-1970 século XIX   .2.pptxHistória da Rádio- 1936-1970 século XIX   .2.pptx
História da Rádio- 1936-1970 século XIX .2.pptx
 
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdfTOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
 
Certificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdfCertificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdf
 
Logica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptxLogica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptx
 
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdfDESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
 

Android DevConference - SOLID no Android

  • 1. SOLID no Android Android Dev Conference 2016
  • 2. Esses são os slides que apresentei no Android Dev Conference 2016. Acreditei que por não conter nenhum “voice over” seria justo fazer pequenas adaptações para melhor entendimento, espero que seja útil para você!
  • 3. Twitter: http://twitter.com/marcellogalhard LinkedIn: https://www.linkedin.com/in/marcellogalhardo Github: https://github.com/marcellogalhardo E-mail: marcello.galhardo@gmail.com Medium: https://medium.com/@marcellogalhardo Contatos.
  • 5.
  • 6.
  • 7. Criado em 2000 por Robert C. Martin; 5 princípios de programação.
  • 8. "Paciência você deve ter meu jovem Padawan."
  • 12. "Uma classe deve ter um, e somente um, motivo para mudar."
  • 14. public class Produto { private String descricao; private int quantidade; private long preco; // ... getters/setters } public class Pedido { private int numeroDoPedido; private List<Produto> produtos = new ArrayList<>(); // ... getters/setters }
  • 15. public class PedidoRecyclerAdapter extends RecyclerView.Adapter<PedidoRecyclerAdapter.ViewHolder> { private List<Pedido> pedidos; public OrderRecyclerAdapter(List<Pedido> pedidos) { this.pedidos = pedidos; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { LayoutInflater inflater = LayoutInflater.from(context); View v = inflater.inflate(R.layout.item_pedidos, parent, false); return new ViewHolder(v); } @Override public void onBindViewHolder(ViewHolder holder, int position) { // TODO: Faz o vínculo entre o modelo e a view } @Override public int getItemCount() { return pedidos.size(); } // ... ViewHolder e métodos }
  • 16. @Override public void onBindViewHolder(ViewHolder holder, int position) { Pedido pedido = items.get(position); holder.numeroDoPedido.setText(pedido.getNumeroDoPedido().toString()); long total = 0; for (Produto produto : pedido.getProdutos()) { total += produto.getPreco(); } NumberFormat formatter = NumberFormat.getCurrencyInstance(Locale.US); String valorTotal = formatter.format(total); holder.valorTotalDoPedido.setText(valorTotal); holder.itemView.setTag(pedido); } public static class ViewHolder extends RecyclerView.ViewHolder { public TextView numeroDoPedido; public TextView valorTotalDoPedido; // FindViews. }
  • 17. long total = 0; for (Produto produto : pedido.getProdutos()) { total += produto.getPreco(); } NumberFormat formatter = NumberFormat.getCurrencyInstance(Locale.US); String valorTotal = formatter.format(total); holder.valorTotalDoPedido.setText(valorTotal);
  • 19. public class Pedido { private int numeroDoPedido; private List<Produto> produtos = new ArrayList<>(); // ... getters/setters public long getValorTotalDoPedido() { long total = 0; for (Produto produto : pedido.getProdutos()) { total += produto.getPreco(); } return total; } public String getValorTotalDoPedidoFormatado() { long total = getValorTotalDoPedido(); NumberFormat formatter = NumberFormat.getCurrencyInstance(Locale.US); String valorTotal = formatter.format(total); return valorTotal; } }
  • 20. @Override public void onBindViewHolder(ViewHolder holder, int position) { Pedido pedido = items.get(position); holder.numeroDoPedido.setText(pedido.getNumeroDoPedidoFormatado()); holder.valorTotalDoPedido.setText(pedido.getValorTotalDoPedidoFormato()); holder.itemView.setTag(pedido); }
  • 22. Princípio do Aberto e Fechado Open/Closed Principle
  • 23. "Você deve ser capaz de estender um comportamento de uma classe, sem modificá-lo."
  • 25. public class Pedido { private int numeroDoPedido; private List<Produto> produtos = new ArrayList<>(); // ... getters/setters public long getValorTotalDoPedido() { long total = 0; for (Produto produto : pedido.getProdutos()) { total += produto.getPreco(); } return total; } public String getValorTotalDoPedidoFormatado() { long total = getValorTotalDoPedido(); NumberFormat formatter = NumberFormat.getCurrencyInstance(Locale.US); String valorTotal = formatter.format(total); return valorTotal; } }
  • 26. private static final int SEM_DESCONTO = 0; private static final int DESCONTO_10_POR_CENTO = 1; private static final int DESCONTO_15_POR_CENTO = 2; private int tipoDeDesconto; public long getValorTotalDoPedido() { long total = 0; for (Produto produto : pedido.getProdutos()) { total += produto.getPreco(); } if (tipoDeDesconto == DESCONTO_10_POR_CENTO) { long descontoDe10PorCento = total * 0.1; total += descontoDe10PorCento; } else if (tipoDeDesconto == DESCONTO_15_POR_CENTO ) { long descontoDe15PorCento = total * 0.15; total += descontoDe15PorCento; } return total; }
  • 27. public class Pedido { private static final int SEM_DESCONTO = 0; private static final int DESCONTO_10_POR_CENTO = 1; private static final int DESCONTO_15_POR_CENTO = 2; private int numeroDoPedido; private List<Produto> produtos = new ArrayList<>(); private int tipoDeDesconto; // ... getters/setters public long getValorTotalDoPedido() { long total = 0; for (Produto produto : pedido.getProdutos()) { total += produto.getPreco(); } if (tipoDeDesconto == DESCONTO_10_POR_CENTO) { long descontoDe10PorCento = total * 0.1; total += descontoDe10PorCento; } else if (tipoDeDesconto == DESCONTO_15_POR_CENTO ) { long descontoDe15PorCento = total * 0.15; total += descontoDe15PorCento; } return total; } public String getValorTotalDoPedidoFormatado() { long total = getValorTotalDoPedido(); NumberFormat formatter = NumberFormat.getCurrencyInstance(Locale.US); String valorTotal = formatter.format(total); return valorTotal; } }
  • 28. private static final int SEM_DESCONTO = 0; private static final int DESCONTO_10_POR_CENTO = 1; private static final int DESCONTO_15_POR_CENTO = 2; private static final int DESCONTO_20_POR_CENTO = 3; private static final int DESCONTO_25_POR_CENTO = 4; private int tipoDeDesconto; public long getValorTotalDoPedido() { long total = 0; for (Produto produto : pedido.getProdutos()) { total += produto.getPreco(); } if (tipoDeDesconto == DESCONTO_10_POR_CENTO) { long descontoDe10PorCento = total * 0.1; total += descontoDe10PorCento; } else if (tipoDeDesconto == DESCONTO_15_POR_CENTO) { long descontoDe15PorCento = total * 0.15; total += descontoDe15PorCento; } else if (tipoDeDesconto == DESCONTO_20_POR_CENTO) { long descontoDe20PorCento = total * 0.20; total += descontoDe20PorCento; } else if (tipoDeDesconto == DESCONTO_25_POR_CENTO) { long descontoDe25PorCento = total * 0.25; total += descontoDe25PorCento; } return total; }
  • 30. public interface Desconto { long calculaDesconto(long valor); }
  • 31. public interface Desconto { long calculaDesconto(long valor); } // Padrão de Projeto: Objeto Nulo. public class SemDesconto implements Desconto { public long calculaDesconto(long valor) { return 0; } } public class DescontoDe10PorCento implements Desconto { public long calculaDesconto(long valor) { return valor * 0.1; } } public class DescontoDe15PorCento implements Desconto { public long calculaDesconto(long valor) { return valor * 0.15; } } // Outros descontos.
  • 33. private Desconto desconto = new SemDesconto(); public long getValorTotalDoPedido() { long total = 0; for (Produto produto : pedido.getProdutos()) { total += produto.getPreco(); } // Não é necessário verificar se o desconto é null, pois // sempre existirá um desconto vazio: SemDesconto. desconto = desconto.calculaDesconto(total); return total + desconto; }
  • 34. public class Pedido { private int numeroDoPedido; private List<Produto> produtos = new ArrayList<>(); private Desconto desconto = new SemDesconto(); // ... getters/setters public long getValorTotalDoPedido() { long total = 0; for (Produto produto : pedido.getProdutos()) { total += produto.getPreco(); } desconto = desconto.calculaDesconto(total); return total + desconto; } public String getValorTotalDoPedidoFormatado() { long total = getValorTotalDoPedido(); NumberFormat formatter = NumberFormat.getCurrencyInstance(Locale.US); String valorTotal = formatter.format(total); return valorTotal; } }
  • 38. // Violação do Princípio de Liskov. public interface Carro { public void partidaNoMotor(); } public class Ferrari implements Carro { @Override public double partidaNoMotor() { // TODO: Lógica. } } public class Tesla implements Carro { @Override public void ligaCarro() { // TODO: Lógica. } @Override public double partidaNoMotor() { // TODO: Lógica. } } // Iniciar Carro. public void iniciarPartidaDeCarro(Carro carro) { carro.partidaNoMotor(); }
  • 39. // "Tentativa de correção" do princípio de Liskov. public void iniciarPartidaDeCarro(Carro carro) { if (carro instanceof Tesla) { Tesla tesla = (Tesla) carro; tesla.ligaCarro(); } carro.partidaNoMotor(); }
  • 41. // Correção do Princípio de Liskov public interface Carro { public void partidaNoMotor(); } public class Ferrari implements Carro { @Override public double partidaNoMotor() { // TODO: Implementação. } } public class Tesla implements Carro { // Implementação do ligaCarro(); @Override public double partidaNoMotor() { if (!estaDescarregado) { ligaCarro(); } // TODO: Implementação. } } // Iniciar Carro. public void iniciarPartidaDeCarro(Carro carro) { carro.partidaNoMotor(); }
  • 43. "Muitas interfaces específicas são melhores do que uma interface única."
  • 45. public interface OnClickListener { void onClick(View v); void onLongClick(View v); void onTouch(View v, MotionEvent event); }
  • 46. // Violação do Princípio da Segregação de Interfaces Button botao = (Button) findViewById(R.id.botao); botao.setOnClickListener(new View.OnClickListener { public void onClick(View v) { // TODO: Faz algo bem legal... } public void onLongClick(View v) { // Não precisamos disso. } public void onTouch(View v, MotionEvent event) { // Disso também não. } });
  • 48. // Correção do Princípio da Segregação de Interfaces. public interface OnClickListener { void onClick(View v); } public interface OnLongClickListener { void onLongClick(View v); } public interface OnTouchListener { void onTouch(View v, MotionEvent event); }
  • 50. "Dependa de uma abstração e não de uma implementação."
  • 52. // Violação do Princípio da Inversão de Dependência. class Presenter { private final UsuarioRepositorio usuarioRepositorio = new UsuarioRepositorio(); // TODO: Implementação diversas. } class UsuarioRepositorio { public getUsuario() { // TODO: Recupera o usuário conectado. } }
  • 54. // Correção do Princípio da Inversão de Dependência. class Presenter { private final UsuarioRepositorio usuarioRepositorio; @Inject public Presenter(UsuarioRepositorio usuarioRepositorio) { this.usuarioRepositorio = usuarioRepositorio; } // TODO: Implementação diversas. } interface UsuarioRepositorio { Usuario getUsuario(); } class UsuarioManager implements UsuarioRepositorio { @Override public getUsuario() { // TODO: Recupera o usuário conectado. } }