들어가며
본 게시글은 사내 스터디로 공부한 리팩터링 2판 (마틴 파울러) 3장을 정리 & 요약하는 글입니다.
매 챕터마다 돌아가며 설명을 했기 때문에, 본인이 정리한 일부 주제들만 정리했습니다. (나머지 내용은 추후 업데이트 예정)
Chapter 03. 코드에서 나는 악취
3.3 긴 함수
- 필자의 경험에 따르면, 오랜 기간 잘 활용되는 프로그램은 하나같이 짧은 함수로 구성됨
- 코드가 끝없이 위임하는 방식으로 작성됨.
- 간접 호출의 효과를 볼 수 있음 (코드를 이해, 공유, 선택하기 쉬워짐)
- 짧은 함수로 구성된 코드를 이해하기 쉽게 만드는 가장 확실한 방법은 ‘좋은 이름’ 임
- 이를 위해서는 적극적으로 함수를 쪼개야 함
- 주석을 달아야 할 만한 부분은 무조건 함수로 만들어야 함
- 따라서, 함수 이름은 동작 방식이 아닌, ‘의도’가 드러나게 지어야 함. 핵심은 함수의 길이가 아닌, 함수의 목적
- ‘무엇을 하는지’를 코드가 잘 설명해주지 못할수록 함수로 만드는게 유리함
-
함수를 짧게 만드는 작업의 99%는 ‘함수 추출하기’
- 단, 함수가 매개 변수와 임시 변수를 너무 많이 사용하면, 오히려 리팩터링 전보다 난해해 질 수 있음
- 해결방안: 임시 변수를 질의 함수로 바꾸기 / 매개변수 객체 만들기 / 객체 통째로 넘기기 / 함수를 명령으로 바꾸기
그렇다면 추출할 코드 덩어리는 어떻게 찾나?
- **‘주석’**을 찾아서 주석이 설명하는 코드를 함수로 빼내고, 함수 이름은 주석 내용을 토대로 짓는게 좋다.
- 조건문, 반복문도 추출 대상이 될 수 있다.
- 조건문은 조건문 분해하기, 반복문은 반복문 쪼개기로 적용해서 분리
3.4 긴 매개변수 목록
- 예전에는 함수에 필요한 것들을 모조리 매개 변수 로 전달하는 방식으로 개발함
- 하지만, 매개변수 목록이 길어지면 그 자체로 이해하기 어려움
- 예를 들어, 종종 다른 매개 변수에서 값을 얻어오는 매개 변수가 있음
- 이는 매개 변수를 질의 함수로 바꾸기로 제거할 수 있음
- 그 외에도, ‘객체 통째로 넘기기’, ‘매개변수 객체 만들기’, ‘플래그 인수 제거하기’ 등의 방법이 있음
- **‘클래스’**는 매개변수 목록을 줄이는데 효과적인 수단임
- 여러 개의 함수가 특정 매개 변수들의 값을 공통으로 사용할 때 유용
- 이때, “여러 함수를 클래스로 묶기” 를 이용해서 공통 값들을 클래스의 필드로 정의
3.5 전역 데이터
- **‘전역 데이터’**를 주의해야 한다는 말을 흔히 들을 수 있음
- 코드베이스 어디에서든지 건드릴 수 있고, 값을 누가 바꿨는지 찾아낼 방법이 없음 (디버깅 매우 어렵)
전역 데이터란? 주로 전역 변수이며, 클래스 변수, 싱글톤에서도 같은 문제 발생
- 전역 데이터 문제를 해결하려면? “변수 캡슐화하기”
- 다른 코드에서 오염시킬 수 있는 데이터를 발견할 때마다 적용
- 데이터를 함수로 감싸는 것만으로도 데이터를 수정하는 부분을 쉽게 찾고, 접근을 통제할 수 있음
무엇이든 많이 복용하면 독이 될 수 있다 - 파라켈수스
- 이 말은 전역 데이터에도 적용됨. 전역 데이터 많아지면 걷잡을 수 없음
- 전역 데이터는 조금만 있더라도 캡슐화하자!