티스토리 뷰

데이터 구조는 프로그램에서 중요할 역할을 수행한다.

따라서, 데이터 구조에만 집중한 리팩터링만 한 묶음 따로 준비한 장이다.

 

  • 하나의 값이 여러 목적으로 사용된다면
    • 9.1 변수 쪼개기
  • 변수 자체를 없애는게 가장 좋은 해결책일 때
    • 9.3 파생 변수를 질의함수로 바꾸기
  • 레코드나 클래스의 이름을 바꾸고 싶은 경우
    • 9.2 필드 이름 바꾸기
  • 참조인지 값인지 햇갈려 문제가 되는 경우
    • 9.4 참조를 값으로 바꾸기
    • 9.5 값을 참조로 바꾸기
  • 의미를 알기 어려운 리터럴이 보이면
    • 9.6 매직 리터럴 바꾸기

 

9.1 변수 쪼개기 (Split Variable)

개요

  • 여러 번 대입하는 용도의 수집 변수가 아닌 이상 역할이 둘 이상인 변수가 있다면 쪼개야 한다
  • 여러 용도로 쓰인 변수는 코드를 읽을때 커다란 혼란을 주고 버그를 낳는다

적용시점

  • 수집 변수가 아닌데 역할이 둘 이상인 변수가 있는 경우

효과

  • 코드의 가독성을 높이고 버그를 최소화 한다

 

before

let temp = 2 * (height + width);
console.log(temp);
temp = height * width;
console.log(temp);

after

const perimeter = 2 * (height + width);
console.log(perimeter);
const area = height * width;
console.log(area);

 

 

9.2 필드 이름 바꾸기 (Rename Field)

개요

  • 데이터 구조는 프로그램을 이해하는데 큰 역할을 하기 때문에 필드 이름은 중요하다
  • 중요한 만큼 반드시 깔끔하게 관리해야 하며 데이터를 잘 이해하게되면 프로그램에 반드시 반영해야 한다

적용시점

  • 데이터에 대한 이해도가 높아지면서 변경이 필요하다고 깨닫는 경우
  • 판단하여 널리 참조되는 데이터 구조일 때는 단계적인 리팩터링 과정이 필요하다

효과

  • 프로그램 전반적으로 이해하기 쉬워진다

 

before

class Organization {
  get name() {...}
}

after

class Organization {
  get title() {...}
}

 

 

9.3 파생 변수를 질의 함수로 바꾸기 (Replace Derived Variable with Query)

개요

  • 가변 데이터는 서로 다른 두 코드를 이상한 방식으로 결합하기도 한다
  • 예컨대 한 쪽 코드에서 수정한 값이 연쇄 효과를 일으키는 경우 원인을 찾기 어려울 문제를 야기한다

적용시점

  • 값을 쉽게 계산해낼 수 있는 변수들을 모두 제거하고 함수로 분리한다
  • 단, 새로운 데이터 구조를 생성하는 변형 연산이라면 그대로 두는 것도 괜찮다

효과

  • 코드 자체가 데이터의 의미를 더 분명히 드러낸다
  • 변경된 값을 실수로 결과 변수에 반영하지 않는 등의 실수를 방지한다

 

before

get discountedTotal() {return this._discountedTotal;}
set discount(aNumber) {
  const old = this._discount;
  this._discount = aNumber;
  this._discountedTotal += old - aNumber;
}

after

get discountedTotal() {return this._baseTotal - this._discount;}
set discount(aNumber) {this._discount = aNumber;}

 

 

9.4 참조를 값으로 바꾸기 (Change Reference to Value)

개요

  • 참조를 복제하여 값으로 바꿔 다루면 자유롭게 활용하기 좋다

적용시점

  • 참조를 사용할 필요가 없는 경우

효과

  • 값을 복제해 이곳저곳에서 사용하더라도 서로 간의 참조를 관리하지 않아도 된다
  • 분산 시스템과 동시성 시스템에서 특이 유용하다

 

before

class Product {
  applyDiscount(arg) {this._price.amount -= arg;}

after

class Product {
  applyDiscount(arg) {
    this._price = new Money(this._price.amount - arg, this._price.currency);
  }

 

 

9.5 값을 참조로 바꾸기 (Change Value to Reference)

개요

  • 논리적으로 같은 데이터를 물리적으로 복제해 사용할 때 문제는 그 데이터를 갱신해야 할 때다
  • 이런 상황이라면 복제된 데이터들을 모두 참조로 바꿔주는게 좋다

적용시점

  • 데이터를 하나로 사용해야 하는 경우

효과

  • 갱신이 필요할 때 모든 복제본을 찾아서 빠짐없이 갱신하는 처리를 하지 않아도 된다

 

before

let customer = new Customer(customerData);

after

let customer = customerRepository.get(customerData.id);

 

 

9.6 매직 리터럴 바꾸기 (Replace Magic Literal)

개요

  • 매직 리터럴이란 소스 코드에 등장하는 일반적인 리터럴 값을 말한다
  • 코드를 읽는 사람이 그 값의 의미를 모른다면 코드로는 의미를 명확히 알려주지 못하고 각자의 해석이 필요하게 된다

적용시점

  • 매직 리터럴이 존재하는 경우
  • 단, const ONE = 1 과 같이 값을 바로 쓰는 것보다 이득이 없는 경우 과용하지 않도록 주의해야한다

효과

  • 코드 자체가 뜻을 분명하게 드러낼 수 있다

 

before

function potentialEnergy(mass, height) {
  return mass * 9.81 * height;
}

after

const STANDARD_GRAVITY = 9.81;
  function potentialEnergy(mass, height) {
    return mass * STANDARD_GRAVITY * height;
  }

 

참고
http://www.yes24.com/Product/Goods/89649360
https://refactoring.com/catalog

 

댓글