Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

Potencializando a qualidade de código

Potencializando a qualidade de código

A qualidade do código fonte sempre foi uma grande preocupação tanto dentro do ambiente comercial, quanto dentro da comunidade. Aspectos como facilidade de compreensão, organização e clareza são importantes para código que será mantido e reaproveitado em projetos futuros. Conheça os princípios, padrões e ferramentas mais utilizados almejando a qualidade.

Esse talk faz parte da programação do Dark Mira Tour 2016.

Maykel Santos Braz

March 19, 2016
Tweet

More Decks by Maykel Santos Braz

Other Decks in Programming

Transcript

  1. SUMÁRIO • Definição • Princípios • Padrões de codificação •

    QA Tools • Profile • Dicas gerais POTENCIALIZANDO A QUALIDADE DE CÓDIGO Let me cast some light in our path
  2. O QUE É QUALIDADE? Ou, como ela é percebida, visualizada,

    e/ou medida? POTENCIALIZANDO A QUALIDADE DE CÓDIGO
  3. A QUALIDADE ESTÁ RELACIONADA À ÓTICA POTENCIALIZANDO A QUALIDADE DE

    CÓDIGO Analista • Atende os requisitos Infraestrutura • Robusto Programador • Intuitivo / Fácil leitura e manutenção Empresa • Lucrativo Cliente • Correto Gestor • Dentro do prazo freepik.com
  4. MAS O TRABALHO É TODO SEU POTENCIALIZANDO A QUALIDADE DE

    CÓDIGO Com grandes poderes, vêm grandes responsabilidades freepik.com
  5. ANÁLISE ESTÁTICA & ANÁLISE DINÂMICA Análise estática • Baseada na

    estrutura • Sem rodar o app • Coleta de estatísticas • Requer avaliação ponderada Análise dinâmica • Baseada no comportamento • Rodando o app • Situações pré-programadas • Rápida avaliação POTENCIALIZANDO A QUALIDADE DE CÓDIGO Static analysis & Dinamic analysis http://feaforall.com/wp-content/uploads/2013/04/1.jpg
  6. PRINCÍPIOS DE DESIGN DE SOFTWARE Diretrizes para se considerar ao

    / antes de codificar POTENCIALIZANDO A QUALIDADE DE CÓDIGO
  7. PRINCÍPIOS DE DESIGN DE SOFTWARE • Reuso de experiência; •

    Recomendações do que deve ser feito; • Recomendações do que deve ser evitado. POTENCIALIZANDO A QUALIDADE DE CÓDIGO KISS YAGNI STUPID DRY SOLID
  8. KISS • Preza pela simplicidade • Fácil de entender e

    manter • Menos suscetível a erros • Parece simplista ou “chato” • Simplificação de problemas PRINCÍPIOS DE DESIGN DE SOFTWARE “Uma solução simples é melhor que uma complexa, mesmo que ela pareça estúpida.” “Faça de forma simples, mas não mais simples que o necessário.” M R E C
  9. DRY • Reduzir a repetição de informações • Mitigar contradições

    • Métodos e sub-rotinas • Não inclui apenas código • Fonte única de conhecimento – Geradores – Automatizadores  Reduz o acomplamento (coupling) PRINCÍPIOS DE DESIGN DE SOFTWARE “Cada parte do conhecimento deve ter uma origem única e sem ambiguidade.” M R E C
  10. YAGNI • Associado a XP • Refatoração contínua • Requisitos

    bem definidos • Custo de implementação – Barato agora e barato depois? Deixe pra depois. – Barato agora e caro depois? Faça agora. • Redução de bugs PRINCÍPIOS DE DESIGN DE SOFTWARE “Implemente quando você realmente precisar, e não quando acha que vai precisar.” M R E C
  11. STUPID X SOLID • Ambos definem um conjunto de princípios;

    • STUPID: Evite problemas no seu código; • SOLID: Boas práticas para melhorar seu código. PRINCÍPIOS DE DESIGN DE SOFTWARE O que fazer e o não fazer quando estiver codificando STUPID SOLID
  12. STUPID • Singleton • Tight Coupling • Untestability • Premature

    Optimization • Indescriptive Naming • Duplication • Difíceis de testar; • Escondem dependências; • Tight coupling. PRINCÍPIOS DE DESIGN DE SOFTWARE Só pode haver um
  13. STUPID • Singleton • Tight Coupling • Untestability • Premature

    Optimization • Indescriptive Naming • Duplication • Duplicação de código; • Código de um módulo utilizando código de outro; • Dependências circulares; • Dependências descontroladas. PRINCÍPIOS DE DESIGN DE SOFTWARE Assim como o mar, onde uma única gota desencadeia uma reação sem proporções http://martinfowler.com/ieeeSoftware/coupling.pdf
  14. STUPID • Singleton • Tight Coupling • Untestability • Premature

    Optimization • Indescriptive Naming • Duplication • Singleton; • Tight Coupling; • Acúmulo de responsabilidades. PRINCÍPIOS DE DESIGN DE SOFTWARE I find your lack of tests disturbing
  15. STUPID • Singleton • Tight Coupling • Untestability • Premature

    Optimization • Indescriptive Naming • Duplication • 97% do tempo você estará otimizando o lugar errado do código; • Prejudica a legibilidade; • Aumenta a complexidade; • Possibilidade de introdução de bugs. PRINCÍPIOS DE DESIGN DE SOFTWARE Premature optimization is the root of all evil
  16. STUPID • Singleton • Tight Coupling • Untestability • Premature

    Optimization • Indescriptive Naming • Duplication • Abreviações; • Nomes não contextualizados; • Baixa legibilidade. PRINCÍPIOS DE DESIGN DE SOFTWARE fazABagacaToda($deonde = ‘comeco’);
  17. STUPID • Singleton • Tight Coupling • Untestability • Premature

    Optimization • Indescriptive Naming • Duplication • Mais tempo de manutenção; • Baixa corretude; • Contradições. PRINCÍPIOS DE DESIGN DE SOFTWARE Qual devo usar? Util::limpaTexto() ou Texto::limpa()?
  18. SOLID • Single Responsibility • Open/Closed • Liskov Substitution •

    Interface Segregation • Dependency Inversion PRINCÍPIOS DE DESIGN DE SOFTWARE Olha pai, é um videocassete com tv, ou uma tv com videocassete? • Classes, métodos e funções com uma única responsabilidade; • Cuidado com God Classes.
  19. SOLID • Single Responsibility • Open/Closed • Liskov Substitution •

    Interface Segregation • Dependency Inversion PRINCÍPIOS DE DESIGN DE SOFTWARE Software entities should be open for extension, but closed for modifications • Polimorfismo – Tipos concretos • Interfaces / Classes abstratas – Tipos abstratos https://en.wikipedia.org/wiki/Subtyping Pássaro Pato Cuco Avestruz
  20. Pássaro Pato Cuco Avestruz SOLID • Single Responsibility • Open/Closed

    • Liskov Substitution • Interface Segregation • Dependency Inversion PRINCÍPIOS DE DESIGN DE SOFTWARE Objetos podem ser substituídos por seus subtipos sem alterar a corretude do programa • Subtipo comportamental – Precondições; – Pós condições. https://en.wikipedia.org/wiki/Subtyping
  21. SOLID • Single Responsibility • Open/Closed • Liskov Substitution •

    Interface Segregation • Dependency Inversion PRINCÍPIOS DE DESIGN DE SOFTWARE Várias interfaces específicas são melhores que uma interface geral • Propósito bem definido; • Implemente apenas os métodos que irá utilizar; • Diminui a acoplagem; • Aumenta a coesão.
  22. SOLID • Single Responsibility • Open/Closed • Liskov Substitution •

    Interface Segregation • Dependency Inversion PRINCÍPIOS DE DESIGN DE SOFTWARE O que realmente importa é a necessidade, e não o comportamento • Módulos de níveis não devem apresentar dependência entre si, ambos devem depender de abstrações; • Abstrações não devem depender de detalhes; • Detalhes devem depender da abstração. https://en.wikipedia.org/wiki/Dependency_inversion_principle
  23. PADRÕES DE CODIFICAÇÃO A resposta da velha pergunta: “Coloco a

    chave na frente ou embaixo?” POTENCIALIZANDO A QUALIDADE DE CÓDIGO
  24. PADRÕES PHP-FIG POTENCIALIZANDO A QUALIDADE DE CÓDIGO PSR: PHP Standard

    Recommendation • PSR-1: Basic Code Standard • PSR-2: Coding Style Guide • PSR-3: Logger Interface • PSR-4: Autoloading Standard • PSR-6: Caching Interface • PSR-7: HTTP Message Interface
  25. PSR-1 & PSR-2 • Série de regras de formatação de

    código – Conteúdo de arquivos – Funções – Classes – Métodos – Namespaces – Visibilidade – Tamanho de linha – Endentação – Modificadores – Estruturas – ... PADRÕES PHP-FIG Base Code Standard & Coding Style Guide No more!
  26. PSR FORMATER Editor/IDE Suporte URL Netbeans Config https://github.com/bobsta 63/netbeans-psr- formatting

    Eclipse Nativo - PHPStorm Nativo - Sublime Config https://github.com/phpfmt /sublime-phpfmt Zend Studio Nativo/Config https://github.com/netojo aobatista/PSR-2
  27. PHPQA POTENCIALIZANDO A QUALIDADE DE CÓDIGO The PHP Quality Assurance

    Toolchain PHPUnit + vfsStream PHPLoc Behat PHP_Depend PHP Mess Detector PHP_CodeSniffer PHP Copy/Paste Detector PHPDox PHPMetrics
  28. PHP DEPEND • Métricas do código – Indicadores de qualidade

    – Refatoração QA TOOLS >> PHPQA https://pdepend.org/ Output é complicado e maçante
  29. PHP MESS DETECTOR • Bugs • Código subotimizado • Expressões

    supercomplicadas • Código não utilizado • Regras de design • Regras de nomenclatura QA TOOLS >> PHPQA https://phpmd.org/
  30. PHP_CODESNIFFER • Violação de regras de codificação – PHP –

    Javascript – CSS QA TOOLS >> PHPQA http://pear.php.net/PHP_CodeSniffer
  31. PHP COPY/PASTE DETECTOR • Duplicidade de código QA TOOLS >>

    PHPQA https://github.com/sebastianbergmann/phpcpd
  32. PHPDOX • Documentação de API • Info de fontes externas

    QA TOOLS >> PHPQA http://phpdox.de/ PHPUnit PHPMD PHPCS PHPDox PHPLOC GIT
  33. PHPMETRICS • Métricas de código – Indicadores de qualidade •

    Geração de relatórios – Qualidade – Complexidade – Manutenabilidade QA TOOLS >> PHPQA http://www.phpmetrics.org/
  34. INTEGRAÇÃO CONTÍNUA • Incorporação no build – Testes unitários –

    Documentação – Análise estática • Aumento legibilidade • Clareza – Helicopter view – Quality Gate – Technical debt QA TOOLS >> CI Colocando tudo no mesmo balaio e melhorando a legibilidade Jenkins PHPQA Sonar Qube
  35. PROFILING - Não otimize agora. - Ainda não! - Agora

    sim, vamos lá. - Mas antes disso, já rodou o profiler?
  36. PROFILE • Identificar bottlenecks • Otimização direcionada • Evita degradação

    de performance PROFILING Tio, e agora, já posso começar a otimizar meu código? http://weblogs.asp.net/craigshoemaker/asp-net-caching-and-performance
  37. XDEBUG + $VIEWER • Profile • Code coverage • Remote

    debugging • Function trace • Webgrind – https://github.com/jokkedk/webgrind • Xdebug trace explorer – https://github.com/corretge/xdebug-trace-gui • KCacheGrind – https://kcachegrind.github.io/html/Home.html PROFILING X-debug ao resgate Execução não recomendada em produção
  38. DICAS #1 • Comentários • Ler a documentação • Projetos

    open source • Responsabilidade única • Entender o que está fazendo • Utilizar frameworks
  39. DICAS #2 • Conhecer suas tools • Manter-se atualizado •

    Reuniões de nivelamento • Usar o bom senso • Pensar antes de codificar http://www.skorks.com/page/3/
  40. REFERÊNCIAS  http://principles-wiki.net/  https://en.wikipedia.org/wiki/KISS_principle  https://effectivesoftwaredesign.com/2013/02/07/on- developer-wisdom-and-software-quality-attributes/  www.cin.ufpe.br/~if718/referencias/qualidade.ppt

     http://www.artima.com/intv/dry.html  http://c2.com/cgi/wiki?DontRepeatYourself  http://seiti.eti.br/kiss-yagni-e-dry/  https://www.youtube.com/watch?v=LnPl04fYtcs  http://williamdurand.fr/2013/07/30/from-stupid-to- solid-code/  http://misko.hevery.com/2008/08/17/singletons-are- pathological-liars/  http://programmers.stackexchange.com/questions/403 73/so-singletons-are-bad-then-what  http://martinfowler.com/ieeeSoftware/coupling.pdf  https://sourcemaking.com/refactoring/smells  https://speakerdeck.com/miccheng/continuous- integration-for-php-with-jenkins-and-sonar  http://simpleprogrammer.com/2012/05/27/types- of-duplication-in-code/  http://c2.com/cgi/wiki  http://www.oodesign.com/liskov-s-substitution- principle.html  http://noviciateinitiate.blogspot.com.br/2014/01/t he-solid-principles-of-design-part-4.html  https://en.wikipedia.org/wiki/Dependency_inversio n_principle  http://aspiringcraftsman.com/2008/12/28/examini ng-dependency-inversion/  http://martinfowler.com/articles/dipInTheWild.html  https://www.42lines.net/2012/07/06/clean-code- reducing-wtfs-per-minute/  http://pt.slideshare.net/nethisip13/quality-control- 45498380  https://www.42lines.net/2012/07/06/clean-code- reducing-wtfs-per-minute/  http://erichogue.ca/2011/03/linux/profiling-a-php- application/ POTENCIALIZANDO A QUALIDADE DE CÓDIGO