SlideShare uma empresa Scribd logo
1 de 55
Baixar para ler offline
Removendo o cheiro ruim
      do seu código
      Luís Otávio Cobucci Oblonczyk



19 de Novembro de 2011
PHPSC Conference 2011
Luís Otávio Cobucci Oblonczyk
●   Desenvolvedor PHP na Softnex Tecnologia
●   Orientador no Senac TI
●   Doido por PHP desde 2003
●   Perfeccionista ao extremo
●   Futuro PHP 5.3 ZCE? (teste em dezembro!)



    @lcobucci
    http://about.me/lcobucci
PHP
●
    Linguagem essencialmente server-side
●
    Enorme abrangência na web
●
    Inúmeras extensões
●
    Grande ponto forte: simples e fácil de
    aprender.
PHP – (possível) ponto fraco




    Simples e fácil de aprender
Primeiros passos dados
PHP – primeiros passos
●
    All-in-one script (tudo junto misturado: SQL,
    PHP, HTML, Javascript)
●
    “Não importa se o pato é macho, eu quero é o
    ovo... e pra ONTEM!”
●
    “Função? Claaaro: f(x) = 2x + 5”
●
    “Classe? Sim, sim... frequentei a escola”
●
    “Mensagem de erro do PHP é coisa de
    moleque!”
<?php
$con = @mysql_connect('localhost', 'root', '*****') or
die('Fuuuuuuuuu');
@mysql_select_db ('mydb', $con) or die('Fuuuuuuuuu');
?>
<html>
<head><title>Hello world</title></head>
<body>
<ul>
<?php
$query = @mysql_query('SELECT * FROM user', $con) or
die('Fuuuuuuuuu');
while ($user = @mysql_fetch_assoc($query)) {
?>
<li><?php echo $user['name']; ?></li>
<?php
}
?>
</ul>
</body>
</html>
Novas ideias são encontradas
PHP – novas ideias
●
    Reutilização movida à includes
●
    Variáveis globais diretas do inferno
●
    “register_globals? Deixa habilitado senão o
    sistema não funciona!”
●
    “Ahhhh tá, isso que são funções!”
<?php
$host = 'localhost';
$user = 'root';
$pass = '*****';
include 'db.php';
?>
<html>
<head><title>Hello world</title></head>
<body>
<ul>
<?php
$query = @mysql_query('SELECT * FROM user', $con) or
die('Fuuuuuuuuu');

while ($user = @mysql_fetch_assoc($query)) {
?>
<li><?php echo $user['name']; ?></li>
<?php
}
?>
</ul>
</body>
</html>
Estruturas diferentes, mesmo pensamento
PHP – estruturas diferentes,
mesmo pensamento
●
    “Ouvi que OOP é muito melhor, então agora
    vou escrever um monte de classes”
●
    Um bilhão de métodos estáticos
●
    Nível de abstração nas alturas
●
    Uso absurdo de Design Patterns de forma
    equivocada
Sim, pode ser a visão do seu código.
Preocupado?
Fique tranquilo, isso tem salvação
Vida do código ruim
●
    Nasce difícil de entender
●
    Cada manutenção gera uma (ou mais) falhas
●
    Baixa produtividade devido a confusão absurda
    existente
●
    Surgem novos colaboradores na esperança de
    que com mais gente tenha mais produtividade
●
    Pressão na equipe
●
    Mais falhas são criadas
Vida do código ruim
●   Equipe revoltada propõe solução: jogar tudo no lixo e
    começar novamente
●   Divisão da equipe, os melhores vão modelar o novo
    código enquanto os outros sofrem pra manter o
    antigo
●   Muito tempo se passa até que o novo entra no lugar
    do antigo, muitas pessoas não estão nem mais na
    empresa.
●   Os colaboradores atuais exigem refazer o sistema
    porque o código está uma porcaria novamente.
Alguém se identificou?
Mandamentos do código limpo
●
    Nunca terás ciúmes do código que você criar
●
    Não possuirás misericórdia para com código de
    seus colegas
●
    Matarás TODO e QUALQUER princípio de
    código sujo
Porque apenas funcionar
não é suficiente!
Blz, como posso melhorar?
Mudanças de conceitos
●
    Nem tudo que está no projeto é público
●
    Muitas vezes dentro de um projeto temos
    vários projetos
●
    Front-controllers são legais
●
    OOP não é a solução pra tudo, mas ajuda em
    várias ocasiões
●
    PHP 5.3 or die!
Iniciando a limpeza!
Escolha nomes decentes!
Nomenclatura
●
    Use nomes que possuem algum sentido
●
    Evite abreviações
●
    Evite passar informações incorretas
●
    Use nomes pronunciáveis
●
    Cuidado ao misturar idiomas
●
    Não dê dois (ou mais) sentidos para a mesma
    palavra
Nomenclatura – Classes
●
    Nomes das classes devem ser substantivos,
    NUNCA verbos (exceto para o design pattern
    Command, mas ele não conta mesmo =P)
●
    A classe deve receber o nome do elemento que
    ela representa na vida real
Nomenclatura – Métodos
●
    Nomes dos métodos devem SEMPRE conter
    verbos
●
    Caso programar em português, os verbos
    devem ser utilizados no modo imperativo
    (calculaJuros(), cancelaCompra(), ...)
Nomenclatura – Interfaces
●
    Interfaces adicionam comportamentos aos
    objetos, portanto normalmente são nomeadas
    como adjetivos (Clickable, Draggable,
    Resizeable, …) ou substantivos (Iterator,
    SplObserver, SplSubject)
●
    Não há absolutamente NENHUMA necessidade
    de colocar o prefixo “I” em uma interface
Criando métodos e funções
Métodos e funções
●
    Devem ser PEQUENOS (no máximo 20 linhas)
●
    Devem fazer apenas UMA tarefa
●
    Cuidado com a complexidade ciclomática dos
    métodos e funções (quantidade de caminhos
    possíveis na execução)
●
    Caso existam muitos parâmetros, considere
    agrupar os parâmetros com o mesmo contexto
    em um objeto
●
    NÃO REPITA CÓDIGO!!
Lidando com comentários
Comentários
●
    Comentários normalmente compensam um
    código mal feito
●
    Evite sempre o comentário que você pode
    substituir por uma variável ou método/função
    bem nomeada
    ●
        if ($item->getStatus() == 3)
Comentários
●
    Comentários normalmente compensam um
    código mal feito
●
    Evite sempre o comentário que você pode
    substituir por uma variável ou método/função
    bem nomeada
    ●
        if ($item->getStatus() == 3) // verifica se está
        cancelado
Comentários
●
    Comentários normalmente compensam um
    código mal feito
●
    Evite sempre o comentário que você pode
    substituir por uma variável ou método/função
    bem nomeada
    ●
        if ($item->getStatus() == 3) // verifica se está
        cancelado
    ●
        if ($item->estahCancelado())
Comentários
●
    Comentários após fechar chaves são ruídos
    desnecessários
●
    Código comentado é inútil, portanto deve ser
    exterminado da face da terra
●
    Sempre que sentir necessidade de comentar
    pode ter certeza que algo de errado não
    está certo!
Utilize coding standards
Code Style
●
    Unifica a forma que o código é escrito na
    empresa, assim TODOS entendem o código de
    forma prática e rápida
●
    Você deve escolher um padrão de formatação
    de código e combinar com a equipe TODA para
    adotar este padrão
●
    Nunca, never, ever, crie padrões... utilize um
    existente e seja feliz!
Gerenciando erros
Tratamento de erros
●
    Prefira exceptions do que retornar mensagens
    ou códigos de erros
●
    Crie as exceptions necessárias para o
    tratamento de erros das suas tarefas
●
    Evite tratar a classe base de exception
●
    O tratamento de exceptions é uma tarefa,
    portanto no método que tratá-las não deve
    haver nenhuma tarefa após o(s) catch(s)
Classes
Criando classes
●
    Classes devem ser PEQUENAS
●
    Mantenha os atributos encapsulados
●
    Classes devem possuir apenas UMA
    responsabilidade, ou seja deve estar inserida em
    somente um contexto
●
    Busque sempre a alta coesão, e
    consequentemente baixo acoplamento
●
    Utilize injeção de dependências
●
    Crie testes automatizados!
Refatoração é OBRIGAÇÃO!
Refatoração
“Refatoração (do inglês Refactoring) é o processo
de modificar um sistema de software para
melhorar a estrutura interna do código sem alterar
seu comportamento externo.
(…)
Outra consequência é a melhora no entendimento
do código, o que facilita a manutenção e evita a
inclusão de defeitos.”

http://pt.wikipedia.org/wiki/Refatora%C3%A7%C3%A3o
Refatoração
●
    Devem SEMPRE existir testes de unidade para
    podermos realizar uma refatoração correta
    (sem eles não temos como afirmar que o
    comportamento realmente não foi alterado).
Técnicas de refatoração
●
    Extração de método
●
    Extração de classe
●
    Extração de variável local
●
    Renomear classe/método/atributo
●
    Encapsular atributo
●
    Subir nível na hierarquia (para classe pai)
●
    Descer nível na hierarquia (para classe filha)
●
    Mover método/atributo (para outra classe)
Detonando TUDO!
<?php
namespace LcobucciUtilsMath;

use LcobucciUtilsLogFileLogger;

class Calculator
{
    private $logger;

    public function __construct()
    {
        $this->logger = new FileLogger();
    }

    public function div($x, $y)
    {
        $this->logger->log(
            'div',
            array($x, $y),
            $y == 0 ? false : $x / $y
        );

        return $y == 0 ? false : $x / $y;
    }
}
<?php
namespace LcobucciUtilsMath;
use LcobucciUtilsLogFileLogger;
class Calculator
{
    private $logger;
    public function __construct(FileLogger $logger)
    {
        $this->logger = $logger;
    }
    public function div($x, $y)
    {
        $this->logger->log(
            'div',
            array($x, $y),
            $y == 0 ? false : $x / $y
        );
        return $y == 0 ? false : $x / $y;
    }
}
<?php
namespace LcobucciUtilsMath;

use LcobucciUtilsLogFileLogger;

class Calculator
{
    private $logger;

    public function __construct(FileLogger $logger)
    {
        $this->logger = $logger;
    }

    public function divide($dividend, $divisor)
    {
        $this->logger->log(
            'divide',
            array($dividend, $divisor),
            $divisor == 0 ? false : $dividend / $divisor
        );

        return $divisor == 0 ? false : $dividend / $divisor;
    }
}
<?php
namespace LcobucciUtilsMath;

use LcobucciUtilsLogFileLogger;

class Calculator
{
    private $logger;
    public function __construct(FileLogger $logger)
    {
        $this->logger = $logger;
    }

    public function divide($dividend, $divisor)
    {
        if ($divisor == 0) {
            throw new InvalidArgumentException('Divisor can`t be ZERO');
        }
        $this->logger->log(
            'divide',
            array($dividend, $divisor),
            $dividend / $divisor
        );

        return $dividend / $divisor;
    }
}
<?php
namespace LcobucciUtilsMath;

use LcobucciUtilsLogFileLogger;
class Calculator
{
    private $logger;
    public function __construct(FileLogger $logger)
    {
        $this->logger = $logger;
    }

    public function divide($dividend, $divisor)
    {
        if ($divisor == 0) {
            throw new InvalidArgumentException('Divisor can`t be ZERO');
        }

        $result = $dividend / $divisor;
        $this->logger->log('divide', array($dividend, $divisor), $result);

        return $result;
    }
}
<?php
namespace LcobucciUtilsMath;

use LcobucciUtilsLogFileLogger;

class Calculator
{
    private $logger;

    public function __construct(FileLogger $logger)
    {
        $this->logger = $logger;
    }

    public function divide($dividend, $divisor)
    {
        if ($divisor == 0) {
            throw new InvalidArgumentException('Divisor can`t be ZERO');
        }

        $result = $dividend / $divisor;
        $this->logger->log('divide', func_get_args(), $result);

        return $result;
    }
}
<?php
namespace LcobucciUtilsMath;

use LcobucciUtilsLogFileLogger;

class Calculator
{
    private $logger;

    public function __construct(FileLogger $logger)
    {
        $this->logger = $logger;
    }

    public function divide($dividend, $divisor)
    {
        if ($divisor == 0) {
            throw new InvalidArgumentException('Divisor can`t be ZERO');
        }

        $result = $dividend / $divisor;
        $this->logger->log(__METHOD__, func_get_args(), $result);

        return $result;
    }
}
Dúvidas???
Obrigado!

Eu por aí: http://about.me/lcobucci
Slides: http://slideshare.net/lcobucci


Avalie essa palestra: http://joind.in/4500

Mais conteúdo relacionado

Mais procurados

De Zero à Web com Python e Django
De Zero à Web com Python e DjangoDe Zero à Web com Python e Django
De Zero à Web com Python e DjangoOsvaldo Santana Neto
 
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011Emerson Macedo
 
Curso Básico de Java - Aula 2
Curso Básico de Java - Aula 2Curso Básico de Java - Aula 2
Curso Básico de Java - Aula 2PeslPinguim
 
tmn - Introdução ao JavaScript
tmn - Introdução ao JavaScripttmn - Introdução ao JavaScript
tmn - Introdução ao JavaScriptClaudio Gamboa
 
Java Primeiros Passos - Cap 7
Java Primeiros Passos - Cap 7Java Primeiros Passos - Cap 7
Java Primeiros Passos - Cap 7David Willian
 
10 Boas Práticas de Programação
10 Boas Práticas de Programação10 Boas Práticas de Programação
10 Boas Práticas de ProgramaçãoCarlos Schults
 
5. Atribuições especiais; Arrays; Tipos de ciclos; Classes-pacote – Fundament...
5. Atribuições especiais; Arrays; Tipos de ciclos; Classes-pacote – Fundament...5. Atribuições especiais; Arrays; Tipos de ciclos; Classes-pacote – Fundament...
5. Atribuições especiais; Arrays; Tipos de ciclos; Classes-pacote – Fundament...Manuel Menezes de Sequeira
 
T10_LM3: Subalgoritmos/funções (2013-2014)
T10_LM3: Subalgoritmos/funções (2013-2014)T10_LM3: Subalgoritmos/funções (2013-2014)
T10_LM3: Subalgoritmos/funções (2013-2014)Carlos Santos
 
(Re)pensando a OOP - Flisol Gyn
(Re)pensando a OOP - Flisol Gyn(Re)pensando a OOP - Flisol Gyn
(Re)pensando a OOP - Flisol GynLuís Cobucci
 
04 - C# laços de repetição, vetores e matrizes v1.0
04 - C# laços de repetição, vetores e matrizes v1.004 - C# laços de repetição, vetores e matrizes v1.0
04 - C# laços de repetição, vetores e matrizes v1.0César Augusto Pessôa
 
14. Interfaces; Listas e cadeias ligadas; Iteradores – Fundamentos de Program...
14. Interfaces; Listas e cadeias ligadas; Iteradores – Fundamentos de Program...14. Interfaces; Listas e cadeias ligadas; Iteradores – Fundamentos de Program...
14. Interfaces; Listas e cadeias ligadas; Iteradores – Fundamentos de Program...Manuel Menezes de Sequeira
 
Curso Java Básico - Aula 01
Curso Java Básico - Aula 01Curso Java Básico - Aula 01
Curso Java Básico - Aula 01Natanael Fonseca
 
Testes unitários como ferramentas de design de código
Testes unitários como ferramentas de design de códigoTestes unitários como ferramentas de design de código
Testes unitários como ferramentas de design de códigoPaula Grangeiro
 
Uma Abordagem Prática de Orientação a Objetos com PHP (FLISOL DF 2011)
Uma Abordagem Prática de Orientação a Objetos com PHP (FLISOL DF 2011)Uma Abordagem Prática de Orientação a Objetos com PHP (FLISOL DF 2011)
Uma Abordagem Prática de Orientação a Objetos com PHP (FLISOL DF 2011)George Mendonça
 
PHP 5.3 - Classes e Objetos
PHP 5.3 - Classes e ObjetosPHP 5.3 - Classes e Objetos
PHP 5.3 - Classes e ObjetosGeorge Mendonça
 
Curso de OO com C# - Parte 01 - Orientação a objetos
Curso de OO com C# - Parte 01 - Orientação a objetosCurso de OO com C# - Parte 01 - Orientação a objetos
Curso de OO com C# - Parte 01 - Orientação a objetosLeonardo Melo Santos
 
4. Introdução à linguagem de programação Java – Fundamentos de Programação
4. Introdução à linguagem de programação Java – Fundamentos de Programação4. Introdução à linguagem de programação Java – Fundamentos de Programação
4. Introdução à linguagem de programação Java – Fundamentos de ProgramaçãoManuel Menezes de Sequeira
 

Mais procurados (20)

De Zero à Web com Python e Django
De Zero à Web com Python e DjangoDe Zero à Web com Python e Django
De Zero à Web com Python e Django
 
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
 
Curso Básico de Java - Aula 2
Curso Básico de Java - Aula 2Curso Básico de Java - Aula 2
Curso Básico de Java - Aula 2
 
POO - Aula 003
POO - Aula 003POO - Aula 003
POO - Aula 003
 
tmn - Introdução ao JavaScript
tmn - Introdução ao JavaScripttmn - Introdução ao JavaScript
tmn - Introdução ao JavaScript
 
Java Primeiros Passos - Cap 7
Java Primeiros Passos - Cap 7Java Primeiros Passos - Cap 7
Java Primeiros Passos - Cap 7
 
10 Boas Práticas de Programação
10 Boas Práticas de Programação10 Boas Práticas de Programação
10 Boas Práticas de Programação
 
5. Atribuições especiais; Arrays; Tipos de ciclos; Classes-pacote – Fundament...
5. Atribuições especiais; Arrays; Tipos de ciclos; Classes-pacote – Fundament...5. Atribuições especiais; Arrays; Tipos de ciclos; Classes-pacote – Fundament...
5. Atribuições especiais; Arrays; Tipos de ciclos; Classes-pacote – Fundament...
 
T10_LM3: Subalgoritmos/funções (2013-2014)
T10_LM3: Subalgoritmos/funções (2013-2014)T10_LM3: Subalgoritmos/funções (2013-2014)
T10_LM3: Subalgoritmos/funções (2013-2014)
 
(Re)pensando a OOP - Flisol Gyn
(Re)pensando a OOP - Flisol Gyn(Re)pensando a OOP - Flisol Gyn
(Re)pensando a OOP - Flisol Gyn
 
04 - C# laços de repetição, vetores e matrizes v1.0
04 - C# laços de repetição, vetores e matrizes v1.004 - C# laços de repetição, vetores e matrizes v1.0
04 - C# laços de repetição, vetores e matrizes v1.0
 
14. Interfaces; Listas e cadeias ligadas; Iteradores – Fundamentos de Program...
14. Interfaces; Listas e cadeias ligadas; Iteradores – Fundamentos de Program...14. Interfaces; Listas e cadeias ligadas; Iteradores – Fundamentos de Program...
14. Interfaces; Listas e cadeias ligadas; Iteradores – Fundamentos de Program...
 
Clean Code
Clean CodeClean Code
Clean Code
 
Clean code
Clean codeClean code
Clean code
 
Curso Java Básico - Aula 01
Curso Java Básico - Aula 01Curso Java Básico - Aula 01
Curso Java Básico - Aula 01
 
Testes unitários como ferramentas de design de código
Testes unitários como ferramentas de design de códigoTestes unitários como ferramentas de design de código
Testes unitários como ferramentas de design de código
 
Uma Abordagem Prática de Orientação a Objetos com PHP (FLISOL DF 2011)
Uma Abordagem Prática de Orientação a Objetos com PHP (FLISOL DF 2011)Uma Abordagem Prática de Orientação a Objetos com PHP (FLISOL DF 2011)
Uma Abordagem Prática de Orientação a Objetos com PHP (FLISOL DF 2011)
 
PHP 5.3 - Classes e Objetos
PHP 5.3 - Classes e ObjetosPHP 5.3 - Classes e Objetos
PHP 5.3 - Classes e Objetos
 
Curso de OO com C# - Parte 01 - Orientação a objetos
Curso de OO com C# - Parte 01 - Orientação a objetosCurso de OO com C# - Parte 01 - Orientação a objetos
Curso de OO com C# - Parte 01 - Orientação a objetos
 
4. Introdução à linguagem de programação Java – Fundamentos de Programação
4. Introdução à linguagem de programação Java – Fundamentos de Programação4. Introdução à linguagem de programação Java – Fundamentos de Programação
4. Introdução à linguagem de programação Java – Fundamentos de Programação
 

Semelhante a Removendo o cheiro ruim do seu código PHP

Boas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareBoas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareFelipe
 
Dependency injection WTF? - PHPSC Conference 2012
Dependency injection WTF? - PHPSC Conference 2012Dependency injection WTF? - PHPSC Conference 2012
Dependency injection WTF? - PHPSC Conference 2012Luís Cobucci
 
Refatoração - aquela caprichada no código
Refatoração - aquela caprichada no códigoRefatoração - aquela caprichada no código
Refatoração - aquela caprichada no códigoJuciellen Cabrera
 
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...Pablo Dall'Oglio
 
Serversidephp pptx2-120418140114-phpapp01
Serversidephp pptx2-120418140114-phpapp01Serversidephp pptx2-120418140114-phpapp01
Serversidephp pptx2-120418140114-phpapp01joaocarlobarros
 
Dicas para sua carreira de Desenvolvedor PHP
Dicas para sua carreira de Desenvolvedor PHPDicas para sua carreira de Desenvolvedor PHP
Dicas para sua carreira de Desenvolvedor PHPDouglas V. Pasqua
 
Qualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitQualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitDiego Tremper
 
TDC 2015 São Paulo - Clean Code para Testers
TDC 2015 São Paulo - Clean Code para TestersTDC 2015 São Paulo - Clean Code para Testers
TDC 2015 São Paulo - Clean Code para TestersStefan Teixeira
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAThiago Cifani
 
Uma implementação de suporte a
Uma implementação de suporte a Uma implementação de suporte a
Uma implementação de suporte a Rômulo Jales
 
Java introdução ao java
Java   introdução ao javaJava   introdução ao java
Java introdução ao javaArmando Daniel
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmGuilherme Blanco
 
Preparando-se para a prova da Certificação Zend PHP 5.3
Preparando-se para a prova da Certificação Zend PHP 5.3Preparando-se para a prova da Certificação Zend PHP 5.3
Preparando-se para a prova da Certificação Zend PHP 5.3klaussilveira
 
DevTalk Zoox 04/2016
DevTalk Zoox 04/2016DevTalk Zoox 04/2016
DevTalk Zoox 04/2016Leandro Silva
 

Semelhante a Removendo o cheiro ruim do seu código PHP (20)

Boas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareBoas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de software
 
Dependency injection WTF? - PHPSC Conference 2012
Dependency injection WTF? - PHPSC Conference 2012Dependency injection WTF? - PHPSC Conference 2012
Dependency injection WTF? - PHPSC Conference 2012
 
01-Paradigmas.pdf
01-Paradigmas.pdf01-Paradigmas.pdf
01-Paradigmas.pdf
 
Refatoração - aquela caprichada no código
Refatoração - aquela caprichada no códigoRefatoração - aquela caprichada no código
Refatoração - aquela caprichada no código
 
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
 
Serversidephp pptx2-120418140114-phpapp01
Serversidephp pptx2-120418140114-phpapp01Serversidephp pptx2-120418140114-phpapp01
Serversidephp pptx2-120418140114-phpapp01
 
Solid
SolidSolid
Solid
 
Dicas para sua carreira de Desenvolvedor PHP
Dicas para sua carreira de Desenvolvedor PHPDicas para sua carreira de Desenvolvedor PHP
Dicas para sua carreira de Desenvolvedor PHP
 
Qualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitQualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnit
 
TDC 2015 São Paulo - Clean Code para Testers
TDC 2015 São Paulo - Clean Code para TestersTDC 2015 São Paulo - Clean Code para Testers
TDC 2015 São Paulo - Clean Code para Testers
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVA
 
Design Patterns com PHP
Design Patterns com PHPDesign Patterns com PHP
Design Patterns com PHP
 
Programando php com excelência
Programando php com excelênciaProgramando php com excelência
Programando php com excelência
 
Uma implementação de suporte a
Uma implementação de suporte a Uma implementação de suporte a
Uma implementação de suporte a
 
Java introdução ao java
Java   introdução ao javaJava   introdução ao java
Java introdução ao java
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine Orm
 
Preparando-se para a prova da Certificação Zend PHP 5.3
Preparando-se para a prova da Certificação Zend PHP 5.3Preparando-se para a prova da Certificação Zend PHP 5.3
Preparando-se para a prova da Certificação Zend PHP 5.3
 
DevTalk Zoox 04/2016
DevTalk Zoox 04/2016DevTalk Zoox 04/2016
DevTalk Zoox 04/2016
 
PHP 5.3 - Funções
PHP 5.3 - FunçõesPHP 5.3 - Funções
PHP 5.3 - Funções
 
POG nunca mais - SOLISC
POG nunca mais - SOLISCPOG nunca mais - SOLISC
POG nunca mais - SOLISC
 

Removendo o cheiro ruim do seu código PHP

  • 1. Removendo o cheiro ruim do seu código Luís Otávio Cobucci Oblonczyk 19 de Novembro de 2011 PHPSC Conference 2011
  • 2. Luís Otávio Cobucci Oblonczyk ● Desenvolvedor PHP na Softnex Tecnologia ● Orientador no Senac TI ● Doido por PHP desde 2003 ● Perfeccionista ao extremo ● Futuro PHP 5.3 ZCE? (teste em dezembro!) @lcobucci http://about.me/lcobucci
  • 3. PHP ● Linguagem essencialmente server-side ● Enorme abrangência na web ● Inúmeras extensões ● Grande ponto forte: simples e fácil de aprender.
  • 4. PHP – (possível) ponto fraco Simples e fácil de aprender
  • 6. PHP – primeiros passos ● All-in-one script (tudo junto misturado: SQL, PHP, HTML, Javascript) ● “Não importa se o pato é macho, eu quero é o ovo... e pra ONTEM!” ● “Função? Claaaro: f(x) = 2x + 5” ● “Classe? Sim, sim... frequentei a escola” ● “Mensagem de erro do PHP é coisa de moleque!”
  • 7. <?php $con = @mysql_connect('localhost', 'root', '*****') or die('Fuuuuuuuuu'); @mysql_select_db ('mydb', $con) or die('Fuuuuuuuuu'); ?> <html> <head><title>Hello world</title></head> <body> <ul> <?php $query = @mysql_query('SELECT * FROM user', $con) or die('Fuuuuuuuuu'); while ($user = @mysql_fetch_assoc($query)) { ?> <li><?php echo $user['name']; ?></li> <?php } ?> </ul> </body> </html>
  • 8. Novas ideias são encontradas
  • 9. PHP – novas ideias ● Reutilização movida à includes ● Variáveis globais diretas do inferno ● “register_globals? Deixa habilitado senão o sistema não funciona!” ● “Ahhhh tá, isso que são funções!”
  • 10. <?php $host = 'localhost'; $user = 'root'; $pass = '*****'; include 'db.php'; ?> <html> <head><title>Hello world</title></head> <body> <ul> <?php $query = @mysql_query('SELECT * FROM user', $con) or die('Fuuuuuuuuu'); while ($user = @mysql_fetch_assoc($query)) { ?> <li><?php echo $user['name']; ?></li> <?php } ?> </ul> </body> </html>
  • 12. PHP – estruturas diferentes, mesmo pensamento ● “Ouvi que OOP é muito melhor, então agora vou escrever um monte de classes” ● Um bilhão de métodos estáticos ● Nível de abstração nas alturas ● Uso absurdo de Design Patterns de forma equivocada
  • 13.
  • 14. Sim, pode ser a visão do seu código. Preocupado?
  • 15. Fique tranquilo, isso tem salvação
  • 16. Vida do código ruim ● Nasce difícil de entender ● Cada manutenção gera uma (ou mais) falhas ● Baixa produtividade devido a confusão absurda existente ● Surgem novos colaboradores na esperança de que com mais gente tenha mais produtividade ● Pressão na equipe ● Mais falhas são criadas
  • 17. Vida do código ruim ● Equipe revoltada propõe solução: jogar tudo no lixo e começar novamente ● Divisão da equipe, os melhores vão modelar o novo código enquanto os outros sofrem pra manter o antigo ● Muito tempo se passa até que o novo entra no lugar do antigo, muitas pessoas não estão nem mais na empresa. ● Os colaboradores atuais exigem refazer o sistema porque o código está uma porcaria novamente.
  • 19. Mandamentos do código limpo ● Nunca terás ciúmes do código que você criar ● Não possuirás misericórdia para com código de seus colegas ● Matarás TODO e QUALQUER princípio de código sujo
  • 21. Blz, como posso melhorar?
  • 22. Mudanças de conceitos ● Nem tudo que está no projeto é público ● Muitas vezes dentro de um projeto temos vários projetos ● Front-controllers são legais ● OOP não é a solução pra tudo, mas ajuda em várias ocasiões ● PHP 5.3 or die!
  • 25. Nomenclatura ● Use nomes que possuem algum sentido ● Evite abreviações ● Evite passar informações incorretas ● Use nomes pronunciáveis ● Cuidado ao misturar idiomas ● Não dê dois (ou mais) sentidos para a mesma palavra
  • 26. Nomenclatura – Classes ● Nomes das classes devem ser substantivos, NUNCA verbos (exceto para o design pattern Command, mas ele não conta mesmo =P) ● A classe deve receber o nome do elemento que ela representa na vida real
  • 27. Nomenclatura – Métodos ● Nomes dos métodos devem SEMPRE conter verbos ● Caso programar em português, os verbos devem ser utilizados no modo imperativo (calculaJuros(), cancelaCompra(), ...)
  • 28. Nomenclatura – Interfaces ● Interfaces adicionam comportamentos aos objetos, portanto normalmente são nomeadas como adjetivos (Clickable, Draggable, Resizeable, …) ou substantivos (Iterator, SplObserver, SplSubject) ● Não há absolutamente NENHUMA necessidade de colocar o prefixo “I” em uma interface
  • 29. Criando métodos e funções
  • 30. Métodos e funções ● Devem ser PEQUENOS (no máximo 20 linhas) ● Devem fazer apenas UMA tarefa ● Cuidado com a complexidade ciclomática dos métodos e funções (quantidade de caminhos possíveis na execução) ● Caso existam muitos parâmetros, considere agrupar os parâmetros com o mesmo contexto em um objeto ● NÃO REPITA CÓDIGO!!
  • 32. Comentários ● Comentários normalmente compensam um código mal feito ● Evite sempre o comentário que você pode substituir por uma variável ou método/função bem nomeada ● if ($item->getStatus() == 3)
  • 33. Comentários ● Comentários normalmente compensam um código mal feito ● Evite sempre o comentário que você pode substituir por uma variável ou método/função bem nomeada ● if ($item->getStatus() == 3) // verifica se está cancelado
  • 34. Comentários ● Comentários normalmente compensam um código mal feito ● Evite sempre o comentário que você pode substituir por uma variável ou método/função bem nomeada ● if ($item->getStatus() == 3) // verifica se está cancelado ● if ($item->estahCancelado())
  • 35. Comentários ● Comentários após fechar chaves são ruídos desnecessários ● Código comentado é inútil, portanto deve ser exterminado da face da terra ● Sempre que sentir necessidade de comentar pode ter certeza que algo de errado não está certo!
  • 37. Code Style ● Unifica a forma que o código é escrito na empresa, assim TODOS entendem o código de forma prática e rápida ● Você deve escolher um padrão de formatação de código e combinar com a equipe TODA para adotar este padrão ● Nunca, never, ever, crie padrões... utilize um existente e seja feliz!
  • 39. Tratamento de erros ● Prefira exceptions do que retornar mensagens ou códigos de erros ● Crie as exceptions necessárias para o tratamento de erros das suas tarefas ● Evite tratar a classe base de exception ● O tratamento de exceptions é uma tarefa, portanto no método que tratá-las não deve haver nenhuma tarefa após o(s) catch(s)
  • 41. Criando classes ● Classes devem ser PEQUENAS ● Mantenha os atributos encapsulados ● Classes devem possuir apenas UMA responsabilidade, ou seja deve estar inserida em somente um contexto ● Busque sempre a alta coesão, e consequentemente baixo acoplamento ● Utilize injeção de dependências ● Crie testes automatizados!
  • 43. Refatoração “Refatoração (do inglês Refactoring) é o processo de modificar um sistema de software para melhorar a estrutura interna do código sem alterar seu comportamento externo. (…) Outra consequência é a melhora no entendimento do código, o que facilita a manutenção e evita a inclusão de defeitos.” http://pt.wikipedia.org/wiki/Refatora%C3%A7%C3%A3o
  • 44. Refatoração ● Devem SEMPRE existir testes de unidade para podermos realizar uma refatoração correta (sem eles não temos como afirmar que o comportamento realmente não foi alterado).
  • 45. Técnicas de refatoração ● Extração de método ● Extração de classe ● Extração de variável local ● Renomear classe/método/atributo ● Encapsular atributo ● Subir nível na hierarquia (para classe pai) ● Descer nível na hierarquia (para classe filha) ● Mover método/atributo (para outra classe)
  • 47. <?php namespace LcobucciUtilsMath; use LcobucciUtilsLogFileLogger; class Calculator { private $logger; public function __construct() { $this->logger = new FileLogger(); } public function div($x, $y) { $this->logger->log( 'div', array($x, $y), $y == 0 ? false : $x / $y ); return $y == 0 ? false : $x / $y; } }
  • 48. <?php namespace LcobucciUtilsMath; use LcobucciUtilsLogFileLogger; class Calculator { private $logger; public function __construct(FileLogger $logger) { $this->logger = $logger; } public function div($x, $y) { $this->logger->log( 'div', array($x, $y), $y == 0 ? false : $x / $y ); return $y == 0 ? false : $x / $y; } }
  • 49. <?php namespace LcobucciUtilsMath; use LcobucciUtilsLogFileLogger; class Calculator { private $logger; public function __construct(FileLogger $logger) { $this->logger = $logger; } public function divide($dividend, $divisor) { $this->logger->log( 'divide', array($dividend, $divisor), $divisor == 0 ? false : $dividend / $divisor ); return $divisor == 0 ? false : $dividend / $divisor; } }
  • 50. <?php namespace LcobucciUtilsMath; use LcobucciUtilsLogFileLogger; class Calculator { private $logger; public function __construct(FileLogger $logger) { $this->logger = $logger; } public function divide($dividend, $divisor) { if ($divisor == 0) { throw new InvalidArgumentException('Divisor can`t be ZERO'); } $this->logger->log( 'divide', array($dividend, $divisor), $dividend / $divisor ); return $dividend / $divisor; } }
  • 51. <?php namespace LcobucciUtilsMath; use LcobucciUtilsLogFileLogger; class Calculator { private $logger; public function __construct(FileLogger $logger) { $this->logger = $logger; } public function divide($dividend, $divisor) { if ($divisor == 0) { throw new InvalidArgumentException('Divisor can`t be ZERO'); } $result = $dividend / $divisor; $this->logger->log('divide', array($dividend, $divisor), $result); return $result; } }
  • 52. <?php namespace LcobucciUtilsMath; use LcobucciUtilsLogFileLogger; class Calculator { private $logger; public function __construct(FileLogger $logger) { $this->logger = $logger; } public function divide($dividend, $divisor) { if ($divisor == 0) { throw new InvalidArgumentException('Divisor can`t be ZERO'); } $result = $dividend / $divisor; $this->logger->log('divide', func_get_args(), $result); return $result; } }
  • 53. <?php namespace LcobucciUtilsMath; use LcobucciUtilsLogFileLogger; class Calculator { private $logger; public function __construct(FileLogger $logger) { $this->logger = $logger; } public function divide($dividend, $divisor) { if ($divisor == 0) { throw new InvalidArgumentException('Divisor can`t be ZERO'); } $result = $dividend / $divisor; $this->logger->log(__METHOD__, func_get_args(), $result); return $result; } }
  • 55. Obrigado! Eu por aí: http://about.me/lcobucci Slides: http://slideshare.net/lcobucci Avalie essa palestra: http://joind.in/4500