Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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.

9336e07ed3f73f9c6a0c7dba66da3abd?s=128

Maykel Santos Braz

March 19, 2016
Tweet

Transcript

  1. Maykel S. Braz http://about.me/maykelsantosbraz POTENCIALIZANDO A QUALIDADE DE CÓDIGO Padrões,

    princípios e ferramentas
  2. 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
  3. O QUE É QUALIDADE? Ou, como ela é percebida, visualizada,

    e/ou medida? POTENCIALIZANDO A QUALIDADE DE CÓDIGO
  4. 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
  5. MAS O TRABALHO É TODO SEU POTENCIALIZANDO A QUALIDADE DE

    CÓDIGO Com grandes poderes, vêm grandes responsabilidades freepik.com
  6. COMO SE MEDE A QUALIDADE? POTENCIALIZANDO A QUALIDADE DE CÓDIGO

    Enquanto isso, na sala de review...
  7. 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
  8. Extensibilidade (Extensibility) Corretude (Correctness) Reusabilidade (Reusability) Manutenabilidade (Maintainability) QUALIDADE POTENCIALIZANDO

    A QUALIDADE DE CÓDIGO Qualidade
  9. PRINCÍPIOS DE DESIGN DE SOFTWARE Diretrizes para se considerar ao

    / antes de codificar POTENCIALIZANDO A QUALIDADE DE CÓDIGO
  10. 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
  11. 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
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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
  17. 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
  18. 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
  19. 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’);
  20. 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()?
  21. 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.
  22. 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
  23. 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
  24. 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.
  25. INTERFACE SEGREGATION PRINCÍPIOS DE DESIGN DE SOFTWARE >> SOLID

  26. INTERFACE SEGREGATION PRINCÍPIOS DE DESIGN DE SOFTWARE >> SOLID

  27. 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
  28. DEPENDENCY INVERSION PRINCÍPIOS DE DESIGN DE SOFTWARE >> SOLID

  29. DEPENDENCY INVERSION PRINCÍPIOS DE DESIGN DE SOFTWARE >> SOLID

  30. DEPENDENCY INVERSION

  31. PADRÕES DE CODIFICAÇÃO A resposta da velha pergunta: “Coloco a

    chave na frente ou embaixo?” POTENCIALIZANDO A QUALIDADE DE CÓDIGO
  32. 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
  33. 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!
  34. 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
  35. QA TOOLS Gestão da qualidade

  36. 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
  37. PHP DEPEND • Métricas do código – Indicadores de qualidade

    – Refatoração QA TOOLS >> PHPQA https://pdepend.org/ Output é complicado e maçante
  38. 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/
  39. PHP_CODESNIFFER • Violação de regras de codificação – PHP –

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

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

    QA TOOLS >> PHPQA http://phpdox.de/ PHPUnit PHPMD PHPCS PHPDox PHPLOC GIT
  42. PHPDOX QA TOOLS >> PHPQA http://phpdox.de/

  43. PHPDOX QA TOOLS >> PHPQA http://phpdox.de/

  44. PHPMETRICS • Métricas de código – Indicadores de qualidade •

    Geração de relatórios – Qualidade – Complexidade – Manutenabilidade QA TOOLS >> PHPQA http://www.phpmetrics.org/
  45. QA TOOLS >> PHPQA >> PHPMETRICS

  46. 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
  47. SONAR QUBE QA TOOLS https://nemo.sonarqube.org/

  48. SONAR QUBE QA TOOLS

  49. PROFILING - Não otimize agora. - Ainda não! - Agora

    sim, vamos lá. - Mas antes disso, já rodou o profiler?
  50. 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
  51. 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
  52. KCACHEGRIND PROFILING >> XDEBUG https://kcachegrind.github.io/html/Home.html

  53. SYMFONY WEBDEBUG TOOLBAR PROFILING

  54. ZEND Z-RAY PROFILING

  55. LARAVEL DEBUGBAR PROFILING https://github.com/barryvdh/laravel-debugbar

  56. DICAS GERAIS

  57. DICAS #1 • Comentários • Ler a documentação • Projetos

    open source • Responsabilidade única • Entender o que está fazendo • Utilizar frameworks
  58. 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/
  59. PERGUNTAS? DC Comics maykelsb@yahoo.com.br about.me/maykelsantosbraz Contato

  60. 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