Removendo o cheiro ruim do seu código - SoLiSC 2011

Luís Cobucci
Luís CobucciSpeaker, Consultant and Senior PHP Developer at Usabilla
Removendo o cheiro ruim
      do seu código
     Luís Otávio Cobucci Oblonczyk



22 de Outubro de 2011
       6° SoLiSC
Luís Otávio Cobucci Oblonczyk
●
    Desenvolvedor PHP na Softnex Tecnologia
●
    Orientador no Senac TI
●
    Doido por PHP desde 2003
●
    Perfeccionista ao extremo =P



    @lcobucci
    http://about.me/lcobucci
Prepare-se
Você verá agora uma imagem
forte, porém real...




                             Ela representa o seu
                             código, sim você viu
                             direito, é o SEU código
                             aqui!
Removendo o cheiro ruim do seu código - SoLiSC 2011
Sim, essa é a real visão do seu código,
e só você não percebeu isso ainda
Sim, essa é a real visão do seu código,
e só você não percebeu isso ainda




                                          E não adianta querer
                                          colocar uma telinha
                                          bonitinha, porque lá
                                          no fundo você sabe
                                          como ele realmente é
Mas fique tranquilo, você tem
salvação (e seu código também)
Mas fique tranquilo, você tem
salvação (e seu código também)




                                 Se você não está convencido,
                                 vou argumentar um pouco
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
Verdadeiro programador
de código limpo
Porque apenas funcionar
não é suficiente!
Blz, como posso melhorar?
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
●
    A classe deve receber o nome do elemento que
    ela representa na vida real
Nomenclatura – Métodos
●
    Nomes dos 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
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(
            'div',
            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(
            'div',
            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('div', array($dividend, $divisor), $result);

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

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


Avalie essa palestra: http://joind.in/3948
1 of 46

Recommended

Removendo o cheiro ruim do seu código - PHPSC Conf 2011 by
Removendo o cheiro ruim do seu código - PHPSC Conf 2011Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011Luís Cobucci
440 views55 slides
Spring framework 2.5 by
Spring framework 2.5Spring framework 2.5
Spring framework 2.5Diego Pacheco
1.3K views37 slides
Java - Primeiros passos by
Java - Primeiros passosJava - Primeiros passos
Java - Primeiros passosProfessor José de Assis
788 views88 slides
(Re)pensando a OOP - TDC 2012 by
(Re)pensando a OOP - TDC 2012(Re)pensando a OOP - TDC 2012
(Re)pensando a OOP - TDC 2012Luís Cobucci
431 views52 slides
Curso de OO com C# - Parte 01 - Orientação a objetos by
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
11.1K views38 slides
Java primeiros-passos by
Java primeiros-passosJava primeiros-passos
Java primeiros-passosLeide Sayuri Ogasawara
297 views14 slides

More Related Content

What's hot

10 Boas Práticas de Programação by
10 Boas Práticas de Programação10 Boas Práticas de Programação
10 Boas Práticas de ProgramaçãoCarlos Schults
7.6K views25 slides
02 - Orientação a objetos e revisão de C# v1.5 by
02 - Orientação a objetos e revisão de C# v1.502 - Orientação a objetos e revisão de C# v1.5
02 - Orientação a objetos e revisão de C# v1.5César Augusto Pessôa
1K views37 slides
Curso Básico de Java - Aula 2 by
Curso Básico de Java - Aula 2Curso Básico de Java - Aula 2
Curso Básico de Java - Aula 2PeslPinguim
463 views10 slides
Programação Orientada a Objetos - 001 by
Programação Orientada a Objetos - 001Programação Orientada a Objetos - 001
Programação Orientada a Objetos - 001José Volmei Dal Prá Junior
942 views39 slides
04 - C# laços de repetição, vetores e matrizes v1.0 by
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
3.5K views28 slides
Clean Code by
Clean CodeClean Code
Clean CodeBruno Lui
11.3K views64 slides

What's hot(19)

10 Boas Práticas de Programação by Carlos Schults
10 Boas Práticas de Programação10 Boas Práticas de Programação
10 Boas Práticas de Programação
Carlos Schults7.6K views
Curso Básico de Java - Aula 2 by PeslPinguim
Curso Básico de Java - Aula 2Curso Básico de Java - Aula 2
Curso Básico de Java - Aula 2
PeslPinguim463 views
Clean Code by Bruno Lui
Clean CodeClean Code
Clean Code
Bruno Lui11.3K views
Java Primeiros Passos - Cap 7 by David Willian
Java Primeiros Passos - Cap 7Java Primeiros Passos - Cap 7
Java Primeiros Passos - Cap 7
David Willian261 views
Aprender Javascript e jQuery (UFCD by Afonso Gomes
Aprender Javascript e jQuery (UFCDAprender Javascript e jQuery (UFCD
Aprender Javascript e jQuery (UFCD
Afonso Gomes1.4K views
(Re)pensando a OOP - Flisol Gyn by Luís Cobucci
(Re)pensando a OOP - Flisol Gyn(Re)pensando a OOP - Flisol Gyn
(Re)pensando a OOP - Flisol Gyn
Luís Cobucci282 views
tmn - Introdução ao JavaScript by Claudio Gamboa
tmn - Introdução ao JavaScripttmn - Introdução ao JavaScript
tmn - Introdução ao JavaScript
Claudio Gamboa2.3K views
Java - Aula 2 - Orientado a Objetos by Moises Omena
Java - Aula 2 - Orientado a ObjetosJava - Aula 2 - Orientado a Objetos
Java - Aula 2 - Orientado a Objetos
Moises Omena2.3K views

Similar to Removendo o cheiro ruim do seu código - SoLiSC 2011

Antipatterns Javascript by
Antipatterns JavascriptAntipatterns Javascript
Antipatterns JavascriptAlcides Queiroz
639 views70 slides
Refatoração - aquela caprichada no código by
Refatoração - aquela caprichada no códigoRefatoração - aquela caprichada no código
Refatoração - aquela caprichada no códigoJuciellen Cabrera
179 views39 slides
Boas práticas no desenvolvimento de software by
Boas práticas no desenvolvimento de softwareBoas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareFelipe
859 views22 slides
Dependency injection WTF? - PHPSC Conference 2012 by
Dependency injection WTF? - PHPSC Conference 2012Dependency injection WTF? - PHPSC Conference 2012
Dependency injection WTF? - PHPSC Conference 2012Luís Cobucci
312 views20 slides
Desenvolvimento Agil Com Doctrine Orm by
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmGuilherme Blanco
10.7K views53 slides
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf... by
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
2.2K views44 slides

Similar to Removendo o cheiro ruim do seu código - SoLiSC 2011(20)

Refatoração - aquela caprichada no código by Juciellen Cabrera
Refatoração - aquela caprichada no códigoRefatoração - aquela caprichada no código
Refatoração - aquela caprichada no código
Juciellen Cabrera179 views
Boas práticas no desenvolvimento de software by Felipe
Boas práticas no desenvolvimento de softwareBoas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de software
Felipe 859 views
Dependency injection WTF? - PHPSC Conference 2012 by Luís Cobucci
Dependency injection WTF? - PHPSC Conference 2012Dependency injection WTF? - PHPSC Conference 2012
Dependency injection WTF? - PHPSC Conference 2012
Luís Cobucci312 views
Desenvolvimento Agil Com Doctrine Orm by Guilherme Blanco
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine Orm
Guilherme Blanco10.7K views
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf... by Pablo Dall'Oglio
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'Oglio2.2K views
Paradigmas de Programação - Imperativo, Orientado a Objetos e Funcional by Gustavo Coutinho
Paradigmas de Programação - Imperativo, Orientado a Objetos e FuncionalParadigmas de Programação - Imperativo, Orientado a Objetos e Funcional
Paradigmas de Programação - Imperativo, Orientado a Objetos e Funcional
Gustavo Coutinho10.5K views
Clean code @rogeriofontes-techfriday-everis by Rogerio Fontes
Clean code @rogeriofontes-techfriday-everisClean code @rogeriofontes-techfriday-everis
Clean code @rogeriofontes-techfriday-everis
Rogerio Fontes183 views

Removendo o cheiro ruim do seu código - SoLiSC 2011

  • 1. Removendo o cheiro ruim do seu código Luís Otávio Cobucci Oblonczyk 22 de Outubro de 2011 6° SoLiSC
  • 2. Luís Otávio Cobucci Oblonczyk ● Desenvolvedor PHP na Softnex Tecnologia ● Orientador no Senac TI ● Doido por PHP desde 2003 ● Perfeccionista ao extremo =P @lcobucci http://about.me/lcobucci
  • 4. Você verá agora uma imagem forte, porém real... Ela representa o seu código, sim você viu direito, é o SEU código aqui!
  • 6. Sim, essa é a real visão do seu código, e só você não percebeu isso ainda
  • 7. Sim, essa é a real visão do seu código, e só você não percebeu isso ainda E não adianta querer colocar uma telinha bonitinha, porque lá no fundo você sabe como ele realmente é
  • 8. Mas fique tranquilo, você tem salvação (e seu código também)
  • 9. Mas fique tranquilo, você tem salvação (e seu código também) Se você não está convencido, vou argumentar um pouco
  • 10. 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
  • 11. 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.
  • 13. 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
  • 16. Blz, como posso melhorar?
  • 18. 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
  • 19. Nomenclatura – Classes ● Nomes das classes devem ser substantivos, NUNCA verbos ● A classe deve receber o nome do elemento que ela representa na vida real
  • 20. Nomenclatura – Métodos ● Nomes dos devem SEMPRE conter verbos ● Caso programar em português, os verbos devem ser utilizados no modo imperativo (calculaJuros(), cancelaCompra(), ...)
  • 21. 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
  • 22. Criando métodos e funções
  • 23. 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!!
  • 25. 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)
  • 26. 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
  • 27. 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())
  • 28. 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!
  • 30. 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
  • 32. 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)
  • 34. 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!
  • 36. 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
  • 37. 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).
  • 38. 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)
  • 40. <?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; } }
  • 41. <?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; } }
  • 42. <?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( 'div', array($dividend, $divisor), $divisor == 0 ? false : $dividend / $divisor ); return $divisor == 0 ? false : $dividend / $divisor; } }
  • 43. <?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( 'div', array($dividend, $divisor), $dividend / $divisor ); return $dividend / $divisor; } }
  • 44. <?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('div', array($dividend, $divisor), $result); return $result; } }
  • 46. Obrigado! Eu por aí: http://about.me/lcobucci Slides: http://slideshare.net/lcobucci Avalie essa palestra: http://joind.in/3948