[MÚSICA] Olá,
bem vindo ao curso sobre TDD!
Eu sou o Clovis Fernandes e hoje iremos dar continuidade à apresentação do
exemplo de refatoração para tratar mau cheiro para uma condicional,
comando condicional if then else tanto complicado e difícil de entender.
Para isso usamos o Decompose Conditional, que nós já
apresentamos na parte o início da refatoração Decompose Conditional
que foi tratar a expressão booleana, que era difícil de entender, está certo?
E, nessa 2ª parte, iremos tratar as duas expressões tanto na parte then,
quanto na parte else.
Relembrando então que tínhamos esse if then else aí.
É, nós extraímos a expressão booleana tanto complicada
para uma maneira bem mais simples, está certo?
Ficou aí if isNotVerao data, está certo?
Embaixo tem o método privado.
Feito esse extract, testamos a bateria de testes novamente, está certo?
E aí o que resta fazer?
É tratar o problema das expressões que não expressam a intenção ou finalidade, está?
Eu tenho lá 2 expressões que eu teria que gastar tempo para entender, está certo?
Quem vai ficar encarregado de fazer isso é usando isso que eu estou
chamando de extract the Expression into a Method.
Mas que não existe, isso não é uma técnica de refatoração oficial,
porque ela é parte do Replace Temp with Query,
query é como se fosse getter, está certo?
Então é a parte que eu simplesmente transformo essa expressão num
método, não é?
Que eu faço extract method da expressão, está certo?
Isso efetuou a expressão pelo código que eu acabei de criar, está certo?
É basicamente isso que eu vou fazer.
Então vejam aí que eu tenho duas expressões.
O certo é fazer uma expressão, fazer a refatoração da 1ª expressão,
testa a bateria, da 2ª expressão, testa a bateria e aí eu jogo iii aqui iii,
por questões didáticas, eu vou fazer das duas, está certo?
Ao mesmo tempo.
Então vocês percebam que eu tenho duas expressões aí e, quando eu vou extrair,
uma das coisas que eu tenho que prestar bastante atenção sempre, no extract
method isso é norma, eu vou olhar as variáveis temporárias, está certo?
Então usando aquela convenção de pôr underline nas
como prefixo das variáveis de instância, está certo?
É por isso que eu tenho três variáveis de instância e custo é uma temporária e
quantidade é temporária,
dentro do código na parte que eu vou refatorar, só tem quantidade.
Bom, se a temporária não é alterada dentro do trecho que eu vou refatorar, eu vou
extrair, é ela vai passar como parâmetro esse método que eu estou criando.
Se ela mudasse, alterasse algum valor,
então nós a devolveríamos através de return.
Então o método teria que devolver essa variável de alguma forma, está certo?
Então no caso aqui a temporária é inalterada,
então ela vai ser passada como parâmetro, não é?
A temporária quantidade.
Outra coisa, eu vou pegar cada uma dessas expressões e tentar entender o
significado dessa expressão porque o
problema dela é de não expressar a intenção, a sua finalidade.
Então no 1º caso eu estou querendo no fundo fazer cálculo
do custo de inverno pela quantidade que eu estiver gastando.
E na 2ª é o custo verão pela quantidade, está certo?
Então fazendo a refatoração veja como já ficou bastante mais simples, não é?
If isNotVerao data custo igual a custoInverno
quantidade else custo igual a custoVerão quantidade.
Veja que agora tudo está sendo expresso de uma maneira muito clara, não é?
O significado, a finalidade do que eu estou querendo expressar, o algoritmo
agora ficou claro, ou seja, se vocês lerem o de cima e lerem o de baixo, está certo?
Já ficou bem melhor, está certo?
O que está ocorrendo ainda de bom como é que ficaram esses esses métodos, não é?
Está certo?
Vocês percebam que os dois métodos são privados.
Então normalmente no extract method eu extraio métodos privados, não é?
está certo?
Vocês percebam que o código interno no return de cada deles é literalmente
a mesma coisa que estava no código que eu estava refatorando, está certo?
Então o que, esse trecho continua
não tendo expressão nenhuma, mas o quê que dá a expressão da intenção?
Os nomes dos métodos, está certo?
CustoInverno expressa intenção dessa expressão que está
ali do método custoInverno, a mesma coisa vale para o custoVerao.
Bom, como eu ia falando, aquele isNotverao
ainda está entalado aqui porque normalmente o cérebro humano,
eu já falei isso e vou repetir, ele não trata bem o not, está certo?
A negação ele lê como se fosse ali sem negação,
ele estaria lendo ali como se fosse verão, demora para calcular isso.
Isso é uma coisa que atrapalha o raciocínio, a leitura, quer dizer, ou
seja, o texto ainda não está bem legível exatamente por causa desse isNotVerao.
Então o quê que nós temos que fazer é torná-lo isVerao.
Tornar isVerao significaria o que está na parte then passa
para a parte else, o que está na parte else passa para a parte then, está certo?
E é isso que nós acabamos fazendo, olha aqui a transformação.
Eu ponho lá if isVerao, agora está isVerao, está certo?
Custo igual a custoVerao quantidade else igual a custoInverno quantidade.
Invertemos a ordem das, das expressões,
dos métodos que expressam a intenção do que eu quero, está certo?
Essas atribuições e agora a leitura está muito,
o código agora está muito mais legível, não é?
Está certo?
Vamos dar uma olhada como estava antes, está certo?
Antes disso vamos ver aí como é que ficou, não é?
O isVerao.
O quê que acontece, se eu quiser fazer de uma maneira rápida,
é isso o que eu iria fazer, eu crio o isverao fazendo o quê?
Is not isNotVerao, está certo?
Quer dizer, eu faço uma dupla negação, está certo?
Dentro do método privado isverao,
não tem problema algum ter essa dupla negação, está certo?
Porque a expressão da intenção desse
negativo está expresso pelo nome do método isVerao.
Não tem problema nenhum.
Agora eu posso também, é válido também,
se eu tivesse construído o isVerao do começo, está certo?
É só inverter aquela expressão booleana inicial, não é?
Está certo?
Então eu coloco lá o data after início do verão e data before fim do verão.
Eu estou limitando dizendo que é dentro do verão, está certo?
No espaço dentro do verão.
Antes eu limitava para fora, não é?
Está certo?
Supondo que fosse inverno, ou seja, hemisférios que você tem marcantemente
uma coisa que você pode chamar de inverno e de verão e de inverno, está certo?
E aí eu inverti, está certo?
Para efeito prático, os dois têm, expressam a intenção que é isVerao,
agora para efeito de rapidez, a anterior é melhor, está certo?
Porque você não perde muito tempo [INAUDÍVEL] tratar no caso aí essa
expressão booleana não é tão complicada, não é?
[INAUDÍVEL] expressões boolenas muito complicadas, está certo?
Lembrar que após cada refatoração que nós fizemos extraindo métodos,
nós testamos a bateria de testes que estava valendo para
o código antes de refatorar e não pode haver mudança nenhuma.
É inegável que o código agora ficou muito mais simples, não há nada que impeça
o entendimento da lógica de quem criou, do que ele queria fazer.
Está muito bem expresso dessa forma, está certo?
Com isso nós concluímos, não é, a refatoração,
mostramos agora completamos o Decompose Conditional, está certo?
E mostramos que o mau cheiro que você tem uma expressão if then
else tanto complicada de entender,
com três refatorações nós chegamos num código muito mais limpo,
muito mais claro, muito mais legível e fácil de entender.
Obrigado.
[MÚSICA]