Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Padrões GRASP e Qualidade de Código

Opensanca
September 10, 2016

Padrões GRASP e Qualidade de Código

Workshop que foi ministrado pelo grande amigo Reinaldo Luckman (https://br.linkedin.com/in/r31n4ld0) abordando sobre GRASP, exemplos foram baseados para Java mas pode ser contemplados para qualquer linguagem! ;)

Opensanca

September 10, 2016
Tweet

More Decks by Opensanca

Other Decks in Programming

Transcript

  1. Discurso! Discurso! • Qual é seu nome? • Com o

    que você trabalha e/ou o que você estuda? • Qual sua experiência com orientação a objetos? • Qual sua experiência com padrões de projetos? • Quais linguagens e ambientes usa ou já usou? • Quais bancos de dados usa ou já usou? • Usa ou já usou UML?
  2. Duas recomendações 1. Quando você vir a premiação mais desejada

    de todos os tempos escolares, a Estrela de Bom Menino, guarde o conceito relacionado a ela na sua mente e no seu coração. Ela fará você dar saltos na sua carreira. 2. Participe: fale, discuta, pergunte e codifique. Lembre-se que poderíamos estar tomando cerveja nesse exato momento, então, vamos fazer valer essa perda!
  3. Como é seu processo mental de programação para solucionar um

    problema? Depende do seu nível de experiência em relação aos conceitos envolvidos.
  4. A evolução do processo mental de programação A ordem é

    mais ou menos essa: 1. Programação estruturada (uso de variáveis e procedimentos); 2. Programação orientada a objetos (classes com atributos, métodos e relacionamentos); 3. Padrões de projetos (problemas de OO que ocorrem diversas e diversas vezes e já foram categorizados).
  5. O problema [ parte 1] Uma locadora de carros deseja

    informatizar seus processos internos. Para tanto, o proprietário deseja começar com uma versão bem simples de um sistema que permita: • Cadastrar um cliente; • Cadastrar um veículo; • Lançar as locações de veículos realizadas por clientes. Obs: você tem liberdade tecnológica para sua solução (pode ser web, desktop, etc).
  6. Como ESTÁ SENDO o seu processo mental de programação para

    solucionar ESTE problema? Você tem 5 minutos para 
 pensar numa solução.
  7. Como ESTÁ SENDO o seu processo mental de programação para

    solucionar ESTE problema? • Você viu interfaces? • Você pensou em tabelas e campos? • Você viu as classes e seus relacionamentos em um diagrama de classes de UML? • Você digitou código mentalmente? • O que mais você viu ou pensou?
  8. Estrela de Bom Menino Você deve ver a solução do

    problema nas diversas perspectivas (interface, banco, diagrama de classes, código, etc). É uma das maneiras mais rápidas de você criar uma sólida base para desenvolvimento de soluções de software.
  9. A divisão das coisas Existem perspectivas de tecnologia: • HTML,

    JavaScript, MySQL, Java, MongoDB, etc; • São fáceis de se enxergar.
  10. A divisão das coisas Existem perspectivas de experiência: • Como

    fica a divisão de código? E as tabelas do banco? • São bem mais difíceis de se definir • Você consegue se lembrar do seu último projeto? A última vez que pensou “em que lugar vou colocar isso no código?”
  11. Estrela de Bom Menino A 1a. regra de divisão de

    código: 
 foque no negócio!
  12. Foque no negócio! • Nesse primeiro momento, você trabalha com

    as classes que são consideradas as entidades do sistema. • Exemplos de classe de entidade: NotaFiscal, Fornecedor, Produto, Cliente, etc.
  13. Foque no negócio! Você tem 5 minutos para 
 criar

    o diagrama de classes
 em UML da solução do problema [parte 1].
  14. Foque no negócio! Uma solução aproximada que você pode ter

    chegado no levantamento das classes de entidade seria essa:
  15. Estrela de Bom Menino Um diagrama de classes UML 


    (entre outros) é código puro, 
 e não documentação!
  16. O problema [ parte 2] Pelo relato do proprietário, você

    percebe que ele gostaria de armazenar os seguintes dados: • Cliente: CPF e nome; • Veículo: placa, marca, modelo, quilometragem atual, valor da diária e o valor do quilômetro adicional (é permitido rodar até 200 quilômetros por dia sem pagar nenhum quilômetro adicional); • Locação: data de início, data de fim, quilometragem de retirada, quilometragem de devolução e se está paga ou não.
  17. O problema [parte 3] O proprietário ainda pede para você

    que o sistema deve calcular a dívida o cliente, baseada nos seguintes fatos: • Todas as locações não pagas devem ser somadas; • As locações não pagas devem ser calculadas pela quantidade de dias que o veículo foi locado e pela quantidade de quilômetros adicionais de cada dia (o que extrapolou o limite diário de 200 km), se existirem.
  18. • E agora? Onde esse código deve ser colocado? •

    Aqui começa a parte em que os erros sutis acontecem no desenvolvimento da solução. • Na parte estrutural (divisão de atributos) existe uma tendência de acharmos mais fácil, porque estamos acostumados com banco de dados. • Mas na parte comportamental (divisão de métodos) não existe uma fronteira muito clara e a qualidade do código começa a influenciar diretamente na legibilidade e reutilização. Foque no negócio!
  19. Foque no negócio! De quem é a dívida? Do cliente.

    Então criamos um método correspondente na classe Cliente.
  20. Foque no negócio! Você tem 10 minutos para 
 criar

    o o código (ou parte dele ou algoritmo via comentários) do método dívida.
  21. Foque no negócio! Codifiquemos juntos! *Acesse a classe Cliente no

    repositório: https://github.com/reinaldoluckman/palestras-grasp-parte-1
  22. • Batendo o olho nesse código, você é capaz de

    dizer o que ele faz? • Ah, LEGIBILIDADE, sua linda! • Se não tivéssemos analisado o funcionamento do método e: • O método se chamasse calcula(); • As variáveis não estivessem bem nomeadas; • Falta de respeito com a identação. Foque no negócio!
  23. Estrela de Bom Menino Legibilidade é TUDO!
 Obs: a não

    ser que pessoas
 irão morrer por causa dela.
  24. O NOVO problema • Surge um novo cliente, uma locadora

    de games! É um presente dos deuses isso. Ganhar dinheiro com menos esforço! • Nesse novo contexto, vamos reutilizar as classes Cliente e Locacao e criar somente uma nova classe Jogo.
  25. O NOVO problema • Dependendo do seu nível de experiência

    em codificação, você: • Vai achar que a classe Cliente está super legal; • Vai achar que é normal modificar o método dívida e mudar as os conceitos relacionados com veículo para um jogo.
  26. O NOVO problema Na verdade, a classe Cliente não deveria

    ter uma linha alterada sequer nesse novo problema. Ela deveria ser totalmente reutilizável!
  27. O grau de dependência de uma classe • Com quantas

    classes a classe Cliente está diretamente relacionada no diagrama?
 • E no código?
  28. O grau de dependência de uma classe • Com quantas

    classes a classe Cliente está diretamente relacionada no diagrama?
 R: UMA classe. • E no código?
 R: DUAS classes.
  29. Estrela de Bom Menino 
 O grau de dependência de

    uma classe deve ser exatamente o mesmo no código e na documentação.
  30. Foque no negócio! O grande problema aqui é que a

    classe Cliente está com um monte de responsabilidade que não pertence a ela!
  31. Os padrões GRASP Os padrões GRASP (General Responsibility Assignment Software

    Patterns) têm como principal objetivo ajudar o desenvolvedor a responder a seguinte questão:
 
 “Onde diabos eu coloco esse código?” Mais formalmente: um conjunto de modelos a serem seguidos para atribuir responsabilidades a uma classe.
  32. 1o. padrão: Especialista (Expert) PROBLEMA: como atribuir responsabilidades corretamente para

    uma classe? SOLUÇÃO: atribuir responsabilidade ao especialista da informação, ou seja, a classe que é dona da informação utilizada em alguma operação deve ser a responsável em executar tal operação.
  33. 1o. padrão: Especialista (Expert)
 Aplicação no problema da Locadora de

    Veículos • Qual é a classe que está como responsável de calcular a quantidade de dias de um aluguel no código? E quem é a dona da informação? • Qual é a classe que está como responsável de calcular a para a quantidade de quilômetros rodados? E quem é a dona da informação?
  34. 1o. padrão: Especialista (Expert)
 Aplicação no problema da Locadora de

    Veículos • Como a classe Locacao é a dona das informações necessárias para se fazer os cálculos (data de início, data de fim, km de retirada e km de entrega), ela é que deve fazer os cálculos de quantidade de dias de locação e a quantidade de quilometragem rodada durante a locação. • O ideal então é criarmos dois métodos na classe Locacao: duracaoEmDias() e kmRodados(), ambos retornando um long e removermos os códigos respectivos desses cálculos da classe Cliente, deixando nela somente a chamada para os novos métodos.
  35. 1o. padrão: Especialista (Expert)
 Aplicação no problema da Locadora de

    Veículos Você tem 5 minutos para 
 refatorar o código atual e criar os métodos sugeridos.
  36. 1o. padrão: Especialista (Expert)
 Aplicação no problema da Locadora de

    Veículos • Qual é a classe que está como responsável de calcular o valor de uma locação? E quem é a dona da informação?
  37. 1o. padrão: Especialista (Expert)
 Aplicação no problema da Locadora de

    Veículos • Como a classe Locacao é a dona das informações necessárias para se fazer os cálculos, ela é que deve ser a responsável de retornar o valor de uma locação. • O ideal então é criarmos um método na classe Locacao: valor(), retornando um double e removermos os códigos respectivos desses cálculos da classe Cliente, deixando nela somente a chamada para o novo método.
  38. 1o. padrão: Especialista (Expert)
 Aplicação no problema da Locadora de

    Veículos Você tem 5 minutos para 
 refatorar o código atual e criar os métodos sugeridos.
  39. Estrela de Bom Menino 
 A classe que é dona

    da 
 informação é que deve ser responsável em executar 
 as operações que usam tal informação.
  40. Melhoria de código via bom senso • Nesse ponto o

    padrão Expert está totalmente respeitado. • Mas ainda podemos melhorar: isolar o código que retorna as locações não pagas de um cliente em um método específico: locacoesNaoPagas() que retorna uma Collection<Locacao>.
  41. Melhoria de código via bom senso Você tem 5 minutos

    para 
 refatorar o código atual e 
 criar o método sugerido.
  42. 1o. padrão: Especialista (Expert)
 Resultado final // COISA LINDA, TITIO!

    public double divida() { double totalDivida = 0.0; for (Locacao lnp: this.locacoesNaoPagas()) { totalDivida += lnp.valor(); } return totalDivida; }
  43. 1o. padrão: Especialista (Expert)
 Resultado final • Aumentou a legibilidade?

    • Quanto tempo você leva para entender esse código? • Aumentou a reutilização? • Você consegue aplicar a mesma classe Cliente do problema de locadora de veículos no problema da locadora de games?
  44. Estrela de Bom Menino [Revisão] Você deve ver a solução

    do problema nas diversas 
 perspectivas! 1a. regra de divisão de código: foque no negócio! Um diagrama de classes UML é código! Legibilidade é TUDO! O grau de dependência de uma classe deve ser o 
 mesmo no código e no diagrama de classes. A classe que é dona da informação é que deve ser 
 responsável executar operações sobre tal informação.
  45. Continuação dos Padrões GRASP • Padrões Fachada e Creator; •

    Mais sobre legibilidade; • Mais sobre qualidade de código; • Mais sobre visão arquitetural de código.
  46. Hora do Jaba! • Eu estou envolvido com educação e

    meta- aprendizagem faz bastante tempo: isso está totalmente relacionado com a minha missão de vida. • Entenda a sua, a gente só tem uma chance. • O fenomenal de tudo isso é que um programador pode aplicar seus conhecimentos na sua missão de vida independentemente de qual ela seja; não existe tempo perdido.
  47. Hora do Jaba! • Eu criei uma marca, a Learning

    Heroes, especialmente focada nisso: meta-aprendizagem.
  48. Hora do Jaba! • No momento eu tenho trabalhado em

    2 produtos: • Um treinamento on-line capaz de aumentar de 10 a 20 pontos seu QI, definitivamente. • Um treinamento presencial para eliminar a procrastinação da sua vida. • Acesse um formulário de declaração de interesse em bit.ly/learning-heroes que dará descontos especiais para as turmas iniciais. • Facebook, Twitter e YouTube: @learningheroes2