clean code - qualidade em desenvolvimento de software
TRANSCRIPT
Clean CodeQualidade e velocidade em
desenvolvimento de software
Apresentação
Gabriel Felipe Soares <[email protected]>
Desenvolvedor PHPZend 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 perguntasComo 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 Clienteclass Cliente { // Nome do cliente
private $name;
// Retorna o nome do clientepublic function getName()
Evite nomes sem sentidoclass ServicoConta{
public function addSl($ct, $v) {$cl->setSl($cl->getSl() + $v);
}
Use nomes autoexplicativosclass ContabilizadorSaldo{
public function adicionaSaldo(Conta $conta, $valor) {$conta->setSaldo($conta->getSaldo() + $valor);
}
Evite classes métodos assimclass 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 forif ($aceitaMeioPagamento) {$pagamento = new Pagamento();
$pagemento->setConta($conta);$pagemento->setLoja($conta);$pagamento->setData($dataPagamento);...
Distribua as responsabilidadesclass 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)
- Mess Detector (Ex: PHPMD)
- Code Standard (Ex: PHP Code Sniffer, PHP-FIG)
- Documentation (Ex: PHPDoc)
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 updatehttps://getcomposer.orghttps://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)
- https://www.phpdoc.org/ (PHPDoc)
Livro Clean Code
Livro: Clean CodeAutor: Robert C. Martin