[MÚSICA] [MÚSICA] Olá, bem vindo ao curso sobre TDD. Eu sou o Clovis Fernandes e hoje iremos apresentar exemplo de refatoração, com base no mau cheiro que a gente chama de Inveja de Característica. Para isso nós iremos aplicar o Extract Method e outras boas práticas, para resolver esse problema de mau cheiro. O Inveja de Característica que, no catálogo do Fowler, não é? Recebe o nome de Feature Envy, não é? A tradução literal que eu fiz, não é, está certo? Para o português. Ele se caracteriza por método que faz mais uso de, de características e de dados e métodos de outra classe do que da própria classe, está certo? Por isso que ele chama de inveja, porque ele está usando de outra vez de usar a da própria classe, está certo? Isso é o que vai caracterizar. E como a gente mostrou, isso é mau cheiro não muito agradável que causa alguns problemas. Os remédios para esse mau cheiro são técnicas de refatoração, que também estão lá catalogadas no livro do Fowler, não é? que é o Mover Método e o Extract Method. No nosso exemplo aqui a gente vai usar uma mistura dos 2, porque nós vamos na verdade mover uma cópia do método. Eu movo o método, quando eu não preciso mais que aquele método fique no lugar que estava, não é? está certo? Mas no caso eu vou mover uma cópia. Eu quero que aquele método anterior continue no próprio lugar, está certo? O exemplo que eu vou usar aqui, eu adaptei desse site que vocês estão vendo aqui, sobre o, do Joshua Kerievsky, que é grande guru também nessa área de de refatoração, está certo? Então é exemplo que você tem é 2 classes, não é? está certo? Eu tenho a classe Customer e eu tenho a classe Phone, está certo? Eu começo então no meu processo, no meu ciclo de refatoração, não é, está certo? A farejar esse código, não é, está certo? Vocês percebam então que eu consigo visualizar que Phone existem, é, os dados do telefone, eles estão expostos através de métodos getters públicos, não é, está certo? e o mau cheiro se encontra ali na classe Customer, não é, está certo? Porque é onde ele, na classe Customer, o acesso aos dados expostos é muito grande. Eu uso totalmente aquilo, eu vou usar os dados do Phone indevidamente, está certo? Então esse é o mau cheiro que nós chamamos de inveja de característica, o Feature Envy, que o Fowler assim denominou e a gente pode caracterizar assim também. Nós já encontramos ele lá no exemplo do do Tell Don't Ask também, algo parecido com isso. Nós iremos, dando prosseguimento ao ciclo, nós identificamos neste, nesse exemplo apenas e tão somente mau cheiro e vamos aplicar conjunto de técnicas de refatoração proposto pelo Fowler. Vamos fundamentar isso também usando esses princípios que estão apontados aí, o Tell Don't Ask, Redirecionamento e a a Expressão da Intenção principalmente para caracterizar melhor, dar suporte melhor no que a gente está fazendo. Esse último por exemplo é para dar o nome ao método que eu vou extrair e mover de classe, está certo? O o primeiro, a primeira coisa que a gente vai fazer então é, onde estava o mau cheiro que é onde eu faço acesso usando os getters de Phone, não é? na classe Customer, então eu tenho ali o método getMobilePhoneNumber, e para isso eu vou e obtenho getters, usando os getters do Phone, não é, está certo? Eu vou obtendo esses valores, então o que é que eu vou fazer? Esse conjunto que está marcado aí como amarelo, não é, está certo? Fundo amarelo eu vou extrair o método, mas não vou por ele lugar nenhum, está certo? Eu sou estou extraindo. Aí o que é que eu faço seguida? Eu vou mover esse método que eu acabei de extrair para a classe Phone, está certo? É como se é eu tivesse tirado uma cópia do método anterior, está certo? E movesse para a classe Phone. E eu vou fazer redirecionamento, ou seja, onde tinha aquele código todo que que era invejoso da classe Phone, não é, está certo? Eu vou usar o redirecionamento, está certo? Então vocês vejam que é tipo de delegação, que eu chamo de redirecionamento, porque o nome do método de Customer, o getMobilePhoneNumber, é igual ao nome que eu coloquei no método lá de Phone, que também é o getMobilePhoneNumber, está certo? O que é que eu estou fazendo com isso? É algo parecido com o que eu vou mostrar agora para vocês. Vocês lembram quando eu falei do uso do antropomorfismo orientação a objetos? É isso que nós estamos fazendo aqui. É como se, ao ter usado o Tell Don't Ask, não é? E fazer com que a classe Phone tenha o getMobilePhoneNumber, está certo? É, ao redirecionar aqui é como eu, cliente, não é, está certo? Eu sou Customer, eu pergunte ao meu telefone: qual é o seu número? E ele vai me responder qual é o número dele, está certo? Então nós estamos fazendo como se estivéssemos transformando isso aqui num num num ser vivo, não é? está certo? E é isso que a gente na verdade está fazendo. Ao fazer isso, usar esse antropomorfismo, a gente deixa o código mais orientado a objetos, mais claro termos de intenção do que eu quero fazer. Por isso que eu mantive o mesmo nome, porque a intenção, é, lembra que eu falei da expressão da intenção, não é, está certo? Aqui eu estou caracterizando através do redirecionamento, que eu quero a mesma coisa, eu quero obter o número do do do telefone, está certo? Então eu só redireciono e aqui que é importante esse tipo de coisa. Bom, feito isso, então vocês percebam que eu já tenho agora código do getPhone MobilePhoneNumber na classe Phone e tenho o redirecionamento na classe Customer, está certo? Num método de mesmo nome. Então agora eu vou fazer o teste da bateria. Até agora eu não estava, eu não tinha condições de fazer o teste, ou seja, aquilo que estava passando agora tem que passar, continuar valendo aqui, está certo? A bateria tem que estar, ser bem sucedida, porque eu simplesmente fiz movimento, está certo? Eu movi uma cópia, do meu getMobilePhoneNumber, para o Phone, está certo? Então agora eu posso testar e aquela bateria vai funcionar novamente, está certo? Agora eu dou continuidade à minha refatoração, ou seja, porque é que eu pude usar anteriormente aqueles dados que eu estava invejando, que eu estava querendo, está certo? Porque eles estavam expostos, está certo? Eles estavam expostos. Agora o que é que eu faço? É deixar, fazer com que esses dados expostos não fiquem mais expostos. Então onde eles estavam como público, está certo? Eu vou torná-los protected. É, se eu tiver certeza que a classe Phone não vai precisar ter subclasses, eu poderia até colocá-la como final, aí eu poderia deixar aí como private. De qualquer forma o protected vai funcionar e só vai tornar acessível esses getters objetos de subclasses de Phone. Feito isso, eu volto a testar a bateria anterior, tem que dar bem sucedida novamente. Qualquer desses testes, quando não não, eu fiz alguma algum algum erro, não, está certo? E a bateria não dá certo, eu volto no código anterior, vejo o que foi que eu errei, está certo? E aplico a bateria de novo. Vocês percebam lá que no ciclo de refatoração eu fico fazendo isso lá, quando eu aplico as técnicas, a técnica de refatoração, porque ele pode ter vários passos e cada passo eu testo novamente. Com isso, não é, ao final eu tenho aí agora código da classe Customer e da classe Phone refatorado, completamente refatorado, ou seja, sem a inveja de característica. Ou seja, agora esse código chegou no meu ciclo final e eu estou saindo com código refatorado e testado, ou seja, eu garanto que o comportamento que estava antes da refatoração continua valendo agora. Com isso nós mostramos para vocês exemplo de refatoração, seguindo aquele ciclo de refatoração, está certo? E vocês vejam que a gente faz isso de forma segura, nós garantimos que ao final o código correspondente à refatoração desse mau cheiro, que é o inveja de característica, no final o comportamento que estava antes continua valendo, mesmo depois da refatoração. Obrigado! [MÚSICA]