2. Apresentação
Gabriel Felipe Soares <gabrielfs7@gmail.com>
Desenvolvedor PHP
Zend 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.
3. 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.
4. “Resolvo isso em 5
minutos!”
Primeiros dias de
trabalho...
“É simples. apenas
mais um if!”
“Basta criar uma
flag...”
5. “Não temos orçamento para os
testes… Pode liberar para produção
ainda hoje? É urgente!!”
7. “Assim já é o
suficiente. Vai
atender a nossa
necessidade atual…”
8. “É algo simples. Por
favor, adicione mais esta
condicional. O cliente
está me pressionando…”
9. Em 1982, James Q. Wilson e George L. Kelling escreveram um
famoso artigo chamado “Janelas Quebradas”
GUERREIRO.
O Bombeiro
10. - 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?
11. 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?
12. Algumas perguntas
Como 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?
14. 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++
15. 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”
16. 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.
● ...
17. 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.
18. Evite comentários
// Classe que representa a entidade Cliente
class Cliente
{
// Nome do cliente
private $name;
// Retorna o nome do cliente
public function getName()
19. Evite nomes sem sentido
class ServicoConta
{
public function addSl($ct, $v) {
$cl->setSl($cl->getSl() + $v);
}
20. Use nomes autoexplicativos
class ContabilizadorSaldo
{
public function adicionaSaldo(Conta $conta, $valor) {
$conta->setSaldo($conta->getSaldo() + $valor);
}
21. Evite classes métodos assim
class 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 for
if ($aceitaMeioPagamento) {
$pagamento = new Pagamento();
$pagemento->setConta($conta);
$pagemento->setLoja($conta);
$pagamento->setData($dataPagamento);
...
22. Distribua as responsabilidades
class 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);
...
23. Ferramentas que vão te ajudar...
- SOLID
- KISS
- DRY
- TDD (Ex: PHPUnit)
- Refactoring
- Design Patterns (Factory, DI)
25. 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).