2. 리팩토링의 개론
3. 코드의 구린내
문서로 정리
4. 테스트 작성
리팩토링을 하기 위해서는 테스트가 필요하다
이런 테스트를 위해서는 리팩토링의의 자동화 기능이 갖춰져야 한다.
자가 테스트 코드의 가치
단위 테스트와 기능 테스트
이 프레임 워크는 단위 테스트 용이다. 단위 테스트의 목적은 프로그래밍 생산성 향상이다.
기능 테스트는 단위 테스트와 전혀 다르다 기능 테스트의 목적은 소프트 웨어 전반이 제대로 돌아가는지 확인하는 것이다.
5. 리팩토링 기법 카탈로그에 대해
카탈로그 부분의 각 리팩토링 기법은 다음과 같은 5 개의 하위 절로 구성했다
• 이를 :각종 리팩토링 기법을 구별하기 위한 필수적인 요소이며 카탈로그의 각 절 제목으로도 사용
했다
• 요약 :기법의 적용 시점과 목적을 설명한다. 이 부분을 보면 자신에게 필요한 리팩토링 기법을 더 빨
리찾을수있다
• 동기 :기법을 실시하는 이유와 실시하지 말아야 할 경우를 설영한다.
• 방법 :기법을 수행하는 절차를 단계적으로 간단명료하게 설명한다
• 예제 :기법의 원리를 이해하도록 간단한 리팩토링 사례를 보여준다
6. 메서드 정리
장황한 메서드에는 많은 정보가 들어 있는데 , 마구 얽힌 복잡한 로직에이 정보들이 묻혀버린다.
핵심적인 리팩토링 기법은 코드 뭉치를 별도의 메서드로 빼내는 메서드 추출이다
반대로 메서드 내용 직접 삽입은 호출되는 메서드의 내용을 호출하는 메서드에 직접 넣는 기법이다
여러 묶음의 코드를 개별 메서드로 빼내고 보니 그렇게만들어진 일부 메서드가 제 역할을 못하거나 그 메서드들을 쪼캔 방식을 바꿔야 할 때는 메서드 내용 직접 삽입기법을 적용해야 한다.
메서드 내용 직접 삽입
메서드 기능이 너무 단순해서 메서드영만 봐도 너무 뻔할 땐 그 메서드의 기능을 호출하는 메서드에 넣어버리고 그 메서드는 삭제하자
임시변수내용직접삽입
간단한 수식을 대입받는 임시변수로 인해 다른 리팩토링 기법 적용이 힘들 땐 그 임시 변수를 참조하는 부분을 전부 수식으로 치환하자.
임시변수를 메서드 호출로 전환
수시그이 결과를 저장하는 임시변수가 있을땐 그 수식을 빼내어 메서드로 만든후 임시변수 참조 부분을 전부 수식으로 교체하자. 새로 만든 메서드는 다른 메서드에서도 호출 가능핟.
직관적 임시 변수 사용
사용된 수식이 복잡할 땐 수식의 결과나 수익의 일부분을 용도에 부합하는 직관적 이름의 임시변수에 대입하자.
임시변수 분리
루프나 변수나 값 누적용 임시변수가 아닌 임시변수에 여러번 값이 대입될땐 각 대입마다 다른 임시변수를 사용하자.
매개변수로의 값 대입 제거
매개변수로 값을 대입하는 코드가 있을 땐 매개변수 대신 임시변수를 사용하게 수정하자 .
메서드를 메서드 객체로 전환
지역변수 때문에 메서드 추출을 적용할 수 없는 긴 메서드가 있을 땐 그 메서드 자체를 객체로 전환해서 모든 지역변수를 객4체의 필드로 만들자 그런다음 그 메서드 객체 안의 여러 메서드로 쪼개면 된다.
알고리즘 전환
알고리즘을 더 분명한 것으로 교체해야 할 땐 해당 메서드의 내용을 새알고리즘으로 바꾸자 .
07 객체 간의 기능 이동
외래 클래스에 메서드 추가 기법과 국소적 상속확장 클래스 사용
이두 기법은 클래스 원본 코드에 접근할 수 없는 상황에서 이 수정 불가능한 클래스로 기능을 이동해야 할 때만 실시한다. 메서드가 한두 개뿐일땐 외래 클래스에 메서드 추가 기법을 실시하고 메서드가 세개 이상일땐 국소적 상속 확장 클래스 사용 기법을 실시한다.
메서드 이동
메서드가 자신의 속한 클래스보다 다른 클래스의 기능을 더 많이 이용할 땐 그 메서드가 제일 많이 이용하는 클래스 안에서 비슷한 내용의 새 메서드를 작성하자. 기존 메서드는 간단한 대리 메서드로 전환하든지 아예 삭제하자
필드 이동
어던 필드가 자신이 속한 클래스보다 다른 클래스에서 더 많이 사용될 때는 대상 클래스 안에 새 필드를 선언하고 그 필드 참조 부분을 전부 새 필드 참조로 수정하자 .
클래스 추출
두 클래스가 처리해야 할 기능이 하나의 클래스에 들어 있을 땐 새 클래스를 만들고 기존 클래스의 관련 필드와 매서드를 새 클르스로 옮기자.
클래스 내용 직접 삽입
클래스에 기능이 너무 적을땐 그 클래스의 모든 기능을 다른 클래스로 합쳐 넣고 원래의 클래스는 삭제하자.
대리 객체 은폐
클라이언트가 객체의 대리 클래스를 호출할 땐 대리 클래스를 감추는 메서드를 서버에 작성하자 .
과잉 중개 메서드 제거
클래스에 자잘한 위임이 너무 많을 땐 대리 객체를 클라이언트가 직접 호출하게 하자 .
외래 클래스에 메서드 추가
사용중인 서버 클래스에 메서드를 추가해야 하는데 그 클래스를 수정할수 없을땐 클라이언트 클래스의 인스턴스를 첫번째 인자로 받는 메서드를 작성하자 .
국소적 상속 확장 클래스 사용
사용중인 서버 클래스에 여러개의 메서드를 추가해야 하는데 클래스를 수정할 수 없을땐 새 클래스를 작성하고 그 안에 필요한 여러개의 메서드를 작성하자.
이 상속확장 클래스를 원본 클래스의 하위 클래스나 래퍼 클래스로 만들자.
08 데이터 체계화
필드 자체 캡술화
필드에 집접 적근하던중 그 필드로의 결합에 문제가 생길땐 그 필드용 읽기/ 쓰기 메서드를 작성해서 두 메서드를 통해서만 필드에 접근하게 만들자.
데이터 값을 객체로 전환
데이터 항목에 데이터나 기능을 더 추가해야 할때는 데이터 항목을 객체로 만들자.
값을 참조로 전환
클래스에 같은 인스턴스가 많이 들어 있어서 이것들을 하나의 객체로 바꿔야 할땐 극 객체를 참조 객체로 전환하자.
참조를 값으로 전환
참조 객체가 작고 수정할 수 없고 관리하기 힘들 땐 그 참조 객체를 값 객체로 만들자 .
배열을 객체로 전환
배열을 구성하는 특정 원소가 결의별 의미를 지닐 땐 그 배열을 각 원소마다 필드가 하나씩 든 객체로 전환하자 .
관측 데이터 복제
도메인 데이터는 GUI 컨트롤 안에서만 사용 가능한데 도메인 메서드가 그 데이터 접근해야 할 땐 그 데이터를 도메인 객체로 복사하고 양측의 데이터를 동기화 하는 관측 인터페이스 옵져버를 작성하자 .
클래스의 단방향 연결을 양방향으로 전화 ㄴ
두 클래스가 서로의 기능을 사용해야 하는데 한방향으로만 연결되어 있을땐 역 포인터를 추가하고 두 클래스를 모두 업데잍 할수 있게 접근 한정자를 수정하자.
클래스의 양방향 연결을 단방향으로 전환
두 클래스가 양방향으로 연결되어 있는데 한 클래스가 다른 클래스의 기능을 더 이상 사용하지 않게 됐을 땐 불필요한 방향의 연결을 끊자 .
마법 숫자를 기호 상수로 전환
특수 의미를 지린 리터럴 숙자가 있을 땐 의미를 살린 이름의 상수를 작성한 후 리터럴 숙자를 그 상수로 교체하자 .
필드 캡술화
퍼블릭 필드가 있을땐 그 필드를 프라이뱃으로 만들고 필드용 일긱 메서드와 쓰기 메서드를 작성하자 .
컬렉션 캡술화
메서드가 컬랙션을 반환할 땐 그 메서드가 읽기전용 뷰를 반환하게 수정하고 추가 메서드와 삭제 메서드를 작성하자.
레코드를 데이터 클래스로 전환
전통적인 프로그래밍 환경에서 레코드 구조를 이용한 인터페이스 를 제공해야 할땐 레코드 구조를 저장할 덤 데이터 객체를 작성하자.
분류 부호를 클래스로 전환
기능에 형향을 미치는 숙자형 분류 부호가 든 클래스가 있을 땐 그 숫자를 새클래스로 바꾸자 .
분류 부호를 하위 클래스로 전환
클래스 기능에 형향을 주는 변경 불가 분류 부호가 있을땐 분류 부호를 하위 클래스로 만들자 .
분류 부호를 상태/ 전략 패턴으로 전환
분류 부호가 클래스의 기능에 형향을 주지만 하위 클래스로 전환할수 없을 땐 그 분류 부호를 상태 객체로 만들자.
하위 클래스를 필드로 전환
여러 하위 클래스가 상수 데이터를 반환하는 메서드만 다를 땐 각 하위 클래스의 메서드를 상위 클래스 필드로 전환하고 하위 클래스는 전부 삭제하자.
09 조건문 간결화
조건문 쪼개기
복잡한 조건문이 있을땐 if, then else 부분을 각각 메서드로 빼내자 .
중복 조건식 통합
여러 조건 검사식의 결과가 같을 땐 하나의 조건문으로 합치후 메서드로 빼내자 .
조건문의 공통 실행 코드 빼내기
조건문의 모든 절에 같은 실행 코드가 있을땐 같은 부분을 조건문 밖으로 빼자.
제어 플래그 제거
논리 연산식의 제어 플래그 역활을 하는 변수가 있을땐 그 변수를 Break문이나 Return 문으로 바꾸자 .
여러 겹의 조건문을 감시 절로 전환
메서드에 조건문이 있어서 정상적인 실행 경로르 파악하기 힘들 땐 모든 특수한 경우에 감시절을 사용하자.
조건문을 재정의로 전환
객체 타입에 따라 다른 기능을 실행하는 조건문이 있을땐 조건문의 각 절을 하위 클래스의 재정의 메서드 안으로 옮기고 원본 메서드는 ABSTRACT타입으로 수정하자.
NULL 검사를 널 객체에 위임
NULL 값을 검사흔ㄴ 코드가 계속 나올땐 NULL 값을 널 객체로 만들자.
어설션 넣기
일부 코드가 프로그램의 어떤 상태를 전제할 땐 어설션을 넣어서 그 전체를 확실하게 코드로 작성하자.
10 메서드 호출 단순화
메서드명 변경 Rename Method
매개변수 추가 Add Parameter
매개변수 제거 Remove Parameter
상태 변경 메서드와 값 반환 메서드를 분리 Separate Query from M。이fier
메서드를 매개변수로 전환 Pa때neterize Method
매개변수를 메서드로 전환 Replace Parameter with Explicit Methods “
객체를 통째로 전달 P rese이e Whole Object
매개변수 세트를 메서드로 전환 Replace Parameter with Method
매개변수 세트를 객체로 전환 Introduce Parameter Object
쓰기 메서드 제거 Remove Setting Method
메서드 은펴I Hide Method
생성자를 팩토리 메서드로 전환 Replace Constructor with Factory Method
하항 타입 변환을 캡슐화 Encaps미 ate Downcast
에러 부호를 예외 통지로 교체 Replace Error Code with Exception
예외 처리 를 테스트로 교체 Replace Exception with Test
11 일반화 처리
필드 상항 Pull Up Field
메서드 상항 Pull Up Method
생성자 내용 상항 Pull Up Constructor Body
메서드 하항 Push Down Method
펼드 하항 Push Down Field
하위클래스 추출 Extract Subclass
상위를래스 추출 Extract Superclass
인터페이스 추출 Extract Inte꺼ace
계층 병합 Collapse Hierarchy
템플릿 메서드 형성 Form Template Method ‘ “ “
상속을 위 임으로 전환 Replace Inheritance with Delegation
위임을 상속으로 전환 Replace Delegation with Inheritance
12 복합 리팩토링
상속 구조 정 리 Tease Apart Inheritance
절차 코드를 객체로 전환 Convert Procedural Design to Objects
도메인 로직을 표현과 문리 Separate Domain from Presentation
계층구조 추출 Extract Hierarchy
13 리팩토링 재사용 현실성
현실성 검토 ’ “ ‘
개발자가 리팩토링을 꺼리는 이유
현실성 다시 검토하기
리팩토링 자료와 참고문헌
소프트웨어 재사용과 기술 번경이 미치는 영향
끝 인사
14. 리팩토링 도구
도구를 이용한리팩토링
리팩토링 도구의 기술적 요건
리팩토링 도구의 실무적 요건
맺음말