–구린내 나는 코드 (응집도가 낮고 결합도가 높은 코드)
- 중복 코드 – 메소드 추출, 템플릿 메서드 형성, 알고리즘 전환,클래스 추출, 모듈 추출
- 장황한 메서드 – 메소드를 쪼갬, 메소드명은 기능자체를 나타내는 이름으로 정해야함, 임시변수를 베소드 호출로 전환, 메서드 체인으로 전환, 객체로 전환, 조건문 쪼개기, 컬렉션 클로저 메소드로 전환
- 방대한 클래스 – 인스턴스 변수 제거를 위한 클래스 추출, 하위 클래스 추출, 모듈 추출, 인터페이스 추출, 관츨 데이터의 복제
- 과다한 매개 변수 – 매개 변수가 너무 많으면 일관성이 없어지고 지속적인 수정이 발생, 메서드로 전환
- 수정의 산발 – 수정 points를 개발자가 찾을 수 없는 상황. 변경 객체로 분리, 클래스 추출
- 기능의 산재 – 수정할때 같은 곳을 여러번 고쳐야할 때. 메서드 이동, 필드 이동으로 수정 points를 하나의 클래스에 넣어야함. 클래스 내용 직접 삽입
- 잘못된 소속 – 메서드가 자신이 속하지 않은 클래스에서 더 많이 호출 될때. 메서드 이동, 메서드 추출, 방문자 패턴/전략 패턴은 예외
- 데이터 뭉치 – 데이터 뭉치가 여러 위치에 몰려 있는 경우. 클래스 추출, 객체로 전환, 객체를 통째로 전달
- 강박적 기본 타입 사용 – 데이터 값을 객체로 전환, 클래스로 전환,상태/전략 패턴으로 전환
- switch문 – 메서드 추출, 하위 클래스로 전환, 상태/전략 패턴으로 전환, switch문은 재정의가 필요
- 평형 상속 계측 – 메서드 이동, 필드 이동
- 직무유기 클래스 – 기능이 축소된 클래스, 사용하지 않는 클래스, 계층 병합, 클래스 내용 직접 삽입
- 막연한 범용 코드 – 향후 사용을 대비해 준비하지만 결국 직무유기 클래스가 되는 경우. 계층 변합, 클래스 내용 직접 삽입, 메서드명 변경
- 임시 필드 – 특정 상황에서만 사용되는 필드, null 객체에 위임, 클래스 추출
- 메세지 체인 – 연속적인 메세지간의 호출. 대리 객체 은폐, 메서드 추출, 메서드 이동으로 체인 아래로 이동시킴
- 과잉 중개 메서드 – 과잉 중개 메서드 제거, 내용 직접 삽입, 위임을 상속으로 전환(하위클래스 전환)
- 지나친 관여 – 메서드 이동, 필드 이동, 대리 객체 은폐, 상속을 위임으로 전환
- 인터페이스가 다른 내용 클래스 – 메서드명 변경 , 상위 클래스 추출
- 미흡한 라이브러리 클래스 – 외부 클래스 메서드 추가, 상속 확장 클래스
- 데이터 클래스 – 메서드 이동, 메서드 추출
- 방치된 상속물 – 메서드 하향, 필드 하향, 상속을 위임으로 전환
- 불필요한 주석 – 구린내 나는 코드를 장호아한 주석으로 가리는것은 금지. 메서드 추출, 메서드명 변경을 통해 주석이 아닌 코드로 기능을 설명할 수 있어야 함.
리팩토링 : 코드품질을 개선하는 객체지향 사고법