언제 리팩터링을 해야 하나
앞으로 후술될 문제점의 해결책은 책 뒷부분에서 자세히 다룰 것이므로 대략적인 해결 방안과 책에서 제시한 리팩터링 기법의 이름만 적어 놓도록 하겠습니다.
기이한 이름
상황
함수 / 모듈 / 변수 / 클래스 등의 이름만 보고, 어떤 일을 하는지 알기 힘들 때 나는 경우 입니다.
코드는 단순 명료하게 작성 되어야 합니다.
명료한 코드를 만드는데 가장 중요한 위치를 차지하는것이 올바른 이름 짓는 것 입니다.
마땅한 이름이 생각나지 않는다면, 설계에 더 근본적인 문제가 숨어 있을 가능성이 높습니다.
해결책
이름을 알맞게 바꾸는 작업을 진행 합니다.
함수 선언 바꾸기
변수 이름 바꾸기
필드 이름 바꾸기
중복 코드
상황
똑같은 코드 구조가 여러곳에서 반복 되는 경우입니다.
코드 구조가 중복되면, 각각을 볼 때 마다 차이점은 없는지 주의깊게 보아야 하는 부담이 생깁니다.
하나를 변경 할 때에, 비슷한 구조의 다른 코드들도 모두 변경 해 주어야 합니다.
해결책
한 클래스에 딸린 두 메서드가 같은 표현식을 사용한다면
함수 추출하기
코드가 비슷하긴 한데, 완전히 똑같지는 않다면
문장 슬라이드 하기
같은 부모로 부터 파생된 서브클래스들에 코드가 중복되어 있다면
메서드 올리기
긴 함수
상황
하나의 함수가 지나치게 긴 영역을 차지 하는 경우에 해당됩니다.
함수가 길다는 것은, 해당 함수가 너무 많은 일을 하고 있는것은 아닌지 의심 해 보아야 합니다.
상황에 대한 팁
주석을 달아야 할 만한 부분을 모두 함수로 분리합니다.
코드가 단 한줄이라도 따로 설명할 필요가 있다면 함수로 추출하는것이 좋습니다.
해결책
함수를 짧게, 좋은 코드 덩어리로 만들기
함수 추출하기
매개변수, 임시변수가 너무 많아지는것 방지하기
임시 변수를 질의 함수로 바꾸기
매개변수 객체 만들기
객체 통째로 넘기기
여전히 임시 변수, 매개 변수가 너무 많은 경우
함수를 명령으로 바꾸기
조건문, 반복문을 리팩터링 하기
조건문 분해하기
조건문을 다형성으로 바꾸기
반복문 쪼개기
긴 매개변수 목록
상황
함수에 필요한 것들을 전무 매개변수로 전달하는데, 이 매개변수 목록이 너무 많은 경우에 해당됩니다.
전역 데이터를 적게 사용하기 위해, 매개변수를 많이 전달하는 경우가 잦아 져 해당 상황이 발생 할 수 있습니다.
해결책
다른 매개변수에서 값을 얻어올 수 있을때
매개변수를 질의 함수로 바꾸기
사용 중인 데이터 구조에서 값들을 뽑아 각각을 별개의 매개변수로 전달하는 경우라면
객체 통째로 넘기기
항상 함께 전달되는 변수가 있다면
매개변수 객체 만들기
함수의 동작 방식을 정하는 플래그 역할의 매개변수가 있다면
플래그 인수 제거하기
여러 개의 함수가 특정 매개변수의 값을 공통으로 사용하고 있다면
여러 함수를 클래스로 묶기
전역 데이터
상황
전역 데이터를 사용하는 경우에 해당됩니다.
전역변수는 코드베이스 어디에서든 건드릴 수 있고, 누가 값을 바꾸었는지 찾아 낼 메커니즘이 없는 것이 문제의 원인입니다.
싱글톤 클래스를 활용할 때에도 문제가 생길 수 있습니다.
특히, 전역 변수가 mutable 한 경우에 더 문제가 큽니다.
해결책
다른 코드에서 전역 변수를 변경 할 수 있는 경우
함수 캡슐화 하기
가변 데이터
상황
데이터의 값을 변경 할 수 있는 경우에 해당 됩니다.
데이터의 값이 변경됨으로써 원하지 않는 결과가 나올 수 있음을 유의하고 개발을 진행해야 합니다.
함수형 프로그래밍에서 처럼, 변수를 변경하는것은 불가능하고, 데이터를 변경하려면 데이터의 복사본을 변경하여 반환 하는 것이 제일 안전합니다.