5.1 유사한 클래스 통합하기
- 반복작업을 자꾸 시켜서 손목이 아프다
- 비슷한 성격을 가진 두 객체의 동작이 거의 다르지 않다면, 하나로 만들되
if/else
를 사용하지 말고 만들자
- 책에서는 처음엔 enum으로 바꿨다가 interface로 바꿨는데 이러한 패턴을 “클래스로 타입 코드 대체” 라고 한다.
- 사실 뭐 이름이 중요한가 싶다. 일일이 외우기 보단 손가락으로 익히는 게 맞는거 같다.
https://github.com/FiveLinesofCodeStudy/2D-Puzzle-Compose/commit/e9b2b43b5f101de142aaf656edcc2e6365af320e
유사 클래스 통합 절차
- 모든 비기준 메서드를 동일하게 만드는 것
- 각 메서드 버전 본문의 기존 코드 주위에 if (true) {}를 추가한다.
- true를 모든 기본 메서드를 호출하여 그 결과를 상수 값과 비교하는 표현식으로 바꾼다.
- 각 버전의 본문을 복사하고 else와 함께 다른 모든 버전에 붙여 넣는다.
- 기준 메서드에 대한 필드를 도입하고 생성자에서 상수를 할당하는 것으로 시작한다.
- 상수 대신 도입한 필드를 반환하도록 메서드를 변경한다.
- 문제가 없는지를 확인하기 위해 컴파일
- 각 클래스에 대해 한 번에 하나의 필드씩 다음을 수행한다.
- 필드의 기본값을 매개변수로 지정하게 한다.
- 컴파일러 오류를 살펴보고 기본값을 인자로 전달한다.
- 모든 클래스가 동일하면 통합한 클래스 중 하나를 제외한 모두를 삭제하고, 삭제하지 않은 클래스로 바꾸어 모든 컴파일러 오류를 수정한다.
5.2 단순한 조건 통합하기
- if 문 갯수 줄이는 것은 정말 좋은 방법인 것 같다.
절차
- 본문이 실제로 동일한지 확인한다.
- 첫 번째 if 문의 닫는 괄호와 else if 문의 여는 괄호 사이의 코드를 선택하고 삭제한 후
||
을 삽입한다. if 뒤에 여는 괄호를 삽입하고 {
앞에 닫는 괄호를 삽입한다. 동작을 변경하지 않도록 항상 표현식을 괄호로 묶는다.
5.3 복잡한 조건 통합하기