[MÚSICA] Olá. Bem-vindo ao curso sobre TDD. Eu sou Clóvis Fernandes e hoje iremos mostrar para vocês exemplo de refatoração usando o Extract Method do Fowler. A refatoração para extrair método de código exemplo que a gente vai mostrar para vocês. Então qual que é o nosso problema nesse momento? Você tem fragmento de código que pode ser agrupado. Vamos ver o nosso exemplo, ele foi tirado direto lá do Fowler, está certo? Eu já tenho printBanner, método printBanner e depois comentário, print details, então pode ver que o meu cachorrinho já está farejando ali, está certo? Imaginem que ali vai ter alguma coisa que precisa ser tratada, está certo? O que precisa ser tratado que está bem claro aí, é esse desnível, não é? Então como eu havia dito, supõe-se que o printBanner tenha sido código, que já correspondeu a Extracted Method, ou não, não importa. O que importa é que existe desnível, você tem comando simples, expressando uma expressão, que é o printBanner, está certo? Que você [INAUDÍVEL] o que expressa a expressão, está certo? O resto está comandos bem simples, então que a gente vai extrair código é do system out, do primeiro system out e do segundo system out, então, nós vamos tentar fazer essa extração, da melhor maneira possível. E como é que essa extração ocorre? A primeira coisa que você vai fazer é transformar esse fragmento que você está querendo extrair, está certo? Transformá-lo novo método e seguindo aquele princípio do expressar a intenção, está certo? A ideia é que você explique, apresente nome que explique a finalidade daquele trecho de código que está ali, está certo? O comentário que tem ali vai nos ajudar a ter uma noção do que aquele trecho de código responde por quem fez aquele trecho de código, mas como eu já mostrei exemplo de aula anterior, os comentários [INAUDÍVEL] não está errado, está certo? Então você que é responsável por entender aquele trecho de código e concordar com o comentário ou não. A segunda coisa que a gente vai fazer é: onde tinha aquele trecho de código que a gente removeu para formar o novo método, nós colocamos uma chamada daquele método, está certo? Normalmente nós extraímos esses métodos e na maioria das vezes eles ficam como métodos privados, está certo? Alguns casos eles podem ter, receber modificador diferente de acesso, mas igualmente eles vão ser privados. Outra coisa que a gente precisa tomar muito cuidado é com as variáveis temporárias nesse trecho de código que nós vamos extrair, está certo? Se a variável temporária é definida e usada inteiramente lá dentro, está certo? Sem nenhum contato externo, não tem problema, como se fosse uma variável interna daquele método. Agora, se você determinou que ia definir antes e ela não é modificada lá dentro, está certo, você tem que passar essa variável como parâmetro, então você tem uma variável que foi declarada antes, que não é modificada dentro desse fragmento, você vai passar com parâmetro, se tiver mais com parâmetro e assim por diante. A outra coisa é que, se ela for modificada lá dentro do fragmento, essa variável temporária, se ela for modificada lá dentro, aí ela tem que voltar através de return. Então obviamente se eu tiver mais do que uma variável, eu vou ter que usar algum esquema de voltar essas variáveis, os valores dessas variáveis para serem usados externamente. Como o return só permite o retorno de uma variável, o que normalmente se faz é você transformar o valor do dado que você, o valor dos dados que você está querendo retornar são mais de uma variável, você transforma no que a gente chama ali, o object. Quer dizer, você vai fazer objeto que é só para transportar esses valores, certo? E quando você devolver esse value object, você vai [INAUDÍVEL] get para obter os valores apropriados para cada uma das variáveis que modificou internamente. Bom, vamos olhar agora de novo o código, Então vamos examinar, o print details, que é o comentário que está ali, Caso [INAUDÍVEL] examina e percebe que ele realmente corresponde à qualidade desse tipo de código, está certo? Então o nome vai sair daí, o nome do meu novo método vai ser print details. Verifico também que a variável temporária debito, ela é usada, definida antes do trecho que eu vou extrair e ela é usada diretamente sem modificação, ela não é modificada dentro do trecho, está certo? Então eu vou passar como o parâmetro, então o meu método vai ser print details e eu passo uma variável debito do tipo double, underline, ou sublinhado, name, fica bem claro aqui, esse trecho de código é pequeno mas se fosse trecho maior, você ia notar que pela nossa convenção ele é uma variável de instância, [INAUDÍVEL] procurando nada, ver nada tem o sublinhado antes, então é uma variável de instância, então não vou confundir com variáveis temporárias ou parâmetros do método que eu estou usando, está certo? Então vamos agora observar, o trecho que nós vamos extrair então, é essas duas linhas que contêm o system out, está certo? Nessas duas linhas. Primeira coisa que eu faço? Fazer uma cópia desse trecho, criar o método print details com parâmetro debito, está certo? E cria o método, e cria esse método. Nesse trecho que está marcado aí, Extrair, eu vou então por a chamada do método novo que eu acabei de criar. Então vejamos como é que fica? Dessa forma, então eu coloquei ali o antes e o depois, certo? Tem o antes e o depois. Vocês percebam que eu tenho lá printDetails debito, está certo? Então isso ficou bem claro, essa estrutura que foi feita, esse mecanismo, esse processo todo para fazer o Extract Method, está certo? Para extrair o método novo de trecho passível de extração, o maior cuidado são com as variáveis temporárias, está certo? E a ideia é que você [INAUDÍVEL] o código que está antes ali, ele foi testado, está certo? E você já sabe que o teste é bem sucedido. Fiz a refatoração depois? Logo seguida eu testo tudo de novo. O teste tem que dar bem sucedido novamente, porque se ocorrer alguma coisa que o teste pare, o que é que eu tenho que fazer? Eu tenho que ver onde foi que eu errei nessa extração, errei de alguma forma, está certo? Com relação às variáveis, pode ter acontecido alguma coisa e vai dar errado, está certo? Bom, eu não mostrei aqui, mas o senhor Guerra mais pra frente vai mostrar exemplo de Extract Method usando o Eclipse, que você [INAUDÍVEL] vai ser dado pelo Eclipse, o Eclipse vai te dizer: olha são essas variáveis temporárias que estão aqui, olha essa aqui vai ser passada como parâmetro, essa aqui vai ter que retornar, está certo? Ele vai indicar tudo para você, você confirma porque ele não tem certeza absoluta se todas as situações ele tem certeza sobre o que ele vai fazer, mas já é de uma grande ajuda pra que você possa fazer Extract Method de uma maneira mais segura, para garantir que quando você testar ao final da refatoração, dê tudo certo. Nós já fizemos tudo que tínhamos que fazer para exemplificar o Extract Method, nós vamos aproveitar agora para mostrar, assim rapidamente, outro tipo de refatoração que o Fowler chama de Inline Temp, está certo? Que vocês percebam que a temporária debito recebe valor que ele lá chama de query, mas que no nosso caso é getter, está certo? Então esse Inline Temper, onde estiver sendo usada essa variável debito, vai ser substituída pelo getDebito, está certo? Então ali no caso só tem lugar, que é o printDetails debito. Então é isso que o Inline Temp faz. Vai fazer para exemplo de uma variável debito que aparece ali, sendo usada, mas se tivesse mais outros locais onde ela aparecesse, iria ser substituída pelo getDebito, então veja como é que fica. Então perceba que eu mantive a linha onde estava anteriormente e risquei, hachurei, mostrando que ela está, foi removida, está certo? E onde tinha o print details debito, agora tem o print details o getter, getDebito, o método, está certo? getDebito, está ok? Bom, têm pessoas que não acham que isso ficou, expressa bem a intenção, está certo? Que a maneira anterior expressa melhor, está certo? Então é o tipo de refatoração que você decide o que você realmente quer fazer, se quer chegar até esse detalhe maior, ou mantém o anterior, está certo? O Inline Temp não é necessariamente uma coisa que você sempre tem que fazer, você pode fazer se achar que realmente ficou claro o que você estava querendo, a intenção que você estava querendo passar, do que o código faz, a finalidade do código. Com isso nós aproveitamos e encerramos o exemplo do Extract Method, está certo? E mostramos também rapidamente a refatoração chamada Inline Temp. Obrigado.