Removendo o cheiro ruim      do seu código      Luís Otávio Cobucci Oblonczyk19 de Novembro de 2011PHPSC Conference 2011
Luís Otávio Cobucci Oblonczyk●   Desenvolvedor PHP na Softnex Tecnologia●   Orientador no Senac TI●   Doido por PHP desde ...
PHP●    Linguagem essencialmente server-side●    Enorme abrangência na web●    Inúmeras extensões●    Grande ponto forte: ...
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 p...
<?php$con = @mysql_connect(localhost, root, *****) ordie(Fuuuuuuuuu);@mysql_select_db (mydb, $con) or die(Fuuuuuuuuu);?><h...
Novas ideias são encontradas
PHP – novas ideias●    Reutilização movida à includes●    Variáveis globais diretas do inferno●    “register_globals? Deix...
<?php$host = localhost;$user = root;$pass = *****;include db.php;?><html><head><title>Hello world</title></head><body><ul>...
Estruturas diferentes, mesmo pensamento
PHP – estruturas diferentes,mesmo pensamento●    “Ouvi que OOP é muito melhor, então agora    vou escrever um monte de cla...
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 de...
Vida do código ruim●   Equipe revoltada propõe solução: jogar tudo no lixo e    começar novamente●   Divisão da equipe, os...
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...
Porque apenas funcionarnã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 pro...
Iniciando a limpeza!
Escolha nomes decentes!
Nomenclatura●    Use nomes que possuem algum sentido●    Evite abreviações●    Evite passar informações incorretas●    Use...
Nomenclatura – Classes●    Nomes das classes devem ser substantivos,    NUNCA verbos (exceto para o design pattern    Comm...
Nomenclatura – Métodos●    Nomes dos métodos devem SEMPRE conter    verbos●    Caso programar em português, os verbos    d...
Nomenclatura – Interfaces●    Interfaces adicionam comportamentos aos    objetos, portanto normalmente são nomeadas    com...
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 complex...
Lidando com comentários
Comentários●    Comentários normalmente compensam um    código mal feito●    Evite sempre o comentário que você pode    su...
Comentários●    Comentários normalmente compensam um    código mal feito●    Evite sempre o comentário que você pode    su...
Comentários●    Comentários normalmente compensam um    código mal feito●    Evite sempre o comentário que você pode    su...
Comentários●    Comentários após fechar chaves são ruídos    desnecessários●    Código comentado é inútil, portanto deve s...
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...
Gerenciando erros
Tratamento de erros●    Prefira exceptions do que retornar mensagens    ou códigos de erros●    Crie as exceptions necessá...
Classes
Criando classes●    Classes devem ser PEQUENAS●    Mantenha os atributos encapsulados●    Classes devem possuir apenas UMA...
Refatoração é OBRIGAÇÃO!
Refatoração“Refatoração (do inglês Refactoring) é o processode modificar um sistema de software paramelhorar a estrutura i...
Refatoração●    Devem SEMPRE existir testes de unidade para    podermos realizar uma refatoração correta    (sem eles não ...
Técnicas de refatoração●    Extração de método●    Extração de classe●    Extração de variável local●    Renomear classe/m...
Detonando TUDO!
<?phpnamespace LcobucciUtilsMath;use LcobucciUtilsLogFileLogger;class Calculator{    private $logger;    public function _...
<?phpnamespace LcobucciUtilsMath;use LcobucciUtilsLogFileLogger;class Calculator{    private $logger;    public function _...
<?phpnamespace LcobucciUtilsMath;use LcobucciUtilsLogFileLogger;class Calculator{    private $logger;    public function _...
<?phpnamespace LcobucciUtilsMath;use LcobucciUtilsLogFileLogger;class Calculator{    private $logger;    public function _...
<?phpnamespace LcobucciUtilsMath;use LcobucciUtilsLogFileLogger;class Calculator{    private $logger;    public function _...
<?phpnamespace LcobucciUtilsMath;use LcobucciUtilsLogFileLogger;class Calculator{    private $logger;    public function _...
<?phpnamespace LcobucciUtilsMath;use LcobucciUtilsLogFileLogger;class Calculator{    private $logger;    public function _...
Dúvidas???
Obrigado!Eu por aí: http://about.me/lcobucciSlides: http://slideshare.net/lcobucciAvalie essa palestra: http://joind.in/4500
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Próximos SlideShares
Carregando em…5
×

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

762 visualizações

Publicada em

Sabe aquele arquivo com 5000000 linhas e que você tem que acender umas velas pra abrir ele? Então, aqui te daremos as armas corretas para exterminá-lo e para NUNCA MAIS criar monstros como ele!

Publicada em: Tecnologia
0 comentários
1 gostou
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
762
No SlideShare
0
A partir de incorporações
0
Número de incorporações
16
Ações
Compartilhamentos
0
Downloads
15
Comentários
0
Gostaram
1
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

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

  1. 1. Removendo o cheiro ruim do seu código Luís Otávio Cobucci Oblonczyk19 de Novembro de 2011PHPSC Conference 2011
  2. 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. 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. 4. PHP – (possível) ponto fraco Simples e fácil de aprender
  5. 5. Primeiros passos dados
  6. 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. 7. <?php$con = @mysql_connect(localhost, root, *****) ordie(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) ordie(Fuuuuuuuuu);while ($user = @mysql_fetch_assoc($query)) {?><li><?php echo $user[name]; ?></li><?php}?></ul></body></html>
  8. 8. Novas ideias são encontradas
  9. 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. 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) ordie(Fuuuuuuuuu);while ($user = @mysql_fetch_assoc($query)) {?><li><?php echo $user[name]; ?></li><?php}?></ul></body></html>
  11. 11. Estruturas diferentes, mesmo pensamento
  12. 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. 13. Sim, pode ser a visão do seu código.Preocupado?
  14. 14. Fique tranquilo, isso tem salvação
  15. 15. 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
  16. 16. 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.
  17. 17. Alguém se identificou?
  18. 18. 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
  19. 19. Porque apenas funcionarnão é suficiente!
  20. 20. Blz, como posso melhorar?
  21. 21. 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!
  22. 22. Iniciando a limpeza!
  23. 23. Escolha nomes decentes!
  24. 24. 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
  25. 25. 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
  26. 26. 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(), ...)
  27. 27. 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
  28. 28. Criando métodos e funções
  29. 29. 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!!
  30. 30. Lidando com comentários
  31. 31. 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)
  32. 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) // verifica se está cancelado
  33. 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 ● if ($item->estahCancelado())
  34. 34. 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!
  35. 35. Utilize coding standards
  36. 36. 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!
  37. 37. Gerenciando erros
  38. 38. 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)
  39. 39. Classes
  40. 40. 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!
  41. 41. Refatoração é OBRIGAÇÃO!
  42. 42. Refatoração“Refatoração (do inglês Refactoring) é o processode modificar um sistema de software paramelhorar a estrutura interna do código sem alterarseu comportamento externo.(…)Outra consequência é a melhora no entendimentodo código, o que facilita a manutenção e evita ainclusão de defeitos.”http://pt.wikipedia.org/wiki/Refatora%C3%A7%C3%A3o
  43. 43. 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).
  44. 44. 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)
  45. 45. Detonando TUDO!
  46. 46. <?phpnamespace 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; }}
  47. 47. <?phpnamespace 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; }}
  48. 48. <?phpnamespace 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; }}
  49. 49. <?phpnamespace 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; }}
  50. 50. <?phpnamespace 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; }}
  51. 51. <?phpnamespace 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; }}
  52. 52. <?phpnamespace 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; }}
  53. 53. Dúvidas???
  54. 54. Obrigado!Eu por aí: http://about.me/lcobucciSlides: http://slideshare.net/lcobucciAvalie essa palestra: http://joind.in/4500

×