SlideShare uma empresa Scribd logo
1 de 22
Baixar para ler offline
Boas Práticas no
Desenvolvimento de
Software
60 - 90 minutos
Atualizado: Julho 2015 falmeida1988@gmail.com
Com foco especial em aplicativos Web, tipagem fraca,
sistemas de informação. (Exemplos em PHP)
Princípios gerais
● Consistência
○ Senão fica muito trabalhoso entender o sistema
● Cérebro humano é limitado
○ 7 ± 2 coisas ao mesmo tempo é o limite
■ métodos em uma classe, classes em um módulo, etc
● Comentários
○ São para dizer o porquê e não o como. O como é o próprio código
que diz (se for bem-feito, com componentes auto-explicativos)
● Legibilidade
○ O código é, em geral, lido mais frequentemente do que escrito
Princípios gerais
● Testes
○ Sem testes você não tem como saber se alguma parte da sua
aplicação deixou de funcionar depois de uma modificação
● Objetivos eternos:
○ Baixo acoplamento
○ Reduzir complexidade
■ Usando abstrações (exemplo?)
● A característica mais importante do código é “quão fácil é modificá-lo?”
Princípios gerais
● Se você não tomar medidas para manter a estrutura do seu projeto, ele irá
acabar uma massa amorfa impossível de entender ou de mudar
● “Privado até prova em contrário” (por que?)
● Vai haver casos em que você vai precisar quebrar um desses princípios
para resolver algum problema urgente, mas saiba que isso tem um custo,
que vai aumentando com o tempo. Isso é uma dívida técnica (technical
debt) que você vai ter que pagar mais cedo ou mais tarde.
Nomes auto-explicativos
Razão
● Dá pra entender o que está sendo feito só de se ver o nome das coisas
● Não precisa tanto de comentários
Anti-exemplo
// fazendo a média de todas as idades recebidas
$a = func2($b);
Exemplo
$mediaIdades = calculaMedia($idades);
Coisas explícitas em vez de implícitas
Razão
● Mais fácil de entender o código depois
○ Mesmo por você
● Mais fácil de reusar e refatorar (por que?)
● Mesmo em um método de instância (em um objeto), às vezes é melhor
passar os parâmetros explicitamente (como argumentos) em vez de pegar
tudo do $this ou de alguma coisa implícita (como variáveis globais).
Coisas explícitas em vez de implícitas
Anti-exemplo
class User{
//não tem como saber (de fora) o que esta função usa sem olhar seu código
public function calculaPontos() {
$data = $this->foo-> getData();
//linhas de código
$empresa = $this-> getEmpresa();
// mais linhas de código
$historicoDeCompras = Helper::getHistoricoDeCompras ($usuario,$data);
// mais linhas de código
return $resultado;
Coisas explícitas em vez de implícitas
Exemplo
// está óbvio que este método calcula pontos para um usuário levando em
// consideração a data, sua empresa e seu histórico de compras
class User{
public function calculaPontos($data,$empresa,$historicoDeCompras){
// corpo do método
}
Note que, no anti-exemplo, um potencial usuário precisa saber, de antemão,
que um User precisa ter uma Empresa definida pois caso contrário o método
getEmpresa() pode gerar um erro. Isto é mais uma coisa implícita que, no
exemplo dado, torna-se explícita, impedindo possíveis erros.
Lei de Demeter
“Não fale com o vizinho do seu vizinho”
Razão
● Aumenta complexidade
● Aumenta acoplamento
Anti-exemplo
// uma mudança em qualquer dos componentes da cadeia vai quebrar esse código
$anoDeFundacao = $user
->getEmpresa()
->getMatriz()
->getDataDeFundacao()
->getAno();
Lei de Demeter
Exemplo
// comportamento delegado para a classe User
// o código atual não é afetado por mudanças na obtenção do ano de
fundação
$anoDeFundacao = $user-> getAnoDeFundacao() ;
Asserts nos lugares certos
Razão
● Garantir que, de um ponto em diante, uma certa condição é verdadeira
○ Só para coisas que nunca devem ser false
● Dar “pistas”, para quem está lendo, do que você está fazendo
Exemplo
$pessoas = Pessoa::getAll(); //do banco de dados
$pontuacoes = funcaoComplicadaQueCalculaPontosParaPessoas ($pessoas);
$cores = funcaoComplicadaQuePegaACorPreferidaDeCadaPessoa ($pessoa);
assert( count($pontuacoes) === count($cores) );
//se esse assert falhar, há algo errado
//melhor descobrir agora do que mais à frente
Edge cases (casos-limite)
Razão
● Nós só costumamos pensar nos casos comuns que uma função deve
atender
Anti-exemplo
function avg(array $arr){
$sum = 0;
$size = count($arr);
foreach($arr as $num){
$sum += $num;
}
return $sum/$size; //quando isso pode dar errado?
}
Escolheu um jeito, fique com ele
Razão
● Pessoas não conseguem criar um modelo mental do seu projeto se ele
não for consistente
Exemplos
● Nomenclatura de variáveis
● Estrutura de classes, arquivos
Passar operações para fora dos loops sempre que
possível
Razão
● Às vezes a gente pode criar um problema sem perceber
● Muitas vezes uma informação é constante para todas as execuções de um
loop
Exemplos
● Operações no banco de dados
● Outros tipos de operações pesadas
Value Objects
Quando você tem muitos pequenos dados que precisam ser manipulados
juntos
Razão
● Evitar ter que definir uma função que recebe 15 parâmetros
● Podemos capturar erros mais cedo (vai dar erro se o VO passado não for
do tipo correto)
Anti-exemplo
$relatorio = geraRelatorio($itens,$dataInicio,$dataFim,
$secoes,$incluirGraficos,$incluirInformacoesGerais,$estilo,$nome);
Value Objects
Exemplo
$opcoesVO = new OpcoesDoRelatorioVO($itens,$dataInicio,
$dataFim,$incluirGraficos,$incluirInformacoesGerais,$estilo,$nome);
// código mais simples, mais fácil entender e mais fácil de mudar
$relatorio = geraRelatorio($opcoesVO);
Métodos e classes devem devem
fazer poucas coisas
Razão
● 7 ± 2
● Facilidade de reuso, manutenção
Anti-Exemplo
// um nome vago assim já é um sintoma sério
public function getResultadoCorreto ($params){
// 600 linhas de código
}
Métodos e classes devem devem
fazer poucas coisas
Extra
● Classes que representam entidades e tabelas do Banco (modelos) vs o
resto
● Não helperizar seus modelos nem controllers
Programação Top down
“Pensar no todo antes de criar as partes”
Razão
● Se você cria as partes (funções e classes individuais) que você acha que
serão necessárias antes de pensar a estrutura do projeto, você pode
acabar tendo que “entortar” a estrutura para que consiga usar as partes
que você já criou.
Programação Top down
Anti-Exemplo
● Preciso criar um sistema para gerar relatórios.
● “Vou criar logo a parte das consultas de banco de dados pois já sei
que serão necessárias.”
● Com essas partes prontas, vou começar a fazer o loop principal do
sistema (exemplo?)
○ Agora vi que vou precisar consultar um CSV também. Vou
adicionar um parâmetro às funções do banco para resolver isso.
○ Agora vi que vou precisar gerar resultados em PDF também
então vou adicionar um parâmetro a todas as funções de
consulta a dados que foram feitas para que modifiquem o output.
● 9 meses depois o sistema está desorganizado e sem estrutura
Programação Top down
Exemplo
● Preciso criar um sistema para gerar relatórios.
● Vou criar a estrutura principal “fingindo” que as partes já foram criadas
(exemplo?)
DRY
Don’t repeat yourself
Razão
● Evitar retrabalho
● Evitar erros (corrigiu uma vez, todos os clientes estão OK)

Mais conteúdo relacionado

Mais procurados

Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScriptBruno Catão
 
Banco de Dados I - Aula 10 - Banco de Dados Relacional (Modelo Físico)
Banco de Dados I - Aula 10 - Banco de Dados Relacional (Modelo Físico)Banco de Dados I - Aula 10 - Banco de Dados Relacional (Modelo Físico)
Banco de Dados I - Aula 10 - Banco de Dados Relacional (Modelo Físico)Leinylson Fontinele
 
Conceitos de Banco de dados e SGBD
Conceitos de Banco de dados e SGBDConceitos de Banco de dados e SGBD
Conceitos de Banco de dados e SGBDVinicius Buffolo
 
Apostila Modelo ER (Entidade Relacionamento)
Apostila Modelo ER (Entidade Relacionamento)Apostila Modelo ER (Entidade Relacionamento)
Apostila Modelo ER (Entidade Relacionamento)Ricardo Terra
 
Modelo Relacional, Rede e Hierárquico
Modelo Relacional, Rede e HierárquicoModelo Relacional, Rede e Hierárquico
Modelo Relacional, Rede e Hierárquicorosimaracorsino
 
Conceitos e arquitetura do sistema de banco de dados
Conceitos e arquitetura do sistema de banco de dadosConceitos e arquitetura do sistema de banco de dados
Conceitos e arquitetura do sistema de banco de dadosElaine Cecília Gatto
 
1.Introdução Banco de Dados
1.Introdução Banco de Dados1.Introdução Banco de Dados
1.Introdução Banco de Dadosvini_campos
 
Modelo Conceitual MER
Modelo Conceitual MERModelo Conceitual MER
Modelo Conceitual MERJoel Santos
 
Adoção da TI Verde na Administração das Redes de Computadores - Projeto de Pe...
Adoção da TI Verde na Administração das Redes de Computadores - Projeto de Pe...Adoção da TI Verde na Administração das Redes de Computadores - Projeto de Pe...
Adoção da TI Verde na Administração das Redes de Computadores - Projeto de Pe...Ministério Público da Paraíba
 
Estrutura de Dados - Aula 02 - Estrutura de Dados e TAD
Estrutura de Dados - Aula 02 - Estrutura de Dados e TADEstrutura de Dados - Aula 02 - Estrutura de Dados e TAD
Estrutura de Dados - Aula 02 - Estrutura de Dados e TADLeinylson Fontinele
 
Modelo entidade relacionamento
Modelo entidade relacionamentoModelo entidade relacionamento
Modelo entidade relacionamentoCarlos Melo
 
Fundamentos de banco de dados 01 indrodução
Fundamentos de banco de dados   01 indroduçãoFundamentos de banco de dados   01 indrodução
Fundamentos de banco de dados 01 indroduçãoRafael Pinheiro
 
Armazenamento em nuvem
Armazenamento em nuvemArmazenamento em nuvem
Armazenamento em nuvemTuesla Santos
 
Computação em nuvem (cloud computing), uma introdução.
Computação em nuvem (cloud computing), uma introdução.Computação em nuvem (cloud computing), uma introdução.
Computação em nuvem (cloud computing), uma introdução.Rodrigo Miranda
 

Mais procurados (20)

Computação em nuvem
Computação em nuvemComputação em nuvem
Computação em nuvem
 
Banco de dados
Banco de dadosBanco de dados
Banco de dados
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScript
 
Banco de Dados I - Aula 10 - Banco de Dados Relacional (Modelo Físico)
Banco de Dados I - Aula 10 - Banco de Dados Relacional (Modelo Físico)Banco de Dados I - Aula 10 - Banco de Dados Relacional (Modelo Físico)
Banco de Dados I - Aula 10 - Banco de Dados Relacional (Modelo Físico)
 
Conceitos de Banco de dados e SGBD
Conceitos de Banco de dados e SGBDConceitos de Banco de dados e SGBD
Conceitos de Banco de dados e SGBD
 
Apostila Modelo ER (Entidade Relacionamento)
Apostila Modelo ER (Entidade Relacionamento)Apostila Modelo ER (Entidade Relacionamento)
Apostila Modelo ER (Entidade Relacionamento)
 
Modelo Relacional, Rede e Hierárquico
Modelo Relacional, Rede e HierárquicoModelo Relacional, Rede e Hierárquico
Modelo Relacional, Rede e Hierárquico
 
Conceitos e arquitetura do sistema de banco de dados
Conceitos e arquitetura do sistema de banco de dadosConceitos e arquitetura do sistema de banco de dados
Conceitos e arquitetura do sistema de banco de dados
 
1.Introdução Banco de Dados
1.Introdução Banco de Dados1.Introdução Banco de Dados
1.Introdução Banco de Dados
 
Modelagem de Dados
Modelagem de DadosModelagem de Dados
Modelagem de Dados
 
Modelo Conceitual MER
Modelo Conceitual MERModelo Conceitual MER
Modelo Conceitual MER
 
Adoção da TI Verde na Administração das Redes de Computadores - Projeto de Pe...
Adoção da TI Verde na Administração das Redes de Computadores - Projeto de Pe...Adoção da TI Verde na Administração das Redes de Computadores - Projeto de Pe...
Adoção da TI Verde na Administração das Redes de Computadores - Projeto de Pe...
 
Aula 6 - Cardinalidade
Aula 6 - CardinalidadeAula 6 - Cardinalidade
Aula 6 - Cardinalidade
 
Estrutura de Dados - Aula 02 - Estrutura de Dados e TAD
Estrutura de Dados - Aula 02 - Estrutura de Dados e TADEstrutura de Dados - Aula 02 - Estrutura de Dados e TAD
Estrutura de Dados - Aula 02 - Estrutura de Dados e TAD
 
Modelo entidade relacionamento
Modelo entidade relacionamentoModelo entidade relacionamento
Modelo entidade relacionamento
 
Fundamentos de banco de dados 01 indrodução
Fundamentos de banco de dados   01 indroduçãoFundamentos de banco de dados   01 indrodução
Fundamentos de banco de dados 01 indrodução
 
Aula - Metodologias Ágeis
Aula - Metodologias ÁgeisAula - Metodologias Ágeis
Aula - Metodologias Ágeis
 
Armazenamento em nuvem
Armazenamento em nuvemArmazenamento em nuvem
Armazenamento em nuvem
 
Computação em nuvem (cloud computing), uma introdução.
Computação em nuvem (cloud computing), uma introdução.Computação em nuvem (cloud computing), uma introdução.
Computação em nuvem (cloud computing), uma introdução.
 
PostgreSQL
PostgreSQLPostgreSQL
PostgreSQL
 

Semelhante a Boas práticas no desenvolvimento de software

Refatoração - aquela caprichada no código
Refatoração - aquela caprichada no códigoRefatoração - aquela caprichada no código
Refatoração - aquela caprichada no códigoJuciellen Cabrera
 
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011Luís Cobucci
 
TDC 2015 São Paulo - Clean Code para Testers
TDC 2015 São Paulo - Clean Code para TestersTDC 2015 São Paulo - Clean Code para Testers
TDC 2015 São Paulo - Clean Code para TestersStefan Teixeira
 
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...Pablo Dall'Oglio
 
Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011Luís Cobucci
 
Código limpo: Funções Capítulo 3
Código limpo: Funções  Capítulo 3Código limpo: Funções  Capítulo 3
Código limpo: Funções Capítulo 3Inael Rodrigues
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmGuilherme Blanco
 
Django - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com PythonDjango - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com PythonIgor Sobreira
 
(Re)pensando a OOP - TDC 2012
(Re)pensando a OOP - TDC 2012(Re)pensando a OOP - TDC 2012
(Re)pensando a OOP - TDC 2012Luís Cobucci
 
BSDDAY 2019 - Data Science e Artificial Intelligence usando Freebsd
BSDDAY 2019 - Data Science e Artificial Intelligence usando FreebsdBSDDAY 2019 - Data Science e Artificial Intelligence usando Freebsd
BSDDAY 2019 - Data Science e Artificial Intelligence usando FreebsdMauro Risonho de Paula Assumpcao
 
Projeto de API - TDC 2014 - Floripa - Trilha Arquitetura - 18/05/2014
Projeto de API - TDC 2014 - Floripa - Trilha Arquitetura - 18/05/2014Projeto de API - TDC 2014 - Floripa - Trilha Arquitetura - 18/05/2014
Projeto de API - TDC 2014 - Floripa - Trilha Arquitetura - 18/05/2014Gilmar PSL
 
Projeto de API, por Gilmar P.S
Projeto de API, por Gilmar P.SProjeto de API, por Gilmar P.S
Projeto de API, por Gilmar P.SThoughtworks
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHGiovanni Bassi
 
Joomla Day Brasil 2010: Customizações para grandes portais
Joomla Day Brasil 2010: Customizações para grandes portaisJoomla Day Brasil 2010: Customizações para grandes portais
Joomla Day Brasil 2010: Customizações para grandes portaisrafaelberlanda
 
ZeroBugsProject - Técnicas de programação efetivas
ZeroBugsProject - Técnicas de programação efetivasZeroBugsProject - Técnicas de programação efetivas
ZeroBugsProject - Técnicas de programação efetivasRafael Chinelato Del Nero
 
Clean code - Qualidade em desenvolvimento de Software
Clean code - Qualidade em desenvolvimento de SoftwareClean code - Qualidade em desenvolvimento de Software
Clean code - Qualidade em desenvolvimento de SoftwareGabriel Felipe Soares
 

Semelhante a Boas práticas no desenvolvimento de software (20)

Refatoração - aquela caprichada no código
Refatoração - aquela caprichada no códigoRefatoração - aquela caprichada no código
Refatoração - aquela caprichada no código
 
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
 
TDC 2015 São Paulo - Clean Code para Testers
TDC 2015 São Paulo - Clean Code para TestersTDC 2015 São Paulo - Clean Code para Testers
TDC 2015 São Paulo - Clean Code para Testers
 
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
 
Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011
 
Cs 2
Cs 2Cs 2
Cs 2
 
Clean Code
Clean CodeClean Code
Clean Code
 
Código limpo: Funções Capítulo 3
Código limpo: Funções  Capítulo 3Código limpo: Funções  Capítulo 3
Código limpo: Funções Capítulo 3
 
Código limpo
Código limpoCódigo limpo
Código limpo
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine Orm
 
Django - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com PythonDjango - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com Python
 
(Re)pensando a OOP - TDC 2012
(Re)pensando a OOP - TDC 2012(Re)pensando a OOP - TDC 2012
(Re)pensando a OOP - TDC 2012
 
BSDDAY 2019 - Data Science e Artificial Intelligence usando Freebsd
BSDDAY 2019 - Data Science e Artificial Intelligence usando FreebsdBSDDAY 2019 - Data Science e Artificial Intelligence usando Freebsd
BSDDAY 2019 - Data Science e Artificial Intelligence usando Freebsd
 
Projeto de API - TDC 2014 - Floripa - Trilha Arquitetura - 18/05/2014
Projeto de API - TDC 2014 - Floripa - Trilha Arquitetura - 18/05/2014Projeto de API - TDC 2014 - Floripa - Trilha Arquitetura - 18/05/2014
Projeto de API - TDC 2014 - Floripa - Trilha Arquitetura - 18/05/2014
 
Projeto de API, por Gilmar P.S
Projeto de API, por Gilmar P.SProjeto de API, por Gilmar P.S
Projeto de API, por Gilmar P.S
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BH
 
Joomla Day Brasil 2010: Customizações para grandes portais
Joomla Day Brasil 2010: Customizações para grandes portaisJoomla Day Brasil 2010: Customizações para grandes portais
Joomla Day Brasil 2010: Customizações para grandes portais
 
ZeroBugsProject - Técnicas de programação efetivas
ZeroBugsProject - Técnicas de programação efetivasZeroBugsProject - Técnicas de programação efetivas
ZeroBugsProject - Técnicas de programação efetivas
 
Linguagem C - Funções
Linguagem C - FunçõesLinguagem C - Funções
Linguagem C - Funções
 
Clean code - Qualidade em desenvolvimento de Software
Clean code - Qualidade em desenvolvimento de SoftwareClean code - Qualidade em desenvolvimento de Software
Clean code - Qualidade em desenvolvimento de Software
 

Mais de Felipe

Aula rotulação automática - Automatic tagging
Aula rotulação automática - Automatic taggingAula rotulação automática - Automatic tagging
Aula rotulação automática - Automatic taggingFelipe
 
First steps with Keras 2: A tutorial with Examples
First steps with Keras 2: A tutorial with ExamplesFirst steps with Keras 2: A tutorial with Examples
First steps with Keras 2: A tutorial with ExamplesFelipe
 
Word embeddings introdução, motivação e exemplos
Word embeddings  introdução, motivação e exemplosWord embeddings  introdução, motivação e exemplos
Word embeddings introdução, motivação e exemplosFelipe
 
Cloud Certifications - Overview
Cloud Certifications - OverviewCloud Certifications - Overview
Cloud Certifications - OverviewFelipe
 
Elasticsearch for Data Analytics
Elasticsearch for Data AnalyticsElasticsearch for Data Analytics
Elasticsearch for Data AnalyticsFelipe
 
Cloudwatch: Monitoring your Services with Metrics and Alarms
Cloudwatch: Monitoring your Services with Metrics and AlarmsCloudwatch: Monitoring your Services with Metrics and Alarms
Cloudwatch: Monitoring your Services with Metrics and AlarmsFelipe
 
Cloudwatch: Monitoring your AWS services with Metrics and Alarms
Cloudwatch: Monitoring your AWS services with Metrics and AlarmsCloudwatch: Monitoring your AWS services with Metrics and Alarms
Cloudwatch: Monitoring your AWS services with Metrics and AlarmsFelipe
 
Online Machine Learning: introduction and examples
Online Machine Learning:  introduction and examplesOnline Machine Learning:  introduction and examples
Online Machine Learning: introduction and examplesFelipe
 
Aws cost optimization: lessons learned, strategies, tips and tools
Aws cost optimization: lessons learned, strategies, tips and toolsAws cost optimization: lessons learned, strategies, tips and tools
Aws cost optimization: lessons learned, strategies, tips and toolsFelipe
 
Exemplos de uso de apache spark usando aws elastic map reduce
Exemplos de uso de apache spark usando aws elastic map reduceExemplos de uso de apache spark usando aws elastic map reduce
Exemplos de uso de apache spark usando aws elastic map reduceFelipe
 
Pré processamento de grandes dados com Apache Spark
Pré processamento de grandes dados com Apache SparkPré processamento de grandes dados com Apache Spark
Pré processamento de grandes dados com Apache SparkFelipe
 
Hadoop MapReduce and Apache Spark on EMR: comparing performance for distribut...
Hadoop MapReduce and Apache Spark on EMR: comparing performance for distribut...Hadoop MapReduce and Apache Spark on EMR: comparing performance for distribut...
Hadoop MapReduce and Apache Spark on EMR: comparing performance for distribut...Felipe
 
Rachinations
RachinationsRachinations
RachinationsFelipe
 
Ausgewählte preußische Tugenden
Ausgewählte preußische TugendenAusgewählte preußische Tugenden
Ausgewählte preußische TugendenFelipe
 
Short intro to scala and the play framework
Short intro to scala and the play frameworkShort intro to scala and the play framework
Short intro to scala and the play frameworkFelipe
 
Conceitos e exemplos em versionamento de código
Conceitos e exemplos em versionamento de códigoConceitos e exemplos em versionamento de código
Conceitos e exemplos em versionamento de códigoFelipe
 
DevOps Series: Extending vagrant with Puppet for configuration management
DevOps Series: Extending vagrant with Puppet for configuration managementDevOps Series: Extending vagrant with Puppet for configuration management
DevOps Series: Extending vagrant with Puppet for configuration managementFelipe
 
DevOps Series: Defining and Sharing Testable Machine Configurations with vagrant
DevOps Series: Defining and Sharing Testable Machine Configurations with vagrantDevOps Series: Defining and Sharing Testable Machine Configurations with vagrant
DevOps Series: Defining and Sharing Testable Machine Configurations with vagrantFelipe
 
D3.js 30-minute intro
D3.js   30-minute introD3.js   30-minute intro
D3.js 30-minute introFelipe
 

Mais de Felipe (19)

Aula rotulação automática - Automatic tagging
Aula rotulação automática - Automatic taggingAula rotulação automática - Automatic tagging
Aula rotulação automática - Automatic tagging
 
First steps with Keras 2: A tutorial with Examples
First steps with Keras 2: A tutorial with ExamplesFirst steps with Keras 2: A tutorial with Examples
First steps with Keras 2: A tutorial with Examples
 
Word embeddings introdução, motivação e exemplos
Word embeddings  introdução, motivação e exemplosWord embeddings  introdução, motivação e exemplos
Word embeddings introdução, motivação e exemplos
 
Cloud Certifications - Overview
Cloud Certifications - OverviewCloud Certifications - Overview
Cloud Certifications - Overview
 
Elasticsearch for Data Analytics
Elasticsearch for Data AnalyticsElasticsearch for Data Analytics
Elasticsearch for Data Analytics
 
Cloudwatch: Monitoring your Services with Metrics and Alarms
Cloudwatch: Monitoring your Services with Metrics and AlarmsCloudwatch: Monitoring your Services with Metrics and Alarms
Cloudwatch: Monitoring your Services with Metrics and Alarms
 
Cloudwatch: Monitoring your AWS services with Metrics and Alarms
Cloudwatch: Monitoring your AWS services with Metrics and AlarmsCloudwatch: Monitoring your AWS services with Metrics and Alarms
Cloudwatch: Monitoring your AWS services with Metrics and Alarms
 
Online Machine Learning: introduction and examples
Online Machine Learning:  introduction and examplesOnline Machine Learning:  introduction and examples
Online Machine Learning: introduction and examples
 
Aws cost optimization: lessons learned, strategies, tips and tools
Aws cost optimization: lessons learned, strategies, tips and toolsAws cost optimization: lessons learned, strategies, tips and tools
Aws cost optimization: lessons learned, strategies, tips and tools
 
Exemplos de uso de apache spark usando aws elastic map reduce
Exemplos de uso de apache spark usando aws elastic map reduceExemplos de uso de apache spark usando aws elastic map reduce
Exemplos de uso de apache spark usando aws elastic map reduce
 
Pré processamento de grandes dados com Apache Spark
Pré processamento de grandes dados com Apache SparkPré processamento de grandes dados com Apache Spark
Pré processamento de grandes dados com Apache Spark
 
Hadoop MapReduce and Apache Spark on EMR: comparing performance for distribut...
Hadoop MapReduce and Apache Spark on EMR: comparing performance for distribut...Hadoop MapReduce and Apache Spark on EMR: comparing performance for distribut...
Hadoop MapReduce and Apache Spark on EMR: comparing performance for distribut...
 
Rachinations
RachinationsRachinations
Rachinations
 
Ausgewählte preußische Tugenden
Ausgewählte preußische TugendenAusgewählte preußische Tugenden
Ausgewählte preußische Tugenden
 
Short intro to scala and the play framework
Short intro to scala and the play frameworkShort intro to scala and the play framework
Short intro to scala and the play framework
 
Conceitos e exemplos em versionamento de código
Conceitos e exemplos em versionamento de códigoConceitos e exemplos em versionamento de código
Conceitos e exemplos em versionamento de código
 
DevOps Series: Extending vagrant with Puppet for configuration management
DevOps Series: Extending vagrant with Puppet for configuration managementDevOps Series: Extending vagrant with Puppet for configuration management
DevOps Series: Extending vagrant with Puppet for configuration management
 
DevOps Series: Defining and Sharing Testable Machine Configurations with vagrant
DevOps Series: Defining and Sharing Testable Machine Configurations with vagrantDevOps Series: Defining and Sharing Testable Machine Configurations with vagrant
DevOps Series: Defining and Sharing Testable Machine Configurations with vagrant
 
D3.js 30-minute intro
D3.js   30-minute introD3.js   30-minute intro
D3.js 30-minute intro
 

Boas práticas no desenvolvimento de software

  • 1. Boas Práticas no Desenvolvimento de Software 60 - 90 minutos Atualizado: Julho 2015 falmeida1988@gmail.com Com foco especial em aplicativos Web, tipagem fraca, sistemas de informação. (Exemplos em PHP)
  • 2. Princípios gerais ● Consistência ○ Senão fica muito trabalhoso entender o sistema ● Cérebro humano é limitado ○ 7 ± 2 coisas ao mesmo tempo é o limite ■ métodos em uma classe, classes em um módulo, etc ● Comentários ○ São para dizer o porquê e não o como. O como é o próprio código que diz (se for bem-feito, com componentes auto-explicativos) ● Legibilidade ○ O código é, em geral, lido mais frequentemente do que escrito
  • 3. Princípios gerais ● Testes ○ Sem testes você não tem como saber se alguma parte da sua aplicação deixou de funcionar depois de uma modificação ● Objetivos eternos: ○ Baixo acoplamento ○ Reduzir complexidade ■ Usando abstrações (exemplo?) ● A característica mais importante do código é “quão fácil é modificá-lo?”
  • 4. Princípios gerais ● Se você não tomar medidas para manter a estrutura do seu projeto, ele irá acabar uma massa amorfa impossível de entender ou de mudar ● “Privado até prova em contrário” (por que?) ● Vai haver casos em que você vai precisar quebrar um desses princípios para resolver algum problema urgente, mas saiba que isso tem um custo, que vai aumentando com o tempo. Isso é uma dívida técnica (technical debt) que você vai ter que pagar mais cedo ou mais tarde.
  • 5. Nomes auto-explicativos Razão ● Dá pra entender o que está sendo feito só de se ver o nome das coisas ● Não precisa tanto de comentários Anti-exemplo // fazendo a média de todas as idades recebidas $a = func2($b); Exemplo $mediaIdades = calculaMedia($idades);
  • 6. Coisas explícitas em vez de implícitas Razão ● Mais fácil de entender o código depois ○ Mesmo por você ● Mais fácil de reusar e refatorar (por que?) ● Mesmo em um método de instância (em um objeto), às vezes é melhor passar os parâmetros explicitamente (como argumentos) em vez de pegar tudo do $this ou de alguma coisa implícita (como variáveis globais).
  • 7. Coisas explícitas em vez de implícitas Anti-exemplo class User{ //não tem como saber (de fora) o que esta função usa sem olhar seu código public function calculaPontos() { $data = $this->foo-> getData(); //linhas de código $empresa = $this-> getEmpresa(); // mais linhas de código $historicoDeCompras = Helper::getHistoricoDeCompras ($usuario,$data); // mais linhas de código return $resultado;
  • 8. Coisas explícitas em vez de implícitas Exemplo // está óbvio que este método calcula pontos para um usuário levando em // consideração a data, sua empresa e seu histórico de compras class User{ public function calculaPontos($data,$empresa,$historicoDeCompras){ // corpo do método } Note que, no anti-exemplo, um potencial usuário precisa saber, de antemão, que um User precisa ter uma Empresa definida pois caso contrário o método getEmpresa() pode gerar um erro. Isto é mais uma coisa implícita que, no exemplo dado, torna-se explícita, impedindo possíveis erros.
  • 9. Lei de Demeter “Não fale com o vizinho do seu vizinho” Razão ● Aumenta complexidade ● Aumenta acoplamento Anti-exemplo // uma mudança em qualquer dos componentes da cadeia vai quebrar esse código $anoDeFundacao = $user ->getEmpresa() ->getMatriz() ->getDataDeFundacao() ->getAno();
  • 10. Lei de Demeter Exemplo // comportamento delegado para a classe User // o código atual não é afetado por mudanças na obtenção do ano de fundação $anoDeFundacao = $user-> getAnoDeFundacao() ;
  • 11. Asserts nos lugares certos Razão ● Garantir que, de um ponto em diante, uma certa condição é verdadeira ○ Só para coisas que nunca devem ser false ● Dar “pistas”, para quem está lendo, do que você está fazendo Exemplo $pessoas = Pessoa::getAll(); //do banco de dados $pontuacoes = funcaoComplicadaQueCalculaPontosParaPessoas ($pessoas); $cores = funcaoComplicadaQuePegaACorPreferidaDeCadaPessoa ($pessoa); assert( count($pontuacoes) === count($cores) ); //se esse assert falhar, há algo errado //melhor descobrir agora do que mais à frente
  • 12. Edge cases (casos-limite) Razão ● Nós só costumamos pensar nos casos comuns que uma função deve atender Anti-exemplo function avg(array $arr){ $sum = 0; $size = count($arr); foreach($arr as $num){ $sum += $num; } return $sum/$size; //quando isso pode dar errado? }
  • 13. Escolheu um jeito, fique com ele Razão ● Pessoas não conseguem criar um modelo mental do seu projeto se ele não for consistente Exemplos ● Nomenclatura de variáveis ● Estrutura de classes, arquivos
  • 14. Passar operações para fora dos loops sempre que possível Razão ● Às vezes a gente pode criar um problema sem perceber ● Muitas vezes uma informação é constante para todas as execuções de um loop Exemplos ● Operações no banco de dados ● Outros tipos de operações pesadas
  • 15. Value Objects Quando você tem muitos pequenos dados que precisam ser manipulados juntos Razão ● Evitar ter que definir uma função que recebe 15 parâmetros ● Podemos capturar erros mais cedo (vai dar erro se o VO passado não for do tipo correto) Anti-exemplo $relatorio = geraRelatorio($itens,$dataInicio,$dataFim, $secoes,$incluirGraficos,$incluirInformacoesGerais,$estilo,$nome);
  • 16. Value Objects Exemplo $opcoesVO = new OpcoesDoRelatorioVO($itens,$dataInicio, $dataFim,$incluirGraficos,$incluirInformacoesGerais,$estilo,$nome); // código mais simples, mais fácil entender e mais fácil de mudar $relatorio = geraRelatorio($opcoesVO);
  • 17. Métodos e classes devem devem fazer poucas coisas Razão ● 7 ± 2 ● Facilidade de reuso, manutenção Anti-Exemplo // um nome vago assim já é um sintoma sério public function getResultadoCorreto ($params){ // 600 linhas de código }
  • 18. Métodos e classes devem devem fazer poucas coisas Extra ● Classes que representam entidades e tabelas do Banco (modelos) vs o resto ● Não helperizar seus modelos nem controllers
  • 19. Programação Top down “Pensar no todo antes de criar as partes” Razão ● Se você cria as partes (funções e classes individuais) que você acha que serão necessárias antes de pensar a estrutura do projeto, você pode acabar tendo que “entortar” a estrutura para que consiga usar as partes que você já criou.
  • 20. Programação Top down Anti-Exemplo ● Preciso criar um sistema para gerar relatórios. ● “Vou criar logo a parte das consultas de banco de dados pois já sei que serão necessárias.” ● Com essas partes prontas, vou começar a fazer o loop principal do sistema (exemplo?) ○ Agora vi que vou precisar consultar um CSV também. Vou adicionar um parâmetro às funções do banco para resolver isso. ○ Agora vi que vou precisar gerar resultados em PDF também então vou adicionar um parâmetro a todas as funções de consulta a dados que foram feitas para que modifiquem o output. ● 9 meses depois o sistema está desorganizado e sem estrutura
  • 21. Programação Top down Exemplo ● Preciso criar um sistema para gerar relatórios. ● Vou criar a estrutura principal “fingindo” que as partes já foram criadas (exemplo?)
  • 22. DRY Don’t repeat yourself Razão ● Evitar retrabalho ● Evitar erros (corrigiu uma vez, todos os clientes estão OK)