Removendo o cheiro ruim      do seu código     Luís Otávio Cobucci Oblonczyk22 de Outubro de 2011       6° SoLiSC
Luís Otávio Cobucci Oblonczyk●    Desenvolvedor PHP na Softnex Tecnologia●    Orientador no Senac TI●    Doido por PHP des...
Prepare-se
Você verá agora uma imagemforte, porém real...                             Ela representa o seu                           ...
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 ad...
Mas fique tranquilo, você temsalvação (e seu código também)
Mas fique tranquilo, você temsalvação (e seu código também)                                 Se você não está convencido,  ...
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...
Verdadeiro programadorde código limpo
Porque apenas funcionarnã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...
Nomenclatura – Classes●    Nomes das classes devem ser substantivos,    NUNCA verbos●    A classe deve receber o nome do e...
Nomenclatura – Métodos●    Nomes dos devem SEMPRE conter verbos●    Caso programar em português, os verbos    devem ser ut...
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 _...
Dúvidas???
Obrigado!Eu por aí: http://about.me/lcobucciSlides: http://slideshare.net/lcobucciAvalie essa palestra: http://joind.in/3948
Removendo o cheiro ruim do seu código - SoLiSC 2011
Upcoming SlideShare
Loading in …5
×

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

903 views

Published on

Tem como objetivo mostrar técnicas preventivas e corretivas para criação/manutenção de projetos com código limpo e organizado.

Published in: Technology

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

  1. 1. Removendo o cheiro ruim do seu código Luís Otávio Cobucci Oblonczyk22 de Outubro de 2011 6° SoLiSC
  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 =P @lcobucci http://about.me/lcobucci
  3. 3. Prepare-se
  4. 4. Você verá agora uma imagemforte, porém real... Ela representa o seu código, sim você viu direito, é o SEU código aqui!
  5. 5. Sim, essa é a real visão do seu código,e só você não percebeu isso ainda
  6. 6. 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 é
  7. 7. Mas fique tranquilo, você temsalvação (e seu código também)
  8. 8. Mas fique tranquilo, você temsalvação (e seu código também) Se você não está convencido, vou argumentar um pouco
  9. 9. 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
  10. 10. 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.
  11. 11. Alguém se identificou?
  12. 12. 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
  13. 13. Verdadeiro programadorde código limpo
  14. 14. Porque apenas funcionarnão é suficiente!
  15. 15. Blz, como posso melhorar?
  16. 16. Escolha nomes decentes!
  17. 17. 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
  18. 18. Nomenclatura – Classes● Nomes das classes devem ser substantivos, NUNCA verbos● A classe deve receber o nome do elemento que ela representa na vida real
  19. 19. Nomenclatura – Métodos● Nomes dos devem SEMPRE conter verbos● Caso programar em português, os verbos devem ser utilizados no modo imperativo (calculaJuros(), cancelaCompra(), ...)
  20. 20. 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
  21. 21. Criando métodos e funções
  22. 22. 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!!
  23. 23. Lidando com comentários
  24. 24. 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)
  25. 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) // verifica se está cancelado
  26. 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 ● if ($item->estahCancelado())
  27. 27. 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!
  28. 28. Utilize coding standards
  29. 29. 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
  30. 30. Gerenciando erros
  31. 31. 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)
  32. 32. Classes
  33. 33. 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!
  34. 34. Refatoração é OBRIGAÇÃO!
  35. 35. 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
  36. 36. 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).
  37. 37. 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)
  38. 38. Detonando TUDO!
  39. 39. <?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; }}
  40. 40. <?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; }}
  41. 41. <?phpnamespace 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; }}
  42. 42. <?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( div, array($dividend, $divisor), $dividend / $divisor ); return $dividend / $divisor; }}
  43. 43. <?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(div, array($dividend, $divisor), $result); return $result; }}
  44. 44. Dúvidas???
  45. 45. Obrigado!Eu por aí: http://about.me/lcobucciSlides: http://slideshare.net/lcobucciAvalie essa palestra: http://joind.in/3948

×