potencializando a qualidade de código
TRANSCRIPT
![Page 1: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/1.jpg)
Maykel S. Brazhttp://about.me/maykelsantosbraz
POTENCIALIZANDO A QUALIDADE DE CÓDIGO
Padrões, princípios e ferramentas
![Page 2: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/2.jpg)
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
![Page 3: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/3.jpg)
O QUE É QUALIDADE?Ou, como ela é percebida, visualizada, e/ou medida?
POTENCIALIZANDO A QUALIDADE DE CÓDIGO
![Page 4: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/4.jpg)
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
![Page 5: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/5.jpg)
MAS O TRABALHO É TODO SEU
POTENCIALIZANDO A QUALIDADE DE CÓDIGO
Com grandes poderes, vêm grandes responsabilidades
freepik.com
![Page 6: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/6.jpg)
COMO SE MEDE A QUALIDADE?
POTENCIALIZANDO A QUALIDADE DE CÓDIGO
Enquanto isso, na sala de review...
![Page 7: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/7.jpg)
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
![Page 8: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/8.jpg)
Extensibilidade(Extensibility)
Corretude(Correctness)
Reusabilidade(Reusability)
Manutenabilidade(Maintainability)
QUALIDADE
POTENCIALIZANDO A QUALIDADE DE CÓDIGO
Qualidade
![Page 9: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/9.jpg)
PRINCÍPIOS DE DESIGN DE SOFTWARE
Diretrizes para se considerar ao / antes de codificar
POTENCIALIZANDO A QUALIDADE DE CÓDIGO
![Page 10: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/10.jpg)
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
![Page 11: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/11.jpg)
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
![Page 12: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/12.jpg)
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
![Page 13: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/13.jpg)
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
![Page 14: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/14.jpg)
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
![Page 15: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/15.jpg)
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
![Page 16: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/16.jpg)
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
![Page 17: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/17.jpg)
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
![Page 18: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/18.jpg)
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
![Page 19: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/19.jpg)
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’);
![Page 20: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/20.jpg)
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()?
![Page 21: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/21.jpg)
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.
![Page 22: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/22.jpg)
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
![Page 23: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/23.jpg)
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
![Page 24: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/24.jpg)
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.
![Page 25: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/25.jpg)
INTERFACE SEGREGATION
PRINCÍPIOS DE DESIGN DE SOFTWARE >> SOLID
![Page 26: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/26.jpg)
INTERFACE SEGREGATION
PRINCÍPIOS DE DESIGN DE SOFTWARE >> SOLID
![Page 27: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/27.jpg)
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
![Page 28: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/28.jpg)
DEPENDENCY INVERSION
PRINCÍPIOS DE DESIGN DE SOFTWARE >> SOLID
![Page 29: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/29.jpg)
DEPENDENCY INVERSION
PRINCÍPIOS DE DESIGN DE SOFTWARE >> SOLID
![Page 30: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/30.jpg)
DEPENDENCY INVERSION
![Page 31: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/31.jpg)
PADRÕES DE CODIFICAÇÃOA resposta da velha pergunta: “Coloco a chave na frente ou embaixo?”
POTENCIALIZANDO A QUALIDADE DE CÓDIGO
![Page 32: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/32.jpg)
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
![Page 33: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/33.jpg)
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!
![Page 34: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/34.jpg)
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
![Page 35: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/35.jpg)
QA TOOLSGestão da qualidade
![Page 36: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/36.jpg)
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
![Page 37: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/37.jpg)
PHP DEPEND
• Métricas do código– Indicadores de qualidade– Refatoração
QA TOOLS >> PHPQA
https://pdepend.org/
Output é complicado e maçante
![Page 38: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/38.jpg)
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/
![Page 39: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/39.jpg)
PHP_CODESNIFFER
• Violação de regras de codificação– PHP– Javascript– CSS
QA TOOLS >> PHPQA
http://pear.php.net/PHP_CodeSniffer
![Page 40: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/40.jpg)
PHP COPY/PASTE DETECTOR
• Duplicidade de código
QA TOOLS >> PHPQA
https://github.com/sebastianbergmann/phpcpd
![Page 41: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/41.jpg)
PHPDOX
• Documentação de API• Info de fontes externas
QA TOOLS >> PHPQA
http://phpdox.de/
PHPUnit
PHPMD
PHPCS
PHPDox
PHPLOC
GIT
![Page 42: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/42.jpg)
PHPDOX
QA TOOLS >> PHPQA
http://phpdox.de/
![Page 43: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/43.jpg)
PHPDOX
QA TOOLS >> PHPQA
http://phpdox.de/
![Page 44: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/44.jpg)
PHPMETRICS
• Métricas de código– Indicadores de qualidade
• Geração de relatórios– Qualidade– Complexidade– Manutenabilidade
QA TOOLS >> PHPQA
http://www.phpmetrics.org/
![Page 45: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/45.jpg)
QA TOOLS >> PHPQA >> PHPMETRICS
![Page 46: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/46.jpg)
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
![Page 47: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/47.jpg)
SONAR QUBE
QA TOOLS
https://nemo.sonarqube.org/
![Page 48: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/48.jpg)
SONAR QUBE
QA TOOLS
![Page 49: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/49.jpg)
PROFILING
- Não otimize agora.- Ainda não!- Agora sim, vamos lá.- Mas antes disso, já rodou o profiler?
![Page 50: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/50.jpg)
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
![Page 51: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/51.jpg)
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
![Page 52: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/52.jpg)
KCACHEGRIND
PROFILING >> XDEBUG
https://kcachegrind.github.io/html/Home.html
![Page 53: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/53.jpg)
SYMFONY WEBDEBUG TOOLBAR
PROFILING
![Page 54: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/54.jpg)
ZEND Z-RAY
PROFILING
![Page 55: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/55.jpg)
LARAVEL DEBUGBAR
PROFILING
https://github.com/barryvdh/laravel-debugbar
![Page 56: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/56.jpg)
DICAS GERAIS
![Page 57: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/57.jpg)
DICAS #1
• Comentários• Ler a documentação• Projetos open source• Responsabilidade única• Entender o que está fazendo• Utilizar frameworks
![Page 58: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/58.jpg)
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/
![Page 60: Potencializando a qualidade de código](https://reader036.vdocuments.site/reader036/viewer/2022062412/58ef95081a28ab98028b45e1/html5/thumbnails/60.jpg)
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