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
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
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

PDF
Removendo o cheiro ruim do seu código - SoLiSC 2011
PDF
Programação Orientada a Objetos - 001
PDF
Spring framework 2.5
PDF
(Re)pensando a OOP - TDC 2012
PDF
Java - Primeiros passos
PDF
Java primeiros-passos
KEY
Orientação a Objetos com PHP
ODP
Desenvolvendo aplicações web com python e web2py
Removendo o cheiro ruim do seu código - SoLiSC 2011
Programação Orientada a Objetos - 001
Spring framework 2.5
(Re)pensando a OOP - TDC 2012
Java - Primeiros passos
Java primeiros-passos
Orientação a Objetos com PHP
Desenvolvendo aplicações web com python e web2py

Mais procurados (20)

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

Semelhante a Removendo o cheiro ruim do seu código - PHPSC Conf 2011 (20)

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

Último (20)

PPTX
Legislação aeronautica na aviação civil Brasileira
PPT
Apresentacao Do Trabalho de Inteligencia
DOCX
Laboratório de cyber security, apresentação simples.
PDF
instalacoes eletricas para industria apressentacao basicas
PDF
Gestão contínua de exposição a ameaças petrobras
PPT
inteligencia_artificial REPRESENTAÇÃO DO CONHECECIMENTO
PPTX
Importacao_Ordem_Customizacao_SAP_S4HANA.pptx
PPT
01 - Arquitetura de Computadores 1 TEC [Salvo automaticamente].ppt
PPTX
RCSOFTdfsdfrvadfvdfvargfvevevrervevqer.pptx
PDF
T-pico 1.pdfnsjabdkaksbbsuendnijsbshajanzk
PDF
resumo de instalação de placa arduino em jardim vertical para fertirrigação
DOCX
20250828_Perfis Profissionais em ServiceNow Um Guia Detalhado.docx
PPTX
Politicas-de-Seguranca-Privacidade-e-Cookies.pptx
PPT
Padrões de Beleza I - Estética Corporal e Saúde
PPTX
AULA 1.pptx GESTÃO DE OPERAÇÕES INDUSTRIAIS
PPTX
Do código à carreira: O Profissional de TI que o mercado realmente quer - com...
PDF
wp-sn-advanced-high-availability-architecture (pt-br).pdf
PDF
Arquitetura de Software slides sommerville
PDF
POO - Aula 05 - Herança - Generalização e Especialização.pdf
PDF
Capacitação em Logística – Instituto Federal
Legislação aeronautica na aviação civil Brasileira
Apresentacao Do Trabalho de Inteligencia
Laboratório de cyber security, apresentação simples.
instalacoes eletricas para industria apressentacao basicas
Gestão contínua de exposição a ameaças petrobras
inteligencia_artificial REPRESENTAÇÃO DO CONHECECIMENTO
Importacao_Ordem_Customizacao_SAP_S4HANA.pptx
01 - Arquitetura de Computadores 1 TEC [Salvo automaticamente].ppt
RCSOFTdfsdfrvadfvdfvargfvevevrervevqer.pptx
T-pico 1.pdfnsjabdkaksbbsuendnijsbshajanzk
resumo de instalação de placa arduino em jardim vertical para fertirrigação
20250828_Perfis Profissionais em ServiceNow Um Guia Detalhado.docx
Politicas-de-Seguranca-Privacidade-e-Cookies.pptx
Padrões de Beleza I - Estética Corporal e Saúde
AULA 1.pptx GESTÃO DE OPERAÇÕES INDUSTRIAIS
Do código à carreira: O Profissional de TI que o mercado realmente quer - com...
wp-sn-advanced-high-availability-architecture (pt-br).pdf
Arquitetura de Software slides sommerville
POO - Aula 05 - Herança - Generalização e Especialização.pdf
Capacitação em Logística – Instituto Federal

Removendo o cheiro ruim do seu código - PHPSC Conf 2011

  • 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
  • 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