# 개요
리팩토링 6장, 메서드 정리 부분 읽고 간단 정리
각 카탈로그에서 설명하는 내용 중 중요하게 생각하는 부분 작성하고 내 생각도 덧붙임
코드 작성하다가 이 예시가 이거구나 싶을 때는 예시코드도 붙일 예정
# 메서드 정리
리팩토링의 주된 작업은 코드를 포장하는 메서드를 적절히 정리하는 것이다.
- 매우 동의한다. 메서드가 길어지면 읽기도, 이해하기도 힘들어진다. 메서드는 짧아야하고 그 메서드가 하는 기능이 메서드 이름으로 명확하게 드러나야 한다고 생각한다.
- 메서드가 점점 길어진다는 것은 메서드가 하나의 기능이 아니라 여러 기능을 하게 된다는 뜻이다. 그러므로 메서드 추출을 통해 추상화하자.
메서드 추출에서 가장 힘든 작업은 지역변수를 처리하는 것인데, 그건 주로 임시변수 때문이다.
- 나는 잘 와닿지 않는게, 요즘 IDE에서 리팩토링 기능을 많이 지원해준다. 그래서 내가 메서드 추출하고 싶은 부분을 드래그해서 몇번 '딸깍'하면 어느 변수를 매개변수로 보낼지, 어느 변수에 반환값을 대입해줘야 하는지 잘 지원해준다.
- 물론 변수가 많아지면 IDE가 제공해주는 기능을 쓰기 어려울 때도 있다. 더 좋은 방법이 있을 수 있겠지만, 나는 메서드 내의 지역변수들을 전부 클래스 필드로 올려버린다. 그 이후에 메서드 추출과정에서 지역변수로 보내거나 쿼리 메서드로 바꾸는 작업을 한다.
직관적인 이름의 간결한 메서드가 좋은 이유
- 메서드가 적절히 잘게 쪼개져 있으면 다른 메서드에서 쉽게 사용할 수 있다.
- 상위 계층의 메서드에서 주석같은 더 많은 정보를 읽어들일 수 있다.
- 재정의 하기도 훨씬 수월하다.
- 1번에 "다른 메서드에서 쉽게 사용할 수 있다" 라는 내용을 보고 생각난 건데, 옛날에는 꼭 다른 여러 메서드에서 사용하기 위해 메서드 추출을 해야한다고 생각했다. 그래서 "하나의 메서드에서만 사용하는데 굳이 메서드 추출할 필요가 있을까?" 라는 생각도 했었는데, 메서드의 호출 횟수에 따라 메서드를 추출 해야한다는 것은 엉터리같은 생각이었다.
중요한 것은 메서드의 길이가 아니라 메서드 이름과 메서드 내용의 의미적 차이라고 할 수 있다.
- 맞는 표현인지 모르겠는데 추상화 레벨이 같아야한다는 의미같다.
- 예전에 유튜브에서 백명석의 클린 코더스 영상에서 비슷한 내용을 들은것 같다.. 나중에 참고해서 내용추가하자..
리팩토링의 핵심은 의도한 기능을 하눈ㄴ에 파악할 수 있는 직관적인 메서드명을 사용하는 것과 메서드를 간결하게 만드는 것이다.
## Extract Method (메서드 추출)
메서드 추출 기법은 제일 많이 사용된다.
- 가장 많이 사용되고, 가장 쉽게 할 수 있는 리팩토링 중 하나라고 생각한다.
메서드가 너무 길거나 코드에 주석을 달아야만 의도를 이해할 수 있을 때 별도의 메서드를 만든다.
- "이 부분이 무슨 기능을 한다" 라고 주석을 달지 말고 메서드로 추출하자.
## Inline Method (메서드 대신 내용 직접 삽입)
간혹 메서드명에 모든 기능이 반영될 정도로 메서드 기능이 지나치게 단순할 때가 있다.
- 나는 보통 조건문 작성할 때 이런 상황이 많이 생기는데, 자주 고민한다. 보통은 메서드로 추출하는 편이긴한데 그러고 또 한참 고민한다.. 너무 어렵..
## Inline Temp (임시 변수 내용 직접 삽입) && Replace Temp with Query (임시변수를 메서드 호출로 전환)
임시변수를 메서드 호출로 수정하면 클래스 안의 모든 메서드가 그 정보에 접근할 수 있다. 이렇게 하면 클래스의 코드가 훨씬 깔끔해진다.
- 코드 작성할 땐 임시변수에 어떤 값이 저장되어 있는지 확인하기 위해 임시변수에 값을 대입해놓는다. 제대로 동작하는 것을 확인 한 후에는 임시변수를 지워버리고 메서드 호출로 대체한다.
## Introduce Explaining Variable (직관적 임시변수 사용)
수식이 너무 복잡해져서 이해하기 힘들 수 있다. 이럴 때는 임시변수를 사용하면 더 처리하기 쉽게 쪼갤 수 있다.
## Split Temporary Variable (임시변수 분리)
한 임시 변수에 여러 값을 대입하지 마라
- 이건 너무 당연한 얘기라.. 예를 들어 임시변수 하나 생성해서 둘레, 면적을 같이 대입하면 안되고, 둘레를 저장하는 임시변수와 면적을 저장하는 임시변수 따로 선언해야한다는 얘기이다.
## Replace Method with Method Object (메서드를 메서드 객체로 전환)
지역변수 때문에 메서드 추출을 적용할 수 없는 긴 메서드가 있을 때 그 메서드 자체를 클래스로 만들어서 모든 지역변수를 클래스의 필드로 만들고 클래스 내의 여러 메서드로 쪼갠다.
- IDE 도움을 받기 힘들 때 내가 하는 방법과 비슷한것 같다.
## 내 생각
몇몇 기법들은 카탈로그 제목만 보고 "이게 뭐지?" 라는 생각이었는데 예제를 보니까 내가 의식하지 않아도 당연하게 하고 있었던 기법들이었다. 당연한 만큼 간결하고 깔끔한 코드 작성을 위해서 이 챕터의 내용들이 기본이 되어야 한다고 생각한다.
'Refactoring > Refactoring 정리' 카테고리의 다른 글
[Refactoring] 9장 조건문 간결화 (1) | 2024.02.05 |
---|---|
[Refactoring] 8장 데이터 체계화 (1) | 2024.02.05 |
[Refactoring] 리팩토링 7장 객체 간의 기능 이동 (1) | 2024.01.23 |