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! ;)
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?
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!
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).
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).
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?
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.
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?”
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.
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.
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!
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!
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.
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.
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.
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.
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?
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.
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.
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>.
• 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?
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.
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.
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