"Olá de novo."

"Oi!"

"Hoje vou falar sobre refatoração. Refatorar é alterar o código de um projeto sem alterar sua funcionalidade."

"Mas como isso é possível?"

"Bom, nos casos mais simples, poderíamos renomear variáveis ​​e/ou métodos. Afinal, mudar o nome de uma variável não vai fazer o programa funcionar diferente, vai?"

"Claro que não."

"Você também pode dividir métodos grandes em vários menores. "

"Você pode extrair trechos de código repetidos em um método separado. "

"Algumas funções podem ser declaradas estáticas e depois movidas para classes utilitárias."

"Mas esta é uma interpretação estreita da refatoração."

"Refatorar às vezes significa reescrever (melhorar) a arquitetura de um projeto sem adicionar novas funcionalidades. Isso é refatorar no sentido amplo do termo."

"O IntelliJ IDEA tornou-se o ambiente de desenvolvimento integrado (IDE) mais popular, especificamente porque foi o primeiro a introduzir ferramentas de refatoração muito poderosas."

"O que são essas ferramentas mágicas?"

Truque de mágica nº 1: altere o nome de um método.

"Imagine que seu código tem um método chamado de 100 a 500 lugares diferentes. Você decidiu alterar seu nome para algo mais compreensível. Digamos que seja run() e você deseja que seja runDownloadTaskAsync(). Com que rapidez você pode fazer aquilo?"

"Bem, primeiro você precisa alterar o nome do método, depois encontrar todos os locais no programa onde esse método é chamado e alterar o nome também."

"E como você encontraria esses lugares?"

"Eu apenas executava o programa e o IntelliJ IDEA me mostrava todos os lugares onde um método inexistente é chamado."

"Tudo bem. Mas agora suponha que todo método tenha um comentário explicativo (JavaDoc) que explica o que o método faz — e o antigo nome do método está escrito lá."

"Eu mudaria os comentários também."

"Mas também pode haver variáveis ​​cujos nomes estão associados ao nome do método. Seria bom alterá-los também:"

Antes Depois
Task task = manager.run();
Task asyncTask = manager.runDownloadTaskAsync();

"Sim, seria bom mudar os nomes dessas variáveis ​​também. Não faria mal."

"Bem, tudo isso pode ser feito em apenas alguns segundos usando o IntelliJ IDEA!"

"Você coloca o cursor sobre o nome do método (ou clica nele com o mouse), depois pressiona Shift+F6 e simplesmente começa a digitar o nome do método desejado."

"Aqui está um exemplo de edição de um nome de método."

"Começar a editar:"

IDEIA: refatoração - 1

"Especifique um novo nome:"

IDEIA: refatoração - 2

"Simplesmente insira um novo nome, pressione enter e pronto. Este método será renomeado em todos os lugares em que for chamado no projeto."

"O IntelliJ IDEA também costuma perguntar se você deseja renomear nomes de variáveis ​​e nomes de métodos nos comentários. Basta clicar em 'Sim' e tudo mudará."

"Além disso, se o projeto foi compilado antes dessa operação de refatoração, é garantido que será compilado após a refatoração."

"Parece muito promissor."

"A propósito, você pode alterar os nomes das variáveis ​​da mesma forma. Depois de clicar em um nome, basta pressionar Shift+F6 — você pode inserir um novo nome e o IntelliJ alterará o nome da variável sempre que for usado. "

"Se a variável for um campo em uma classe e tiver um getter e um setter, os nomes do getter e do setter também serão alterados para corresponder ao novo nome da variável."

"Tentei usando variáveis. Tudo funciona exatamente como você disse, Ellie. A refatoração é incrível!"

"Você acha que a refatoração é tudo? A refatoração é um tópico tão amplo — ainda nem arranhamos a superfície."

"Uau. O que mais tem?"

Truque de mágica nº 2: Extraia uma variável.

"Às vezes, certas expressões são repetidas com tanta frequência no código que você desejará movê-las para uma variável separada. Por exemplo:"

Código
public void printInfo(User user)
{
 System.out.println(user.getProfile().getName());
 System.out.println(user.getProfile().getAddress().getState());
 System.out.println(user.getProfile().getAddress().getCity());
 System.out.println(user.getProfile().getAddress().getStreet());
 System.out.println(user.getProfile().getAddress().getHomeNumber());
}
Como você quer que fique:
public void printInfo(User user)
{
 Address address = user.getProfile().getAddress();

 System.out.println(user.getProfile().getName());
 System.out.println(address.getState());
 System.out.println(address.getCity());
 System.out.println(address.getStreet());
 System.out.println(address.getHomeNumber());
}

"Ah."

"E o código pode ser muito mais complicado, com muitas partes repetidas."

"Os programadores não escrevem dessa forma intencionalmente. Mas muitas vezes você precisará adicionar algo a um método, depois outra coisa - e com o tempo o número de repetições dispara."

"Ao criar uma variável separada, podemos dar a ela um nome adequado e melhorar a legibilidade do código."

"Por exemplo, no exemplo acima, talvez não estejamos falando sobre um endereço residencial. Talvez estejamos falando sobre o endereço de um contato de emergência. Então você poderia chamar essa variável de emergênciaContactAddress, em vez de apenas endereço. Então, um programador vendo este código pela primeira vez vai entender o que está acontecendo aqui."

"Sim, concordo. Adicionar essas variáveis ​​faz sentido."

"Então como você faz isso?"

"Mover uma expressão para uma variável separada é muito simples."

Passo 1: Use o mouse para selecionar a expressão.

IDEIA: refatoração - 3

Passo 2: Pressione Ctrl+Alt+V

IDEIA: refatoração - 4

"Abre-se uma janela onde o IntelliJ IDEA nos pergunta se queremos substituir apenas a expressão selecionada ou todas as instâncias da expressão (4 ocorrências)?"

"Selecione a segunda opção para substituir todas as ocorrências (Substituir todas as 4 ocorrências)"

Passo 3: Pressione Enter.

IDEIA: refatoração - 5

"O IntelliJ IDEA solicitará que você insira um nome de variável. Ele também fará sua própria sugestão para o nome. Nada mal, hein?"

"Uh-huh. Certo. Também estávamos planejando nomear a variável 'endereço'. Como ela sabia?"

"Utilizando o nome do último método da expressão, que retorna um endereço. Assim, é provável que a variável seja utilizada para armazenar um endereço."

"Isso funcionou muito bem. Ótimas coisas, Ellie."

Truque de mágica nº 3: extraia o código em um método separado.

"Mas poderíamos ter feito outra coisa. Poderíamos ter declarado um novo método, por exemplo, printAddress (), e movido todo esse código para ele."

"Vamos tentar fazer isso."

Passo 1: Selecione as 4 linhas de código que usam a variável de endereço:

IDEIA: refatoração - 6

Passo 2: pressione Ctrl+Alt+M

IDEIA: refatoração - 7

"O IntelliJ IDEA determina quais variáveis ​​o método precisará e sugere como deve ser. "A única coisa que falta é inserir um nome para o método."

Etapa 3: Digite printAddress como o nome do método e pressione Enter.

IDEIA: refatoração - 8

"Como você gosta disso?"

"É incrível. O IntelliJ IDEA não apenas extraiu o código em um método separado, mas também adicionou todas as variáveis ​​necessárias. Além do mais, ele adivinhou todos os nomes corretamente."