[리팩터링 2판] 09. 데이터 조직화

데이터 구조는 프로그램에서 중요한 역할을 수행하니 데이터 구조에 집중한 리팩터링을 알아보자.
특히, 9.4 참조를 값으로 바꾸기9.5 값을 참조로 바꾸기를 유의하며 읽어보자.


9.0. Refactoring Tips

자바스크립트의 매개변수는 값에 의한 호출(call-by-value)방식으로 전달되므로 inputValue를 수정해도 호출자에 영향을 주지 않는다.

데이터 테이블 없이 흐름도만 보여줘서는 나는 여전히 혼란스러울 것이다. 하지만 데이터 테이블을 보여준다면 흐름도는 웬만해선 필요조차 없을 것이다. 테이블만으로 명확하기 때문이다.

리팩터링 도중 테스트에 실패한다면 더 작은 단계로 나눠 진행해야 한다는 신호임을 잊지 말자.

가변 데이터 구조를 이용한다면 데이터를 복제하는 행위가 재앙으로 이어질 수 있다.


9.1. 변수 쪼개기

배경

  • 수집변수는 값을 여러번 대입할 수 밖에 없다. (for(let i=0; i<10; i++) 에서 i 같은 루프변수)
  • 그 외 역할이 둘 이상인 변수가 있다면 쪼개야 한다. 예외는 없다.

절차

  • 변수를 선언한 곳과 값을 처음 대입하는 곳에서 변수 이름을 바꾼다.
  • 가능하면 이때 불변으로 선언한다.
  • 이 변수에 두 번째로 값을 대입하는 곳 앞까지의 모든 참조(이 변수가 쓰인 곳)를 새로운 변수 이름으로 바꾼다.
  • 두 번째 대입 시 변수를 원래 이름으로 다시 선언한다.
  • 테스트한다.
  • 반복한다. 매 반복에서 변수를 새로운 이름으로 선언하고 다음번 대입 때까지의 모든 참조를 새 변수명으로 바꾼다. 이 과정을 마지막 대입까지 반복한다.


9.2. 필드 이름 바꾸기

배경

  • 데이터 구조는 무슨 일이 벌어지는지를 이해하는 열쇠다.
  • 데이터 구조가 중요한 만큼 반드시 깔끔하게 관리해야 한다.

절차

  • 레코드의 유효 범위가 제한적이라면 필드에 접근하는 모든 코드를 수정한 후 테스트한다. 이후 단계는 필요없다.
  • 레코드가 캡슐화되지 않았다면 우선 레코드를 캡슐화한다.
  • 캡슐화된 객체 안의 private 필드명을 변경하고, 그에 맞게 내부 메서드들을 수정한다.
  • 테스트한다.
  • 생성자의 매개변수 중 필드와 이름이 겹치는 게 있다면 6.5 함수 선언 바꾸기로 변경한다.
  • 접근자의 이름도 바꿔준다.


9.3. 파생 변수를 질의 함수로 바꾸기

배경

  • 가변 데이터의 유효범위를 좁히기 위해서, 값을 쉽게 계산해낼 수 있는 변수를 모두 제거할 수 있다.
  • 변형 연산(transformation operation)이라면 비록 계산 코드로 대체할 수 있더라도 그대로 두는 것도 좋다.
    • 데이터 구조를 감싸며 그 데이터에 기초하여 계산한 결과를 속성으로 제공하는 객체
    • 데이터 구조를 받아 다른 데이터 구조로 변환해 반환하는 함수

절차

  • 변수 값이 갱신되는 지점을 모두 찾는다. 필요하면 9.1 변수 쪼개기를 활용해 각 갱신 지점에서 변수를 분리한다.
  • 해당 변수의 값을 계산해주는 함수를 만든다.
  • 해당 변수가 사용되는 모든 곳에 어서션을 추가하여 함수의 계산 결과가 변수의 값과 같은지 확인한다.
  • 테스트한다.
  • 변수를 읽는 코드를 모두 함수 호출로 대체한다.
  • 테스트한다.
  • 변수를 선언하고 갱신하는 코드를 8.9 죽은 코드 제거하기로 없앤다.


9.4. 참조를 값으로 바꾸기

배경

  • 참조냐 값이냐의 차이는 내부 객체의 속성을 갱신하는 방식에서 가장 극명하게 드러난다.
  • 참조로 다루는 경우에는 내부객체는 그대로 둔 채 그 객체의 속성만 갱신한다.
  • 값으로 다루는 경우에는 새로운 속성을 담은 객체로 기존 내부 객체를 통째로 대체한다.
  • 값 객체(Value Object)는 불변이기 때문에 값을 복제해 이곳저곳 사용하더라도 서로간의 참조를 관리하지 않아도 된다.

절차

  • 후보 클래스가 불변인지, 혹은 불변이 될 수 있는지 확인한다.
  • 각각의 세터를 하나씩 제거한다.
  • 이 값 객체의 필드를 사용하는 동치성 비교 메서드를 만든다.


9.5. 값을 참조로 바꾸기

배경

  • 같은 데이터를 물리적으로 복제해 사용할 때 가장 크게 문제되는 상황은 그 데이터를 갱신해야 할 때다.
  • 이런 상황이라면 복제된 데이터를 모두 참조로 바꿔주는 게 좋다
  • 보통 이러면 객체들을 한데 모아놓고 클라이언트의 접근을 관리해주는 일종의 저장소가 필요해진다.

절차

  • 같은 부류에 속하는 객체들을 보관할 저장소를 만든다. (이미 있다면 생략)
  • 생성자에서 이 부류의 객체들 중 특정 개체를 정확히 찾아내는 방법이 있는지 확인한다.
  • 호스트 객체의 생성자들을 수정하여 필요한 객체를 이 저장소에서 찾도록 한다. 하나 수정할 때마다 테스트한다.


9.6. 매직 리터럴 바꾸기

배경

  • 코드를 읽는 사람이 값의 의미를 모른다면 숫자 자체로는 의미를 명확히 알려주지 못하므로 매직 리터럴이라 할 수 있다.
  • 이럴 때 코드 자체가 뜻을 분명하게 드러내는 게 좋다.

절차

  • 상수를 선언하고 매직 리터럴을 대입한다.
  • 해당 리터럴이 사용되는 곳을 모두 찾는다.
  • 찾은 곳 각각에서 리터럴이 새 상수와 똑같은 의미로 쓰였는지 확인하여, 같은 의미라면 상수로 대체한 후 테스트한다.

댓글남기기