6.1 함수 추출하기
코드 조각을 찾아 무슨 일을 하는지 파악한 다음, 독립된 함수로 추출하고 목적에 맞는 이름을 붙인다
독립된 함수로 묶을때, 길이나 재사용성 또는 한 화면을 넘어갈 때 등등 많은 기준들이 있다.
하지만 핵심은 ‘목적과 구현을 분리’하는 방식이다. 즉, 무슨일을 하는지 함수의 이름을 통해 파악하도록 하는 것이다.
(단, 함수의 이름이 잘 떠오르지 않으면 함수로 추출하면 안됨. 하지만 추출하는 과정에서 이름이 떠오를 수 있으니 일단 추출해 사용해보고 효과가 크지 않으면 인라인해서 써도 됨)
함수를 추출할 때, 원본 함수의 지역 변수를 참조하거나 추출한 함수의 유효범위를 벗어나는 변수는 없는지 검사하고, 있다면 매개변수로 전달한다. 또한 지역변수가 너무 많을 경우 변수 쪼개기나 임시 변수를 질의 함수로 바꾸기와 같은 리팩터링을 먼저 적용한다.
6.2 함수 인라인하기 (<-> 함수 추출하기)
함수 본문이 이름만큼 명확한 경우, 간접호출을 없애고 인라인한다.
인라인 시, 한문장 씩 단계를 잘게 나눠서 처리한다.
6.3 변수 추출하기 (<-> 변수 인라인하기)
표현식이 너무 복잡해서 이해하기 어려울 경우 사용됨. 지역변수를 활용하여 표현식을 쪼개 관리하기 쉽게 만들기
-> 이 과정에서 추가한 변수는 디버깅에 도움이 됨 (중단점 지정, 상태 출력)
변수 추출을 고려한다면, 이름을 붙일 떄 그 이름이 들어갈 문맥도 살펴야 한다. 현재 함수 안에서만 의미가 있다면 변수로 추출해도 좋지만, 더 넓은 범위에서 통용된다면 변수가 아닌 함수로 추출해야 한다.
-> 이러한 함수의 추출을 통해 객체는 특정 로직과 데이터를 외부와 공유하여 할 때 공유할 정보를 설명해주는 적당한 크기의 문맥이 되어준다.
6.4 변수 인라인하기
6.5 함수 선언 바꾸기
함수는 프로그램을 작은 부분으로 나누는 주된 수단이다. 또한 시스템의 구성요소를 조립하는 연결부 역할을 한다.
이러한 연결부에서 가장 중요한 요소는 함수의 이름이다. 이름이 좋으면 무슨일을 하는 지 파악할 수 있다.
함수의 매개변수도 마찬가지다. 매개변수는 함수가 외부 세계와 어우러지는 방식을 정의한다.
다형성을 구현한 클래스, 즉 상속 구조 속에 있는 클래스의 메서드를 변경할 때는 다형 관계인 다른 클래스들에도 변경이 반영되어야 한다. 먼저 원하는 형태의 메서드를 새로 만들어서 원래 함수를 호출하는 전달 메서드로 활용함.
6.6 변수 캡슐화하기
데이터는 변경시 참조하는 모든 부분을 한번에 바꿔야 코드가 제대로 작동하지만, 함수는 이름을 바꾸더라도 기존 함수를 그대로 둔 채 전달 함수로 활용할 수 있음. 그러므로 데이터로의 접근을 독점하는 함수를 만드는 식으로 캡슐화 하여 사용하면, 데이터 재구성이라는 어려운 작업을 단순하게 변환할 수 있다. 또한 데이터 캡슐화는 데이터 변경 전 검증이나 변경 후 추가 로직 구현이 쉽다. 변수는 private로 접근을 제한하고 캡슐화 해서 가시 범위를 제한하여 사용한다.
6.7 변수 이름 바꾸기
폭넓게 쓰이는 변수라면 변수 캡슐화하기
이름을 바꿀 변수를 참조하는 곳을 모두 찾아서, 하나씩 변경
6.8 매개변수 객체 만들기
데이터 뭉치를 데이터 구조로 묶으면 데이터 사이의 관계가 명확해짐
또한 코드를 더 근본적으로 바꿔줌
6.9 여러 함수를 클래스로 묶기
클래스는 데이터와 함수를 하나의 공유 환경으로 묶은 후, 다른 프로그램 요소와 어우러질 수 있도록 그중 일부를 외부에 공개한다. 공통 데이터를 중심으로 긴밀하게 엮여 작동하는 함수무리를 클래스로 묶어 함수들이 공유하는 공통 환경을 더 명확하게 표현할 수 있고, 각 함수에 전달되는 인수를 줄여서 객체 안에서의 함수 호출을 간결하게 만들 수 있다.
함수들이 공유하는 공통 데이터 레코드를 캡슐화한다.
공통 레코드를 사용하는 함수 각각을 새 클래스로 옮긴다.
데이터를 조작하는 로직들은 함수로 추출해서 새 클래스로 옮긴다.
6.10 여러 함수를 변환 함수로 묶기
변환 함수는 원본 데이터를 입력받아서 필요한 정보를 모두 도출한 뒤, 각각을 출력 데이터의 필드에 넣어 반환한다.
원본데이터가 코드 안에서 갱신될 때에는 클래스로 묶는 편이 낫다. 변환함수로 묶으면 가공한 데이터를 새로운 레코드에 저장하므로, 원본 데이터가 수정되면 일관성이 깨질 수 있기 때문이다.
묶을 함수 중 함수 하나를 골라서 본문 코드를 변환 함수로 옮기고, 처리 결과를 레코드에 새 필드로 기록한다.
6.11 단계 쪼개기
연이은 동작을 두 단계로 쪼개서 모듈을 분리하도록 만들고 한 곳에만 코딩을 집중하도록 함.
'Refactoring' 카테고리의 다른 글
[ 리팩토링 by 마틴 파울러 ] Chapter08. 기능 이동 (0) | 2021.07.22 |
---|---|
[ 리팩토링 by 마틴 파울러 ] Chapter07. 캡슐화 (0) | 2021.07.21 |
[ 리팩토링 by 마틴 파울러 ] Chapter04. 테스트 구축하기 (0) | 2021.07.21 |
[ 리팩토링 by 마틴 파울러 ] Chapter03. 코드에서 나는 악취 (0) | 2021.07.20 |
[ 리팩토링 by 마틴 파울러 ] Chapter02. 리팩터링 원칙 (0) | 2021.07.20 |