리팩토링(Refactoring)

소프트웨어를 보다 쉽게 이해할 수 있고, 적은 비용으로 수정할 수 있도록
겉으로 보이는 동작의 변화 없이 내부 구조를 변경한 것!

크게 데이터수준 리팩토링, 명령문 수준 리팩토링
루틴 수준 리팩토링,클래스구현 리팩토링,
클래스 인터페이스 리팩토링, 시스템수준 리팩토링으로 나눌 수 있다

데이터 수준 리팩토링
  • 매직넘버(아무설명없는일반 숫자)를 명명된 상수로 대체한다
  • 변수 이름을 보다 분명하고 많은 정보를 제공하는 이름으로 다시 명명한다
  • 표현식을 인라인으로 이동시킨다
  • 표현식을 루틴으로 대체한다
  • 중간 변수를 사용한다
  • 여러 목적으로 사용되는 변수를 여러개의 단일 목적을 갖는 변수로 변환한다
  • 로컬에서 사용하기 위한 목적이라면 매개 변수 대신 지역변수를 사용한다
  • 기본 데이터를 클래스로 변환한다
  • 타입 코드 집합을 클래스나 enum으로 변환한다
  • 타입 코드 집합을 서브 클래스를 갖는 클래스로 변환한다
  • 배열을 객체로 변경한다
  • 컬렉션을 캡슐화한다
  • 전형적인 레코드를 데이터 클래스로 대체한다
명령문 수준 리팩토링
  • 불린 표현식을 분해한다
  • 복잡한 불린 표현식을 잘 명명된 불린 함수로 이동시킨다 (가독성 향상)
  • 서로 다른 조건문 내에 중복되어 있는 코드들을 결합한다
  • 루프 제어 변수 대신 break나 return을 사용한다 (ex bool done = false;)
    -중첩된 if else 명령문 내에서 리턴 값을 할당하는 대신, 답을 알았을때 곧바로 리턴한다
  • 조건문(특히, 반복되는 case 문)을 다형성으로 대체한다
  • 널 값을 테스트 하는 대신, 널 객체를 생성하여 사용한다
루틴 수준 리팩토링
  • 루틴을 추출해 인라인으로 이동할 필요가 있으면 이동시킨다
  • 긴 루틴을 클래스로 변환하거나 여러개의 루틴으로 분해한다
  • 복잡한 알고리즘 대신 간단한 알고리즘으로 대체한다
  • 매개변수를 추가하되 적당히 추가한다 (최대 7개)
  • 매개변수를 사용하지 않으면 제거한다
  • 변경 연산으로 부터 쿼리 연산을 분리한다 (쿼리연산은 객체의상태를변경하지않음)
  • 매개변수를 이용하여 유사한 루틴을 결합한다 (template 사용)
  • 전달되는 매개변수에 따라서 행동하는 루틴들을 분리한다
  • 같은 객체에 있는 여러개의 값을 한 루틴에 전달한다면 전체 객체를 전달한다.
  • 필요한 필드만 받아들이도록 루틴을 변경할 것을 고려해본다
  • 다운 캐스팅을 캡슐화한다 (가장 구체적인 객체의 타입을 리턴 시키도록)
클래스 구현 리팩토링
  • 크거나 복잡한 객체에 대한 굉장히 많은 복사본을 관리한다면
    하나의 마스터객체만 사용하여 해당 객체를 참조하도록 한다
  • 작고 간단한 객체를 위해서 수많은 참조 코드를 수행한다면
    모든 객체가 값 객체가 되도록 객체의 사용법을 변경한다
  • 가상 루틴들을 데이터 초기화로 대체한다
  • 필요에 따라 멤버 루틴이나 데이터의 위치를 변경한다 (부모클래스나 파생클래스로)
  • 특화된 코드를 파생클래스로 추출한다
  • 파생클래스의 유사한 코드를 결합하여 부모클래스로 결합한다
클래스 인터페이스 리팩토링
  • 클래스가 각각의 책임 분야가 있으면 해당클래스를 여러개의 클래스로 나눈다
  • 많은 일을 하지 않으면 해당 클래스의 코드를 응집력있는 클래스로 이동후 삭제한다
  • 올바른 추상화를 생각하여 위임하는 클래스가 생기지 않도록 한다
  • 필요하다면 상속을 위임으로 대체한다
  • 추가적인 루틴들이 필요한데 클래스가 수정 불가능 하다면 원본 클래스로부터
    서브클래싱을 하고 원본 클래스를 래핑하여 필요한 루틴을 노출 시키도록한다
  • 노출된 멤버변수는 캡슐화시킨다
  • 변할 수 없는 필드에 대한 Set() 루틴을 제거한다
  • 클래스 외부에서 사용되지 않는 루틴은 캡슐화한다
시스템 수준 리팩토링
  • 서로 기능을 사용하는 클래스가 있으면 양방향 클래스 관계로 변경한다
  • 두 클래스 중 한 클래스만 다른 클래스를 알 필요가 있다면 단방향 클래스 관계로 변경한다
  • 간단한 생성자 대신 팩토리 루틴을 사용한다
  • 오류 코드를 예외로 대체하거나 그 반대로 한다

Code Complete Part 5 Chapter 24 리팩토링

리팩토링을 하기전엔 반드시 코드를 저장 할 것!

루틴을 추가할때
클래스 추가할때
결함을 수정할때 하자

Share