[MÚSICA] [MÚSICA] Olá a todos! Esse é o hands on de refatoração. Tá? Nesse hands on, né, a gente não vai ver uma refatoraçãozinha focada, né, a gente vai pegar exemplo maior e mostrar como que funciona a refatoração ao longo de vários passos, né, como que a gente vai trabalhando essas mudanças dentro do nosso código. Tá? Então, nessa primeira parte do vídeo eu vou mostrar pra vocês pouquinho do que que a gente vai mexer, tá? Esse exemplo que eu peguei aqui pra refatorar pra vocês é o exemplo do primeiro capítulo do livro do Martin Fowler de refatoração. Tá? É exemplo de uma videolocadora. Tá? Então, a gente tem aqui uma classe "Customer", tá, ele tem aqui o nome, tem aqui as locações dele, tá e ele tem esse método aqui, "statement", né, vocês podem ver aqui que não é método pequeno. Tá? Não é método bonito, tá? É método bem feio, mas eu tenho certeza que você já viu piores aí códigos que você já mexeu, códigos que você trabalhou. Tá? Então, a ideia desse código é que ele gera uma string, né, que tá vendo aqui é esse "result" aqui, onde ele vai falando: "Olha, eu tenho aqui a ficha de locações do Fulano de Tal", né, e aí ele vai adicionando quais os filmes tem nessa ficha, né, então, ó, note que ele vai adicionando aqui os filmes e aí no final ele diz aqui quanto que é, quanto que já gastou, né, e quantos pontos de frequência, né, é aquele, aquele, aquele cliente, ali, da locadora possui. Tá? Então a gente vai entender pouquinho a lógica disso daqui, né e a gente, a ideia é o seguinte, né, o chefe chegou e falou assim: "Olha, eu quero esse método 'statement', só que eu quero ele como... Eu quero que ele dê o retorno HTML". Tá? E aí você fala assim: "OK, e agora? Como é que eu vou fazer?" Porque eu não consigo reaproveitar absolutamente nada desse código. Se a gente olhar aqui ele faz o cálculo, né, ele tem a lógica aqui dos dias, de quanto custa cada locação e quantos pontos de frequência ele ganha cada caso e a somatória disso e tal. E nada disso ele vai conseguir aproveitar nesse... pra poder fazer essa parte aí de imprimir isso HTML. Tá? Então a ideia é que a gente refatore esse código aqui, né e no final a gente analise aí como é que fica, né, se ele realmente vai conseguir fazer isso ou não. Tá? Então vamos dar uma olhada aqui, a gente tem aqui a classe "Customer", né, ele tem aqui vetor aqui onde ele tem as locações. Temos essa classe "Rental", que é uma classe, basicamente, de dados, né, ele tem uma instância do filme e a quantidade de dias que aquele filme foi alugado. E temos a classe "Movie", né, que ele tem aqui o título e o que ele chama de "priceCode". Esse "priceCode" ele é basicamente o tipo da locação, né? Então se ele for, sei lá, o que aqui no Brasil a gente chama de catálogo, né, seria esse "REGULAR", é uma categoria, né, o "NEW_RELEASE", que é o lançamento, né, seria uma outra categoria, e a gente ainda tem aqui o filme infantil, que seria ainda uma terceira categoria. Pra gente entender pouquinho dessa lógica que está dentro desse método "statement", a gente vai recorrer aqui aos testes que eu criei pra essa classe, tá? ´ Então, eu vou rodar aqui pra mostrar pra vocês que os testes estão funcionando. Então, rodei aqui, os oito testes tão funcionando e eu vou partir, né, de cada aqui pra ir falando pouquinho pra vocês. Tá? Então, eu tenho aqui o meu "Customer" John, né, eu crio aqui, né, no método "setUp", no caso aqui como esse exemplo aqui é pouco antigo ele tá usando ainda o JUnit 3, né, onde tem que estender "TestCase" mas não preocupe com isso, que a gente não vai mexer muito nos testes, tá? Então a gente tem aqui "assertContains", e você fala assim: "Eu nunca ouvir falar nesse 'assertContains'!". Também nem pode, porque tá na própria classe, né. Então ele vai, nesse "assertContains", ele verifica, né, se aquele resultado, né, se ele tem o conteúdo. Tá? Então ele procura se existe aquele conteúdo dentro da string, né? Como aqui retorna uma "stringona", né, é o jeito que a gente tem de verificar, tá? Então, não falei que o código era bom! Mas a gente tem que se virar pra testar ele. Então, a gente tem aqui: o "Indiana Jones", o cara alugou por dia, então ele custou 2. Daí ele ganhou 1 ponto de frequência. O "Indiana Jones" alugado por 3 dias, ele custa 3,50. Que que significa isso, né? A partir de 2... O catálogo, ele pode ficar 2 dias com catálogo e a cada dia adicional ele paga mais 1,50. Por isso que aqui é 3,50. Tá, eu vou usar aqui o teste pra explicar as regras de negócio pra vocês. Você pode ver que aqui, né, ele tem essa mesma lógica, né, só que eu acho que aqui no teste é muito mais fácil de a gente visualizar. Bom, vamos aqui pro infantil, né. Então, "Procurando Nemo", né, alugou 1 dia, custou 1,50. "Procurando Nemo", alugou 5 dias, 4,50. Que que é isso? É 1,50 até 3 dias e depois mais 1,50 pra cada dia adicional. Tá? E aí, da mesma forma que o catálogo, né, que ganha 1 ponto de frequência, ele também vai ganhar 1 ponto de frequência aqui toda vez que ele alugar filme infantil independente da quantidade de dias. Tá? E aí o cara alugou aqui "Vingadores 2", por 1 dia, custou 3 e ele alugou "Vingadores 2" por 3 dias, custou 9, né, então, o lançamento, né, ele custa 3 por dia que a pessoa fica com o filme. E aí, só que quando ele fica mais de 1 dia com o lançamento, ele ganha 1 ponto de frequência a mais. Então, no caso aqui, ó, quando ele ficou 1 dia com "Vingadores", ele ganhou 1 ponto de frequência e quando ele ficou 3 dias com "Vingadores", ele ganhou 2 pontos de frequência. A gente tem aqui teste, que ele chama aqui de "manyRents", né, que ele bota ali vários filmes, com quantidades variadas de dias, né, eu fiz aqui as contas aqui, isso aqui daria 8 pontos de frequência, total de 25, né? Então isso aqui é importante também ainda pra gente não ter testes só com tipo, né? A gente tem aqui teste que combina pouquinho de tudo aí pra ver se algum caso isso aqui é quebrado. Tá? A gente simplificou aqui o teste, né, até aproveitando pra falar pouquinho pra vocês que a gente pode criar métodos auxiliares dentro das classes de teste. No caso aqui, ó, eu criei esse "rentMovie", né, que eu passo o título, o tipo e a quantidade de dias, ele vem, cria uma nova classe do tipo "Movie", que a gente viu aqui que tem o título e o "priceCode" e cria "Rental" que tem o "Movie" e a quantidade de dias, que a gente viu também aqui a classe, e depois ele chama no cliente ali o "addRental". Certo? Então, com isso a gente viu mais ou menos como que funciona esse código aqui e, agora que estamos mais familiares com ele, no próximo vídeo a gente começa, efetivamente, a refatorá-lo. Não perca, espero por você! Muito obrigado. [MÚSICA]