Post on 13-Apr-2017
Maykel S. Brazhttp://about.me/maykelsantosbraz
POTENCIALIZANDO A QUALIDADE DE CÓDIGO
Padrões, princípios e ferramentas
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
O QUE É QUALIDADE?Ou, como ela é percebida, visualizada, e/ou medida?
POTENCIALIZANDO A QUALIDADE DE CÓDIGO
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
MAS O TRABALHO É TODO SEU
POTENCIALIZANDO A QUALIDADE DE CÓDIGO
Com grandes poderes, vêm grandes responsabilidades
freepik.com
COMO SE MEDE A QUALIDADE?
POTENCIALIZANDO A QUALIDADE DE CÓDIGO
Enquanto isso, na sala de review...
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
Extensibilidade(Extensibility)
Corretude(Correctness)
Reusabilidade(Reusability)
Manutenabilidade(Maintainability)
QUALIDADE
POTENCIALIZANDO A QUALIDADE DE CÓDIGO
Qualidade
PRINCÍPIOS DE DESIGN DE SOFTWARE
Diretrizes para se considerar ao / antes de codificar
POTENCIALIZANDO A QUALIDADE DE CÓDIGO
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 STUPIDDRY SOLID
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ãomais simples que o necessário.”
M REC
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 REC
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 REC
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
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
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
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
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
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’);
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()?
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.
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
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
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.
INTERFACE SEGREGATION
PRINCÍPIOS DE DESIGN DE SOFTWARE >> SOLID
INTERFACE SEGREGATION
PRINCÍPIOS DE DESIGN DE SOFTWARE >> SOLID
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
DEPENDENCY INVERSION
PRINCÍPIOS DE DESIGN DE SOFTWARE >> SOLID
DEPENDENCY INVERSION
PRINCÍPIOS DE DESIGN DE SOFTWARE >> SOLID
DEPENDENCY INVERSION
PADRÕES DE CODIFICAÇÃOA resposta da velha pergunta: “Coloco a chave na frente ou embaixo?”
POTENCIALIZANDO A QUALIDADE DE CÓDIGO
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
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!
PSR FORMATEREditor/IDE Suporte URL
Netbeans Config https://github.com/bobsta63/netbeans-psr-formattingEclipse Nativo -
PHPStorm Nativo -
Sublime Config https://github.com/phpfmt/sublime-phpfmt
Zend Studio Nativo/Config https://github.com/netojoaobatista/PSR-2
QA TOOLSGestão da qualidade
PHPQA
POTENCIALIZANDO A QUALIDADE DE CÓDIGO
The PHP Quality Assurance Toolchain
PHPUnit+
vfsStreamPHPLoc Behat
PHP_Depend
PHPMess Detector PHP_CodeSniffer
PHP Copy/PasteDetector
PHPDoxPHPMetrics
PHP DEPEND
• Métricas do código– Indicadores de qualidade– Refatoração
QA TOOLS >> PHPQA
https://pdepend.org/
Output é complicado e maçante
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/
PHP_CODESNIFFER
• Violação de regras de codificação– PHP– Javascript– CSS
QA TOOLS >> PHPQA
http://pear.php.net/PHP_CodeSniffer
PHP COPY/PASTE DETECTOR
• Duplicidade de código
QA TOOLS >> PHPQA
https://github.com/sebastianbergmann/phpcpd
PHPDOX
• Documentação de API• Info de fontes externas
QA TOOLS >> PHPQA
http://phpdox.de/
PHPUnit
PHPMD
PHPCS
PHPDox
PHPLOC
GIT
PHPDOX
QA TOOLS >> PHPQA
http://phpdox.de/
PHPDOX
QA TOOLS >> PHPQA
http://phpdox.de/
PHPMETRICS
• Métricas de código– Indicadores de qualidade
• Geração de relatórios– Qualidade– Complexidade– Manutenabilidade
QA TOOLS >> PHPQA
http://www.phpmetrics.org/
QA TOOLS >> PHPQA >> PHPMETRICS
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
SONAR QUBE
QA TOOLS
https://nemo.sonarqube.org/
SONAR QUBE
QA TOOLS
PROFILING
- Não otimize agora.- Ainda não!- Agora sim, vamos lá.- Mas antes disso, já rodou o profiler?
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
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
KCACHEGRIND
PROFILING >> XDEBUG
https://kcachegrind.github.io/html/Home.html
SYMFONY WEBDEBUG TOOLBAR
PROFILING
ZEND Z-RAY
PROFILING
LARAVEL DEBUGBAR
PROFILING
https://github.com/barryvdh/laravel-debugbar
DICAS GERAIS
DICAS #1
• Comentários• Ler a documentação• Projetos open source• Responsabilidade única• Entender o que está fazendo• Utilizar frameworks
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/
PERGUNTAS?
DC Comics
maykelsb@yahoo.com.br
about.me/maykelsantosbraz
Contato
REFERÊNCIAS http://principles-wiki.net/ https://en.wikipedia.org/wiki/KISS_principle https://effectivesoftwaredesign.com/2013/02/07/on-de
veloper-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-soli
d-code/
http://misko.hevery.com/2008/08/17/singletons-are-pathological-liars/
http://programmers.stackexchange.com/questions/40373/so-singletons-are-bad-then-what
http://martinfowler.com/ieeeSoftware/coupling.pdf https://sourcemaking.com/refactoring/smells https://speakerdeck.com/miccheng/continuous-integra
tion-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/th
e-solid-principles-of-design-part-4.html
https://en.wikipedia.org/wiki/Dependency_inversion_principle
http://aspiringcraftsman.com/2008/12/28/examining-dependency-inversion/
http://martinfowler.com/articles/dipInTheWild.html https://www.42lines.net/2012/07/06/clean-code-re
ducing-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