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

Banco de Dados - Introdução - Projeto de Banco de Dados - DER
Banco de Dados - Introdução - Projeto de Banco de Dados - DERBanco de Dados - Introdução - Projeto de Banco de Dados - DER
Banco de Dados - Introdução - Projeto de Banco de Dados - DERRangel Javier
 
Apresentaçao das nr.s
Apresentaçao das nr.sApresentaçao das nr.s
Apresentaçao das nr.sJunior Almeida
 
Acidentes de trabalho histórico
Acidentes de trabalho   históricoAcidentes de trabalho   histórico
Acidentes de trabalho históricoMarcelo Vieira
 
Stored Procedures and Triggers
Stored Procedures and TriggersStored Procedures and Triggers
Stored Procedures and Triggersflaviognm
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScriptBruno Catão
 
Fontes de Informação On-line
Fontes de Informação On-lineFontes de Informação On-line
Fontes de Informação On-lineBibliotecaUfes
 
Lógica de Programação - Estruturas de Seleção
Lógica de Programação - Estruturas de SeleçãoLógica de Programação - Estruturas de Seleção
Lógica de Programação - Estruturas de SeleçãoJanynne Gomes
 
16057022 1242681113ergonomia
16057022 1242681113ergonomia16057022 1242681113ergonomia
16057022 1242681113ergonomiaPelo Siro
 
Aula 06 - Busca em Base de Dados
Aula 06 - Busca em Base de DadosAula 06 - Busca em Base de Dados
Aula 06 - Busca em Base de DadosGhiordanno Bruno
 
O Processo de Desenvolvimento de Software
O Processo de Desenvolvimento de SoftwareO Processo de Desenvolvimento de Software
O Processo de Desenvolvimento de SoftwareCamilo de Melo
 
Passo a passo Esterilização de Equipamentos
Passo a passo Esterilização de Equipamentos Passo a passo Esterilização de Equipamentos
Passo a passo Esterilização de Equipamentos Tudo Belo Estética
 
Eng.introdução
Eng.introduçãoEng.introdução
Eng.introduçãoEliane Blen
 
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
 
Sistemas operacionais
Sistemas operacionaisSistemas operacionais
Sistemas operacionaisvini_campos
 

Mais procurados (20)

Banco de Dados - Introdução - Projeto de Banco de Dados - DER
Banco de Dados - Introdução - Projeto de Banco de Dados - DERBanco de Dados - Introdução - Projeto de Banco de Dados - DER
Banco de Dados - Introdução - Projeto de Banco de Dados - DER
 
Apresentaçao das nr.s
Apresentaçao das nr.sApresentaçao das nr.s
Apresentaçao das nr.s
 
Acidentes de trabalho histórico
Acidentes de trabalho   históricoAcidentes de trabalho   histórico
Acidentes de trabalho histórico
 
Biossegurança 2
Biossegurança 2Biossegurança 2
Biossegurança 2
 
Aula 12 - Processador
Aula 12 - ProcessadorAula 12 - Processador
Aula 12 - Processador
 
Stored Procedures and Triggers
Stored Procedures and TriggersStored Procedures and Triggers
Stored Procedures and Triggers
 
Aula 1 - Ergonomia
Aula 1 - ErgonomiaAula 1 - Ergonomia
Aula 1 - Ergonomia
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScript
 
biossegurança
biossegurançabiossegurança
biossegurança
 
Fontes de Informação On-line
Fontes de Informação On-lineFontes de Informação On-line
Fontes de Informação On-line
 
Lógica de Programação - Estruturas de Seleção
Lógica de Programação - Estruturas de SeleçãoLógica de Programação - Estruturas de Seleção
Lógica de Programação - Estruturas de Seleção
 
16057022 1242681113ergonomia
16057022 1242681113ergonomia16057022 1242681113ergonomia
16057022 1242681113ergonomia
 
Informatica Básica - Sexta Básica
Informatica Básica - Sexta BásicaInformatica Básica - Sexta Básica
Informatica Básica - Sexta Básica
 
Banco de Dados - Conceitos Básicos
Banco de Dados - Conceitos BásicosBanco de Dados - Conceitos Básicos
Banco de Dados - Conceitos Básicos
 
Aula 06 - Busca em Base de Dados
Aula 06 - Busca em Base de DadosAula 06 - Busca em Base de Dados
Aula 06 - Busca em Base de Dados
 
O Processo de Desenvolvimento de Software
O Processo de Desenvolvimento de SoftwareO Processo de Desenvolvimento de Software
O Processo de Desenvolvimento de Software
 
Passo a passo Esterilização de Equipamentos
Passo a passo Esterilização de Equipamentos Passo a passo Esterilização de Equipamentos
Passo a passo Esterilização de Equipamentos
 
Eng.introdução
Eng.introduçãoEng.introdução
Eng.introdução
 
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
 
Sistemas operacionais
Sistemas operacionaisSistemas operacionais
Sistemas operacionais
 

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)