9. 데이터 조직화
- 변수 쪼개기, 변수 이름 바꾸기, 파생 변수를 질의 함수로 바꾸기
- 참조를 값으로 바꾸기, 값을 참조로 바꾸기
- 매직 리터럴 바꾸기
#
9.1 변수 쪼개기#
배경- 참조 목적으로 쓰는 변수는 값을 한번만 대입하는 것이 좋습니다.
- 여러 목적으로 쓰인 변수는 혼란을 줍니다.
#
절차- 변수를 선언한 곳과 값을 처음 대입하는 곳에서 변수 이름을 바꿉니다.
- 가능하면 이때 불변으로 선언합니다.
- 이 변수에 두 번째로 값을 대입하는 곳 앞까지의 모든 참조를 새로운 변수 이름으로 바꿉니다.
- 두 번째 대입 시 변수를 원래 이름으로 다시 선언합니다.
- 테스트합니다.
- 반복합니다.
#
예시- 일부 리팩토링 이후.
#
입력 매개 변수 수정 시#
9.2 필드 이름 바꾸기#
배경- 데이터 구조는 프로그램을 이해하는데 큰 역할을 하며, 이름이 중요합니다.
#
절차- 레코드의 유효 범위가 제한적이라면 필드에 접근하는 모든 코드를 수정한 후 테스트합니다. 이후 단계는 필요없습니다.
- 레코드가 캡슐화되지 않았다면 우선 레코드를 캡슐화합니다.
- 캡슐화된 객체 안의 private 필드명을 변경하고, 그에 맞게 내부 메서드들을 수정합니다.
- 테스트합니다.
- 생성자의 매개변수 중 필드와 이름이 겹치는 게 있다면 함수 선언 바꾸기로 변경합니다.
- 접근자들의 이름도 바꿀 수 있습니다.
#
예시- 리팩토링 이후
#
9.3 파생 변수를 질의 함수로 바꾸기#
배경- 가변 데이터는 소프트웨어에 문제를 일으킵니다.
- 가변 데이터의 유효 범위를 가능한 줄이는 것이 좋습니다.
- 쉽게 계산해낼 수 있는 변수값은 제거합니다.
- 다음의 경우는 예외입니다.
- 데이터 구조를 감싸며 그 데이터에 기초해서 계산한 결과를 속성으로 제공하는 객체인 경우
- 데이터 구조를 받아 다른 데이터 구조로 변환해 반환하는 함수인 경우
#
절차- 변수 값이 갱신되는 지점을 모두 찾습니다. 필요하면 변수 쪼개기를 활용해서 각 갱신 지점에서 변수를 분리합니다.
- 해당 변수의 값을 계산해주는 함수를 만듭니다.
- 해당 변수가 사용되는 모든 곳에 어시션을 추가하여 함수의 계산 결과가 변수의 값과 같은지 확인합니다.
- 테스트합니다.
- 변수를 읽는 코드를 모두 함수 호출로 대체합니다.
- 테스트합니다.
- 변수를 선언하고 갱신하는 코드를 죽은 코드 제거하기로 없앱니다.
#
에시- 신규 함수를 생성합니다.
- assert를 통해서 테스트합니다.
- 필드를 반환하는 코드를 수정해서 계산 결과를 직접 반환합니다.
- 기존 메서드를 인라인합니다.
- 옛 변수를 참조하는 모든 코드를 죽은 코드 제거하기로 정리합니다.
#
9.4 참조를 값으로 바꾸기#
배경- 객체를 다른 객체에 중첩하면 내부 객체를 참조 혹은 값으로 취급할 수 있습니다.
#
절차- 후보 클래스가 불변인지, 혹은 불변이 될 수 있는지 확인합니다.
- 각각의 세터를 하나씩 제거합니다.
- 이 값 객체의 필드들을 사용하는 동치성 비교 메서드를 만듭니다.
#
예시#
9.5 값을 참조로 바꾸기#
배경- 데이터를 물리적으로 복제해야하는 상황의 문제는 해당 복제본들의 모든 부분을 갱신해야합니다.
- 값을 참조로 바꾸면 하나당 객체도 하나만 존재하게 됩니다.
#
절차- 같은 부류에 속하는 객체들을 보관할 저장소를 만듭니다.
- 생성자에서 이 부류의 객체들 중 특정 객체를 정확히 찾아내는 방법이 있는지 확인합니다.
- 호스트 객체의 생성자들을 수정하여 필요한 객체를 이 저장소에서 찾도록 합니다. 하나 수정할 때마다 테스트합니다.
#
예시- 저장할 저장소 객체를 생성합니다.
- 객체를 사용하는 코드로 변경합니다.
#
9.6 매직 리터럴 바꾸기#
배경- 숫자대신 이를 잘 표현해줄 수 있는 상수로 변경하는 것이 좋습니다.
#
방법- 상수를 선언하고 매직 리터럴을 대입합니다.
- 해당 리터럴이 사용되는 곳을 모두 찾습니다.
- 찾은 곳 각각에서 리터럴이 새 상수와 똑같은 의미로 쓰였는지 확인하며, 같은 의미인 경우 상수로 대체하여 테스트합니다.