[MÚSICA] Olá a todos! Continuando aqui o nosso hands on de refatoração. Agora, depois que nós extraímos esses dois métodos aqui dessa classe, desse método maior statement não é? Que ele já até cabe na tela, não está 100% não, mas vamos deixar ele pouquinho aí, e vamos focar nesses outros dois aqui, que é o método getFrequentRenterPoints e o getAmount. O grande problema deles é que claramente eles não pertencem a essa classe não é? Você por exemplo como cliente de uma locadora, não é a sua responsabilidade saber quantos pontos de, quanto que é o ponto de frequência de uma locação ou saber quanto custa uma locação está? Você tem que saber quantas locações você tem. Mas você não tem que saber quanto que a locação custa não é? Isso aí você pode até precisar para calcular de repente quanto você já gastou, mas você vai usar uma colaboração com a outra classe, você não vai ter esse método dentro da classe Customer. Então o que a gente vai ter aqui é mover esses métodos, está, para as outras classes. Como que a gente vai fazer isso? A gente vai vir aqui no Eclipse e vai usar a refatoração "Move". Está? Observe que ele já sugere que você mova para a classe Rental, está? Por quê? Porque ela é o parâmetro aqui, está? Então ele, o nome do método, não é, getFrequentRenterPoints, eu vou dar ok, está? Ele deu uma reclamada porque o método era privado, mas eu vou mandar ele continuar. Então ele vai tirar aquele método daqui, vai passar aqui para a classe Rental, está? A gente pode vir aqui, eu vou até corrigir aqui a visibilidade dele, deixando como público, não é? Porque o Customer vai precisar. Está? E a gente percebe aqui que, ao invés de ele dar esse each aqui não é? Passr ele como parâmetro, agora é each.getFrequentRenterPoints. Ele está pegando da locação. Faz mais sentido. Bom e vamos fazer a mesma coisa não é? A gente pode até olhar aqui ó, como é que está aqui o getAmount. Então getAmount each. Vamos ver como é que vai ficar depois aqui não é? Então vamos, a gente vem aqui de novo, dá Move nesse método e vamos dar Ok. Ele vai reclamar a mesma coisa lá relacionada à visibilidade, está? E agora a gente tem aqui ó: each.getAmount. Então ele cria aqui esse thisAmount não é? Colocando esse each.getAmount e aqui é each.getFrequentRenterPoints. Bom, mas vamos lá para o Rental. Vamos colocar aqui como public está? Bom, na minha opinião, quem deveria saber quantos pontos de frequência vale não ê, não é a locação. A locação até deveria saber isso, mas ela depende muito mais do filme do que da locação não é? Então quem sabe, a locação a informação principal dela é quantidade de dias. Mas o filme, ele tem uma certa colaboração, principalmente na questão do código dele não é, o tipo do filme. Então eu também vou transferir isso daqui para a minha classe Movie está? Obviamente aqui a quantidade de dias estão aqui. Então eu vou manter esse método getFrequentRenterPoints aqui e eu vou ter outro método, lá na minha classe Movie, para quem eu vou falar assim ó: Me dá o getFrequentRenterPoints para essa quantidade de dias ou me dá o amount para essa quantidade de dias. Então eu vou ter o método nas duas classes, só que eu vou passar como parâmetro a quantidade de dias. Então eu vou clicar aqui de novo, eu vou vir Refactor Move, está? Então ele está passando, ele está oferecendo não é, a classe Movie, eu vou marcar aqui ó: Keep original method as delegated to moved method. O quê que significa isso? Significa que, apesar de eu estar movendo o método, eu vou manter ele na minha classe e ele vai chamar o outro método está? Então eu vou dar ok aqui. A gente vai ver que o Eclipse não vai fazer exatamente da forma que a gente gostaria, mas ele já adianta bastante trabalho. Então eu fiz dessa vez o getAmount primeiro, então eu vou lá na classe Movie para ver como é que está o getAmount dele. Ele está passando o próprio Rental. Eu não quero que ele passe o Rental, eu quero que ele passe a quantidade de dias não é? Então vai ser aqui ó, eu vou passar o daysRented como parâmetro. Obviamente isso vai dar problema aqui no Movie. Note que ele estava fazendo rental.getMovie não é? Eu não quero nada disso. Então aqui eu vou ter aqui inteiro que é o daysRented e aqui ó, eu vou eliminar tudo isso daqui, eu não preciso ir lá no Rental para pegar o Movie, eu posso simplesmente dar o getPriceCode não é? E nesse rental.getDaysRented é simplesmente o parâmetro daysRented que eu estou passando ali, então vamos lá. Note, esse é exemplo de que eu posso ter métodos que são, tem até o mesmo nome não é? Podem ter parâmetros diferentes, como é o caso aqui. E é, é, e colabora com o outro não é? Eles têm significados diferentes não é? Quando eu viro e falo assim: olha, eu quero a quantidade, eu quero saber quanto custou essa locação, é uma coisa, ou eu quero saber quanto, quanto custa esse filme para a quantidade x de dias. Note que, apesar do nome do método ser o mesmo, o significado dele cada classe é diferente. Então implementei aqui o meu getAmount não é? Note que ele não depende mais do, do, da classe Rental. Eu vou salvar aqui não é? Está tudo compilando, eu vou rodar os testes para ver se está tudo ok. Vamos torcer, tudo certo. Vamos voltar lá na classe Rental e vamos fazer a mesma coisa para o getFrequentRenterPoints. Então vamos dar Refactor Move está? A gente marca ali para ele manter o método original. [SEM ÁUDIO] Ó lá, ele vai delegar. Aqui também eu não quero que ele passe toda a classe Rental não é? Até mesmo para, para o Movie não ter que pegar lá, rental getMovie getPriceCode não é? Ele precisa só da quantidade de dias aqui. Então da mesma forma ele vai passar aqui o daysRented também para o getFrequentRenterPoints. Então vamos salvar aqui, precisamos arrumar aqui. Então int daysRented. Aqui ó, eu posso tirar isso tudo aqui ó, e deixar só o getPriceCode não é? E aqui vai ficar só o daysRented maior que 1 está? Eu posso até agora, ficou pequenininho, eu posso até já botar na mesma linha, tirar esse parêntese aquinão é? Deixar só, qualquer coisa eu poderia deixar só o NEW_RELEASE sem precisar fazer referência a Movie. Eu vou deixar ali, porque não está, mal não está fazendo está? Então a gente vê que o código realmente acaba ficando mais simples não é? Então eu vou salvar aqui. Opa, o meu rental aqui ainda não está não agora, agora sim. Eu vou rodar os testes e vamos ver aqui ó. Rodou? Ó foi tão rápido, que eu nem vi. Isso, está tudo verdinho. Então eu peguei aqueles métodos que não pertenciam à classe Customer, passei para a classe Rental não é? Aí eu mantive eles aqui sem nenhum parâmetro e criei método auxiliar, digamos assim: complementar na classe Movie. Só que agora eu passo a quantidade de dias. Então quem sabe o seu preço é o filme, só que ele sabe o seu preço baseado na quantidade de dias que eu passar para ele. Certo? Então avançamos pouco mais na nossa refatoração Switch case é negócio que me dá coceira não é? Vamos trabalhar com isso no nosso próximo vídeo. Então continue assistindo a sequência aí de refatoração. Até a próxima! [MÚSICA]