[MÚSICA] Olá, bem-vindo ao curso sobre TDD. Eu sou Clóvis Fernandes e hoje iremos falar sobre exemplo de refatoração tratando o mau cheiro de if com expressão booleana complicada e também as partes then e else. Qual que é o problema aqui? Você tem uma condicional, comando condicional, no caso é if-then-else, esse é o mau cheiro que nós temos, é que ele é complicado e difícil de entender. Embora não seja tão exageradamente difícil de entender, ele exemplifica o problema de ter expressões booleanas complicadas, está certo? Então vamos dar uma olhada aí nesse if-then-else, está certo? Vocês percebem que a gente está tratando alguma coisa que tem a ver com o início do verão e o fim do verão. Então, eu tenho lá objeto data, está certo? Ponto before, do início do verão e data after o verão, o que isso quer dizer? Eu tenho que analisar e ver que isso está querendo dizer que não é dentro do verão, está certo? Não é uma data dentro do verão, então é uma data que poderíamos classificar hemisfério que você tenha predominantemente inverno e verão como se fosse inverno, está certo? E aí você tem uma atribuição da variável custo de uma expressão, também está, tem uma segunda, no else também é uma outra expressão, está certo? Então isso aqui na verdade está simbolizando uma condicional complicada, está certo? Ela tem uma certa complicação e a gente vai tratar disso. Vamos dar uma olhada aí o que é que ele tem de dificuldade. Normalmente essas 3 coisas que estão sendo apontadas aí, elas não expressam a intenção, está certo? Ou seja, quando eu leio aquela expressão booleana lá, está certo, eu tenho que fazer esforço de interpretação para entender o que ele quer dizer, está certo? Ele não está expressando diretamente, assim como essas expressões, eu faço atribuições à variável custo, também elas não expressam a intenção do que eu estou querendo com isso, eu tenho que gastar certo tempo para entender esse tipo de coisa. O que nós vamos fazer nessa Decompose Conditional, quer dizer, eu vou decompor a condicional e nesse primeiro vídeo aqui nós vamos mostrar a primeira parte. A primeira parte então é extrair essa condicional, essa booleana do if, essa expressão booleana que é complicada, vamos extrair como se fosse método, está certo? E antes é isso que a gente vai fazer, eu estou apontando exatamente aí o que é que eu vou tirar, está certo? Uma coisa que nós não podemos nunca esquecer: toda vez que nós formos fazer Extract Method, extrair método de trecho de código, nós temos que olhar as variáveis temporárias que aparecem lá dentro, está certo? Então neste caso eu tenho a variável data, por que que eu sei que ela é variável temporária? Porque ela não vem acompanhada do underline, do sublinhado, está certo, como estão nas duas expressões aí embaixo, tem três variáveis de instância que estão aparecendo, custo, quantidade e data são variáveis temporárias, está certo? E elas não foram alteradas ali dentro, então o que significa isso? Variável temporária no trecho de código que eu vou extrair que não é alterada, significa que eu vou passar como parâmetro nesse novo método que eu estou criando, se ela tivesse sido alterada, aí ela viria return, está certo? Então como é que ficou agora, eu tinha o antes, o agora e o depois, o que é que eu fiz? Eu tirei a expressão, que lá cima, a booleana queria dizer que não é verão, é inverno, está certo, e aí eu escolhi colocar não é verão, está certo? Eu poderia ter colocado é inverno, se é inverno, está certo? Mas acontece que os nomes das variáveis, que são constantes, Inicio Verão e Fim Verão estão claramente levando a eu tratar as coisas como verão, está certo? Então por isso que eu extraí o nome do método como isNotVerao e passei o data, como eu já havia dito, já que data é uma variável temporária que não foi modificada, eu passei como parâmetro. E obviamente o if ficou bem mais expressivo nesse momento, está certo, eu entendo qual é a lógica desse if claramente, eu não preciso demorar mais do que 1 segundo para entender qual é a lógica na hora que eu vou testar essa booleana aí, está certo? O resultado então ficou dessa forma, eu tenho aí o novo trecho refatorado até agora com o Extracted Method que eu tirei o método isNotVerao, está certo? E eu apresento as duas coisas aí. Falta ainda tratar aquela questão da expressão que não expressa a intenção ou finalidade, foi o que nós havíamos mostrado anteriormente, que existem duas expressões aí que não expressam essa finalidade, ou seja, dá certo trabalho para eu entender o que é que elas querem dizer, está certo? Então a ideia é trabalhar nisso, normalmente a gente faz extract expressão, extrai a expressão e coloca novo método, está certo? Essa refatoração, essa técnica, ela não existe, na verdade ela é parte de uma outra técnica, que é o Replace Temp with Query, query é muito parecido com getter, está certo? Então a primeira parte é o que a gente vai extrair essa expressão na forma de método e depois substituir a expressão pela chamada do método, está certo? Mas isso é o que nós iremos ver na parte 2. Então nesta parte inicial o que é que nós mostramos foi o início dessa Decompose Conditional, que trata só da expressão booleana. Nós chegamos uma expressão booleana não muito agradável, porque ela é negativa, isNotVerao data, que nós depois no final vamos dar acerto e trabalhar, tornar essa expressão booleana positiva também. Obrigado.