Clean Code
Qualidade e velocidade em
desenvolvimento de software
Apresentação
Gabriel Felipe Soares <gabrielfs7@gmail.com>
Desenvolvedor PHP
Zend Certified PHP Engineer (ZEND022952)
8 anos de experiência na área de desenvolvimento web, principalmente na
parte de processamento de cartões de crédito e ecommerce.
Objetivos
● Conhecer a relação de “Clean Code” com a qualidade
no desenvolvimento de software.
● Conhecer algumas das principais ferramentas para
qualidade de software em PHP.
● Apropriar os conhecimentos de forma empírica
utilizando algumas das ferramentas apresentadas.
“Resolvo isso em 5
minutos!”
Primeiros dias de
trabalho...
“É simples. apenas
mais um if!”
“Basta criar uma
flag...”
“Não temos orçamento para os
testes… Pode liberar para produção
ainda hoje? É urgente!!”
“Precisamos
deste módulo
personalizado…”
“Assim já é o
suficiente. Vai
atender a nossa
necessidade atual…”
“É algo simples. Por
favor, adicione mais esta
condicional. O cliente
está me pressionando…”
Em 1982, James Q. Wilson e George L. Kelling escreveram um
famoso artigo chamado “Janelas Quebradas”
GUERREIRO.
O Bombeiro
- Mais tempo para o entendimento.
- Dificulta adaptação de novos
desenvolvedores.
- Gera redundância e discrepância.
- Maior tempo e dificuldade de
manutenção.
- Menor controle de impactos.
- Maior risco e dificuldade de
crescimento.
Quanto custa um código sujo?
Em 1982, James Q. Wilson e George L. Kelling escreveram um
famoso artigo chamado “Janelas Quebradas”
● Redundância = Discrepância.
● Falta de padrão = Código confuso.
● Ausência de testes = Sem controle.
● Negligência de segurança (sem tempo?).
● Ausência de tratamento de exceções.
● Desmotivação / Descaso.
● Aumento do estresse.
● Saída do funcionário (ou não…)
● Aumentos dos custos e prazos.
Quanto custa um código
sujo?
Algumas perguntas
Como você se sente ao pegar um código “ruim” de um colega?
Por que produzimos código “ruim”?
Por que perdemos a produtividade/motivação?
Como você quer ser lembrado?
O que é Clean Code?
Clean Code
“Programar é a arte de dizer a
outro humano o que o ele quer
que o computador faça.”
Donald Knuth. Cientista computacional de
renome e professor da Universidade de
Stanford e autor do livro “The Art of
Computer Programming”
“ A lógica deve ser direta para
dificultar o encobrimento de bugs,
as dependências mínimas para
facilitar a manutenção [...] O
código limpo faz bem apenas uma
coisa.”
Bjarne Stroustrup, criador do C++
Clean Code
“Ele jamais torna confuso o
objetivo do desenvolvedor, em vez
disso, ele está repleto de
abstrações claras e linhas de
controles objetivas”
Grady Booch, autor do livro “Object
Oriented Analysis and Design with
Applications”
“ Um código limpo parece que foi
escrito por alguém que se
importava. Não há nada de óbvio
que se pode fazer para torná-lo
melhor”
Michael Feathers, autor de “Working
Effectively with Legacy Code”
Clean Code
● É inteligível.
● É autoexplicativo.
● É expressivo.
● Usa nomes significativos.
● É testável e testado.
● É curto, simples e objetivo.
● Faz bem apenas uma coisa.
● Sem duplicação de código.
● É escrito com cuidado.
Boas práticas
● Deixe o código melhor do que
você encontrou.
● Refatore sempre!
● Teste ao menos as partes mais
críticas.
● Evite classes e métodos muito
grandes (excesso de
responsabilidade).
● Excluir métodos, classes e
atributos não utilizados.
● ...
Total Productive Maintenance e o 5S
- Seiri (Organização): Nomenclatura e lugares adequados.
- Seiton (Arrumação): Constante refatoração.
- Seiso (Limpeza): Código, claro, simples e sem repetições
- Seiketsu (Padronização): Definir um padrão.
- Shutzuke (Disciplina): Seguir padrão, refletir e melhorar.
Evite comentários
// Classe que representa a entidade Cliente
class Cliente
{
// Nome do cliente
private $name;
// Retorna o nome do cliente
public function getName()
Evite nomes sem sentido
class ServicoConta
{
public function addSl($ct, $v) {
$cl->setSl($cl->getSl() + $v);
}
Use nomes autoexplicativos
class ContabilizadorSaldo
{
public function adicionaSaldo(Conta $conta, $valor) {
$conta->setSaldo($conta->getSaldo() + $valor);
}
Evite classes métodos assim
class EfetuadorPagamento
{
public function paga(
Conta $conta, Compra $compra, $dataPagamento = null,
Loja $loja, MeioPagamento $meioPagamento) {
$dataPagamento = $dataPagamento ?: new DateTime();
if ($conta->getSaldo() < $compra->getValor()) {
return false;
}//end if
$aceitaMeioPagamento = false;
for ($loja->getMeiosPagamentoAceitos() as $meioPagamentoAceito) {
if ($meioPagamentoAceito->getId() == $meioPagamento->getId()) {
$aceitaMeioPagamento = true;
}
}//end for
if ($aceitaMeioPagamento) {
$pagamento = new Pagamento();
$pagemento->setConta($conta);
$pagemento->setLoja($conta);
$pagamento->setData($dataPagamento);
...
Distribua as responsabilidades
class RealizadorCheckout
{
public function realizaPagamento(Compra $compra, MeioPagamento
$meioPagamento)
{
$this->verificadorSaldo
->validaSaldoDisponivel($compra->getConta(), $compra->getValor());
$this->verificadorMeioPagamento
->validaLojaAceitaMeioPagamento($compra->getLoja(), $meioPagamento);
$this->registradorPagamento
->registraPagamento($compra, $meioPagamento);
...
Ferramentas que vão te ajudar...
- SOLID
- KISS
- DRY
- TDD (Ex: PHPUnit)
- Refactoring
- Design Patterns (Factory, DI)
Ferramentas que vão te ajudar...
Controle de Versão
- É mais seguro.
- Histórico de modificações (backup /
análise).
- Trabalho simultâneo (branching).
- Gera ambiente colaborativo.
- Planejamento de releases.
- Integração contínua (hooks).
Branching Model
Gerenciamento de dependências
$ composer install
$ composer update
https://getcomposer.org
https://packagist.org
Gerenciamento de dependências
Infos
- http://meldmerge.org (Merge tool)
- https://github.com/gabrielfs7/clean-code (Projeto dojo)
- https://phpunit.de/manual/current/pt_br/index.html (Testes)
- https://phpmd.org/rules/index.html (mess detector)
Livro Clean Code
Livro: Clean Code
Autor: Robert C. Martin

Clean code - Qualidade em desenvolvimento de Software

  • 1.
    Clean Code Qualidade evelocidade em desenvolvimento de software
  • 2.
    Apresentação Gabriel Felipe Soares<gabrielfs7@gmail.com> Desenvolvedor PHP Zend Certified PHP Engineer (ZEND022952) 8 anos de experiência na área de desenvolvimento web, principalmente na parte de processamento de cartões de crédito e ecommerce.
  • 3.
    Objetivos ● Conhecer arelação de “Clean Code” com a qualidade no desenvolvimento de software. ● Conhecer algumas das principais ferramentas para qualidade de software em PHP. ● Apropriar os conhecimentos de forma empírica utilizando algumas das ferramentas apresentadas.
  • 4.
    “Resolvo isso em5 minutos!” Primeiros dias de trabalho... “É simples. apenas mais um if!” “Basta criar uma flag...”
  • 5.
    “Não temos orçamentopara os testes… Pode liberar para produção ainda hoje? É urgente!!”
  • 6.
  • 7.
    “Assim já éo suficiente. Vai atender a nossa necessidade atual…”
  • 8.
    “É algo simples.Por favor, adicione mais esta condicional. O cliente está me pressionando…”
  • 9.
    Em 1982, JamesQ. Wilson e George L. Kelling escreveram um famoso artigo chamado “Janelas Quebradas” GUERREIRO. O Bombeiro
  • 10.
    - Mais tempopara o entendimento. - Dificulta adaptação de novos desenvolvedores. - Gera redundância e discrepância. - Maior tempo e dificuldade de manutenção. - Menor controle de impactos. - Maior risco e dificuldade de crescimento. Quanto custa um código sujo?
  • 11.
    Em 1982, JamesQ. Wilson e George L. Kelling escreveram um famoso artigo chamado “Janelas Quebradas” ● Redundância = Discrepância. ● Falta de padrão = Código confuso. ● Ausência de testes = Sem controle. ● Negligência de segurança (sem tempo?). ● Ausência de tratamento de exceções. ● Desmotivação / Descaso. ● Aumento do estresse. ● Saída do funcionário (ou não…) ● Aumentos dos custos e prazos. Quanto custa um código sujo?
  • 12.
    Algumas perguntas Como vocêse sente ao pegar um código “ruim” de um colega? Por que produzimos código “ruim”? Por que perdemos a produtividade/motivação? Como você quer ser lembrado?
  • 13.
    O que éClean Code?
  • 14.
    Clean Code “Programar éa arte de dizer a outro humano o que o ele quer que o computador faça.” Donald Knuth. Cientista computacional de renome e professor da Universidade de Stanford e autor do livro “The Art of Computer Programming” “ A lógica deve ser direta para dificultar o encobrimento de bugs, as dependências mínimas para facilitar a manutenção [...] O código limpo faz bem apenas uma coisa.” Bjarne Stroustrup, criador do C++
  • 15.
    Clean Code “Ele jamaistorna confuso o objetivo do desenvolvedor, em vez disso, ele está repleto de abstrações claras e linhas de controles objetivas” Grady Booch, autor do livro “Object Oriented Analysis and Design with Applications” “ Um código limpo parece que foi escrito por alguém que se importava. Não há nada de óbvio que se pode fazer para torná-lo melhor” Michael Feathers, autor de “Working Effectively with Legacy Code”
  • 16.
    Clean Code ● Éinteligível. ● É autoexplicativo. ● É expressivo. ● Usa nomes significativos. ● É testável e testado. ● É curto, simples e objetivo. ● Faz bem apenas uma coisa. ● Sem duplicação de código. ● É escrito com cuidado. Boas práticas ● Deixe o código melhor do que você encontrou. ● Refatore sempre! ● Teste ao menos as partes mais críticas. ● Evite classes e métodos muito grandes (excesso de responsabilidade). ● Excluir métodos, classes e atributos não utilizados. ● ...
  • 17.
    Total Productive Maintenancee o 5S - Seiri (Organização): Nomenclatura e lugares adequados. - Seiton (Arrumação): Constante refatoração. - Seiso (Limpeza): Código, claro, simples e sem repetições - Seiketsu (Padronização): Definir um padrão. - Shutzuke (Disciplina): Seguir padrão, refletir e melhorar.
  • 18.
    Evite comentários // Classeque representa a entidade Cliente class Cliente { // Nome do cliente private $name; // Retorna o nome do cliente public function getName()
  • 19.
    Evite nomes semsentido class ServicoConta { public function addSl($ct, $v) { $cl->setSl($cl->getSl() + $v); }
  • 20.
    Use nomes autoexplicativos classContabilizadorSaldo { public function adicionaSaldo(Conta $conta, $valor) { $conta->setSaldo($conta->getSaldo() + $valor); }
  • 21.
    Evite classes métodosassim class EfetuadorPagamento { public function paga( Conta $conta, Compra $compra, $dataPagamento = null, Loja $loja, MeioPagamento $meioPagamento) { $dataPagamento = $dataPagamento ?: new DateTime(); if ($conta->getSaldo() < $compra->getValor()) { return false; }//end if $aceitaMeioPagamento = false; for ($loja->getMeiosPagamentoAceitos() as $meioPagamentoAceito) { if ($meioPagamentoAceito->getId() == $meioPagamento->getId()) { $aceitaMeioPagamento = true; } }//end for if ($aceitaMeioPagamento) { $pagamento = new Pagamento(); $pagemento->setConta($conta); $pagemento->setLoja($conta); $pagamento->setData($dataPagamento); ...
  • 22.
    Distribua as responsabilidades classRealizadorCheckout { public function realizaPagamento(Compra $compra, MeioPagamento $meioPagamento) { $this->verificadorSaldo ->validaSaldoDisponivel($compra->getConta(), $compra->getValor()); $this->verificadorMeioPagamento ->validaLojaAceitaMeioPagamento($compra->getLoja(), $meioPagamento); $this->registradorPagamento ->registraPagamento($compra, $meioPagamento); ...
  • 23.
    Ferramentas que vãote ajudar... - SOLID - KISS - DRY - TDD (Ex: PHPUnit) - Refactoring - Design Patterns (Factory, DI)
  • 24.
  • 25.
    Controle de Versão -É mais seguro. - Histórico de modificações (backup / análise). - Trabalho simultâneo (branching). - Gera ambiente colaborativo. - Planejamento de releases. - Integração contínua (hooks).
  • 26.
  • 27.
    Gerenciamento de dependências $composer install $ composer update https://getcomposer.org https://packagist.org
  • 28.
  • 29.
    Infos - http://meldmerge.org (Mergetool) - https://github.com/gabrielfs7/clean-code (Projeto dojo) - https://phpunit.de/manual/current/pt_br/index.html (Testes) - https://phpmd.org/rules/index.html (mess detector)
  • 30.
    Livro Clean Code Livro:Clean Code Autor: Robert C. Martin