프로그래밍 관련 도서

[프로그래밍 관련 도서] 자바로 배우는 리팩토링 입문

hansulin922 2024. 9. 2. 15:21

리팩토링 : 
외부에서 보는 동작은 바꾸지 않고 내부 구조를 개선
버그 수정과 기능 추가를 수월하게 만듦.

리팩토링이 필요한 부분 
1. 이해하기 어려운 부분
2. 수정하기 어려운 부분
3. 확장하기 어려운 부분

-중복 코드 
여러 장소에 비슷한 코드가 흩어져 있는 상태
겹치는 코드를 발견하면 합칠 수 있는 걸 찾아서 메서드 추출이나 클래스 추출 리팩토링을 검토.
null 확인이 이곳저곳에 존재한다면 널 객체 도입. 
에러 확인이 많다면 에러 코드를 예외로 치환.
-너무 긴 메서드
코드 모음을 정리해서 새 메서드로 만드는 메서드 추출 리팩토링.
-방대한 클래스
클래스가 너무 크다는 것은 클래스가 담당하는 책임이 과다하다는 의미.
책임별로 클래스를 나누는 클래스 추출 리팩토링을 검토.
-클래스 개수가 많은 경우
중개자 제거, 클래스 인라인화, 메서드 인라인화 등을 검토.
-메서드명 변경


1.1.1 매직 넘버를 기호 상수로 치환
의미를 알기 어려움, 매직 넘버가 여러 곳에 있으면 변경이 어려움.
>특정한 숫자 대신 의미를 알 수 있는 이름을 사용.

방법
1. 기호 상수 선언하기
기호 상수 선언, 
매직 넘버를 기호 상수로 치환,
기호 상수에 의존하는 다른 매직 넘버를 찾아서 기호 상수를 사용한 표현식으로 변환,
컴파일

2. 테스트 


2.1.1 제어 플래그 삭제
처리 흐름을 제어할 때 사용하는 플래그. 
boolean 변수 true, false라는 두 상태를 표현
제어 플래그 대신 break, countinue, return 등을 써서 처리 흐름을 제어.


3.1.1 Assertion 도입
코드 속에 성립해야 할 조건이 있을 때. 
방법
1) 소스 코드에서 '성립해야 할 조건' 찾기
2) 조건을 포함한 어서션 작성

ex. assert >0;
조건이 맞지 않으면 자바 실행 환경은 java.lang.AssertionError 예외 발생.


4.1.1 Null 객체 도입

5.1.1 메서드 추출
기존 메서드에서 묶을 수 있는 코드를 추출해서 새로운 메서드를 작성함

 

9. 분류 코드를 상태/전략 패턴으로 치환

*분류 코드를 치환하는 세 가지 방법
-분류 코드를 클래스로 치환
-분류 코드를 하위 클래스로 치환
: 분류 코드에 따라 클래스 동작이 다를 때 사용하는 리팩토링, 
분류 코드에 따라 하위 클래스를 만들고 동작 차이는 오버라이드한 메서드의 처리차이로 표현.
-분류 코드를 상태/전략 패턴으로 치환 

11. 생성자를 팩토리 메서드로 치환(Replace Constructor with Factory Method) 

12. 관측 데이터 복제 
한 클래스에 모델과 뷰가 뒤섞여 있다면 둘을 분리. 
그러고 나서 관찰자 패턴과 이벤트 리스너를 사용해서 모델과 뷰를 동기화.

모델과 뷰가 한 클래스 안에 뒤섞여 있으면 관측 데이터 복제를 검토한다.
모델과 뷰를 분리하면 클래스의 책임이 명확해진다.

14 대리자 은폐(Hide Delegate) 리팩토링

15 상속 구조 정리 
클래스 계층 하나가 여러 책임을 담당하면 상속 관계가 엉키는 원인. 
그럴 때는 상속을 분할해서 위임으로 두 상속 관계를 느슨하게 묶는다.

*상속과 @Override
상위 클래스의 메서드를 오버라이드한다는 사실을 표시하기 위해 메서드 앞에 @Override를 붙임.
클래스 선언을 볼 때 @Override가 붙어 있는 메서드들을 살펴보는 게 좋음. 
@Override 존재 여부에 주목하면 해당 클래스와 상위 클래스 관계를 다시 생각해 볼 수 있음.

 

+참고하면 좋은 책

- 마틴 파울러 '리팩토링 : 코드 품질을 개선하는 객체지향 사고법
- 'Java 언어로 배우는 디자인 패턴 입문, 개정판

- 패턴을 활용한 리팩터링