"안녕하세요."

"안녕!"

"오늘은 리팩토링에 대해 말씀드리겠습니다. 리팩토링은 기능을 변경하지 않고 프로젝트의 코드를 변경하는 것입니다."

"근데 그게 어떻게 가능해?"

"음, 가장 간단한 경우에는 변수 및/또는 메서드의 이름을 바꿀 수 있습니다. 결국 변수 이름을 변경한다고 해서 프로그램이 다르게 작동하지 않습니까?"

"당연히 아니지."

" 대형 메서드를 여러 개의 작은 메서드로 나눌 수도 있습니다. "

" 반복되는 코드 스니펫을 별도의 메서드로 가져올 수 있습니다 . "

"일부 함수는 정적으로 선언된 다음 유틸리티 클래스로 이동할 수 있습니다."

"그러나 이것은 리팩토링에 대한 좁은 해석입니다."

"리팩토링은 때때로 새로운 기능을 추가하지 않고 프로젝트의 아키텍처를 다시 작성(개선)하는 것을 의미합니다. 이것은 넓은 의미에서 리팩토링입니다."

"IntelliJ IDEA는 매우 강력한 리팩토링 도구를 최초로 도입했기 때문에 특히 가장 인기 있는 통합 개발 환경(IDE)이 되었습니다."

"이 마법의 도구는 무엇입니까?"

마술 트릭 #1: 메서드 이름을 변경합니다.

"코드에 100-500개의 서로 다른 위치에서 호출되는 메서드가 있다고 상상해 보세요. 이름을 더 이해하기 쉬운 이름으로 변경하기로 결정했습니다. 그것이 run()이고 runDownloadTaskAsync()가 되기를 원한다고 가정해 보겠습니다. 얼마나 빨리 할 수 있니?"

"음, 먼저 메소드의 이름을 변경해야 합니다. 그런 다음 해당 메소드가 호출되는 프로그램의 모든 위치를 찾고 거기에서도 이름을 변경해야 합니다."

"그러면 그 장소를 어떻게 찾을 수 있습니까?"

"프로그램을 실행하면 IntelliJ IDEA가 존재하지 않는 메서드가 호출되는 모든 위치를 보여줍니다."

"좋아요. 하지만 이제 모든 메서드에 해당 메서드가 수행하는 작업을 설명하는 설명 주석(JavaDoc)이 있고 이전 메서드 이름이 거기에 기록되어 있다고 가정합니다."

"나도 의견을 바꾸겠습니다."

"그러나 이름이 메서드 이름과 관련된 변수도 있을 수 있습니다. 그것들도 변경하는 것이 좋을 것입니다."

전에 후에
Task task = manager.run();
Task asyncTask = manager.runDownloadTaskAsync();

"그래, 그 변수들의 이름도 바꾸면 좋을 텐데. 나쁘지 않을 거야."

"음, IntelliJ IDEA를 사용하면 이 모든 작업을 단 몇 초 만에 수행할 수 있습니다!"

"방법 이름에 커서를 놓고(또는 마우스로 클릭) Shift+F6 을 누르고 원하는 방법 이름을 입력하기만 하면 됩니다."

"여기에 메서드 이름을 편집하는 예가 있습니다."

"수정 시작:"

아이디어: 리팩토링 - 1

"새 이름 지정:"

아이디어: 리팩토링 - 2

"새 이름을 입력하고 Enter 키를 누르기만 하면 됩니다. 이 메서드는 프로젝트에서 호출되는 모든 위치에서 이름이 변경됩니다."

"IntelliJ IDEA는 일반적으로 주석에서 변수 이름과 메서드 이름을 바꿀지 묻습니다. '예'를 클릭하면 모든 것이 변경됩니다."

"또한 프로젝트가 이 리팩토링 작업 전에 컴파일된 경우 리팩토링 후에 컴파일이 보장됩니다."

"매우 유망한 것 같군요."

"그런데 변수 이름도 같은 방식으로 변경할 수 있습니다. 이름을 클릭한 후 Shift+F6을 누르기만 하면 됩니다. 그런 다음 새 이름을 입력하면 IntelliJ가 변수 이름을 사용할 때마다 변경합니다. "

"변수가 클래스의 필드이고 게터와 세터가 있는 경우 게터와 세터의 이름도 변수의 새 이름과 일치하도록 변경됩니다."

"변수를 사용해 봤습니다. Ellie 님이 말씀하신 대로 모든 것이 작동합니다. 리팩토링은 굉장합니다!"

"그게 리팩토링의 전부라고 생각하십니까? 굴절은 매우 광범위한 주제입니다. 우리는 표면을 긁지도 않았습니다."

"와우. 또 뭐가 있어요?"

마술 #2: 변수를 추출합니다.

"때로는 특정 표현식이 코드에서 너무 자주 반복되어 별도의 변수로 옮기고 싶을 때가 있습니다. 예를 들면 다음과 같습니다."

암호
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());
}
원하는 모양:
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());
}

"아."

"그리고 코드는 반복되는 부분이 많아 훨씬 더 복잡할 수 있습니다."

"프로그래머는 의도적으로 그런 식으로 작성하지 않습니다. 하지만 종종 메서드에 무언가를 추가한 다음 다른 것을 추가해야 합니다. 시간이 지남에 따라 반복 횟수가 급증합니다."

"별도의 변수를 생성함으로써 적절한 이름을 부여하고 코드의 가독성을 높일 수 있습니다."

"예를 들어, 위의 예에서 우리는 집 주소에 대해 이야기하고 있지 않을 수 있습니다. 아마도 우리는 비상 연락처의 주소에 대해 이야기하고 있을 것입니다. 그러면 이 변수를 단순히 주소 대신에 emergencyContactAddress라고 부를 수 있습니다. 그런 다음 프로그래머는 이 코드를 처음 보면 여기서 무슨 일이 일어나고 있는지 이해할 수 있을 것입니다."

"예, 동의합니다. 그러한 변수를 추가하는 것이 합리적입니다."

"그래서, 어떻게 합니까?"

"표현식을 별도의 변수로 옮기는 것은 매우 간단합니다."

1단계: 마우스를 사용하여 표현식을 선택합니다.

아이디어: 리팩토링 - 3

2단계: Ctrl+Alt+V 누르기

아이디어: 리팩토링 - 4

"IntelliJ IDEA에서 선택한 표현식만 바꿀지 아니면 표현식의 모든 인스턴스(4회 발생)를 바꿀지 묻는 창이 열립니다."

"모든 항목을 바꾸려면 두 번째 옵션을 선택하십시오(4개의 항목 모두 바꾸기)"

3단계: Enter 키를 누릅니다.

아이디어: 리팩토링 - 5

"IntelliJ IDEA는 변수 이름을 입력하라는 메시지를 표시합니다. 또한 자체적으로 이름을 제안합니다. 나쁘지 않죠?"

"어허. 그렇구나. 우리도 변수 'address'에 네이밍을 할 생각이었다. 그게 어떻게 알았지?"

"식에서 주소를 반환하는 마지막 메서드의 이름을 사용합니다. 따라서 변수가 주소를 저장하는 데 사용될 가능성이 높습니다."

"정말 잘 됐어. 잘했어, 엘리."

마술 #3: 별도의 메서드로 코드를 추출합니다.

"하지만 우리는 다른 일을 할 수 있었습니다. 예를 들어 printAddress () 와 같은 새로운 메서드를 선언 하고 이 코드를 모두 이 메서드로 옮길 수 있었습니다."

"그렇게 해보자."

1단계: 주소 변수를 사용하는 4줄의 코드를 선택합니다.

아이디어: 리팩토링 - 6

2단계: Ctrl+Alt+M 누르기

아이디어: 리팩토링 - 7

"IntelliJ IDEA는 메소드에 필요한 변수를 결정하고 어떻게 보일지 제안합니다. "남은 유일한 것은 메소드의 이름을 입력하는 것입니다."

3단계: 메서드 이름으로 printAddress를 입력하고 Enter 키를 누릅니다.

아이디어: 리팩토링 - 8

"어때요?"

"대단합니다. IntelliJ IDEA는 코드를 별도의 메서드로 추출했을 뿐만 아니라 필요한 모든 변수도 추가했습니다. 게다가 모든 이름을 정확하게 추측했습니다."