자바 리팩토링

바퀴달린 개발자·2021년 12월 8일

리팩토링이란?

: 외부에서 보는 프로그램 동작은 바꾸지 않고 프로그램의 내부 구조를 개선하는 것.
-> 리팩토링을 해도 동작이 변하면 안된다.

리팩토링의 목적

  1. 버그를 발견하기 쉽게 만든다.
  2. 기능을 추가하기 쉽게 만든다.
  3. 코드 리뷰가 쉬워진다.

리팩토링과 악취

악취란?

: 프로그램에서 리팩토링이 필요한 부분을 '악취'가 난다고 표현한다.

  • 이해하기 어려운 부분
  • 수정하기 어려운 부분
  • 확장하기 어려운 부분
    을 악취라고 한다.

코드의 악취

  • 중복 코드
  • 너무 긴 메서드
  • 방대한 클래스
  • 과다한 매개변수
  • 사양 변경이 있을 때 수정 내용이 곳곳에 흩어져 있을 때
  • 어떤 클래스를 수정하면 다른 클래스도 수정해야할 때
  • 언제나 다른 클래스 내용을 수정하는 클래스가 있을 때
  • 합쳐서 다뤄야 할 데이터가 한 클래스에 모여있지 않을 때
  • 클래스를 만들지 않고 기본 타입만 사용할 때
  • switch 문이나 if문으로 동작을 나눌 때
  • 평행 상속
  • 클래스가 하는일이 별로 없을 때
  • 의심스러운 일반화
  • 임시 속성
  • 메서드 호출 연쇄가 너무 많을 때
  • 맡기기만 하고 자신은 일하지 않은 클래스가 있을 때
  • 그럴 필요가 없는데 양방향 링크를 걸거나 IS_A 관계가 없는데 상속을 할 때
  • 클래스 인터페이스 불일치
  • 불안전한 라이브러리 클래스
  • 데이터 클래스
  • 상속 거부
  • 주석

리팩토링 예시

매직 넘버를 기호 상수로 치환

  • 상수가 의존관계가 있다면 상수를 이용해 의존관계를 표현하자
public static final int MAX_INPUT_LENGTH = 100;
public static final int WORK_LENGTH = MAX_INPUT_LENGTH * 2

제어 플래그 삭제

  • 제어플래그란?
    : 상태를 기록하고 처리 흐름을 제어하기 위한 boolean 타입 변수

  • 제어플래그를 삭제하는 대신 break, continue, return 을 이용하다.

assertion 도입

null 객체 도입

  • null 확인이 너무 많다면 null 객체를 사용한다.
  • 클래스명을 은폐하려면 팩토리 메서드 패턴을 사용한다.
    ㄴ 널 객체 생성용 클래스 메서드를 만들고 그 안에 new NulLabel()이라는 표현식을 가ㅁ추고 있는 것
  • 메모리 소비량이 많다면 싱글톤 패턴을 사용한다.

메서드 추출

  • 한 메서드 안에 이런저런 세세한 처리가 많다면 그런 처리를 묶어서 나누고 독립된 메서드로 추출한다.
  • 추출한 메서드에 적절한 이름을 붙인다.

클래스 추출

  • 클래스는 하나에 책임 하나가 이상적이다.

분류 코드를 클래스로 치환

  • 고냥 enum쓰면 됩니당

참고
자바로 배우는 리팩토링 입문(책)

0개의 댓글