✏️6.5 함수 선언 바꾸기 (Change Function Declaration)
➡️ 함수 이름 바꾸기, 시그니처 바꾸기, 메서드명 변경 ...
function circum(radius) {...}리팩터링 후
function circumference(radius) {...}🧷 배경
연결부에서 가장 중요한 요소는 함수의 이름이다. 이름이 좋으면 함수의 구현 코드를 살펴볼 필요 없이 호출문만 보고도 무슨 일을 하는지 파악할 수 있다. 저자는 잘못된 이름의 함수를 발견하면 더 나은 이름이 떠오르는 즉시 바꾸라는 명령으로 받아들인다. 그래야 나중에 그 코드를 다시 볼 때 무슨 일을 하는지 또 고민하지 않아도 된다.
매개변수도 마찬가지이다. 활용 범위가 넓어지고 다른 모듈과의 결합을 제거할 수 있다.
📍 좋은 이름 떠올리기
주석으로 함수의 목적을 설명해보자. 주석이 멋진 이름으로 바뀌어 되돌아올 때가 있다.
🧷 절차
🧷 간단한 절차
- 매개변수를 제거하려거든 먼저 함수 본문에서 제거 대상 매개변수를 참조하는 곳은 없는지 확인한다. 
- 메서드 선언을 원하는 형태로 바꾼다. 
- 기존 메서드 선언을 참조하는 부분을 모두 찾아서 바뀐 형태로 수정한다. 
- 테스트한다. 
🧷 마이그레이션 절차
- 이어지는 추출 단계를 수월하게 만들어야 한다면 함수의 본문을 적절히 리팩터링한다. 
- 함수 본문을 새로운 함수로 추출한다. 
- 추출한 함수에 매개변수를 추가해야 한다면 간단한 절차를 따라 추가한다. 
- 테스트한다. 
- 기존 함수를 인라인 한다. 
- 이름을 임시로 붙여뒀다면 함수 선언 바꾸기를 한 번 더 적용해서 원래 이름으로 되돌린다. 
- 테스트한다. 
🧷 리팩터링 예시
function circum(radius) {
  return 2 * Math.PI * radius;
}- 함수의 이름을 이해하기 더 쉽게 바꾸기 위해 함수 선언부터 수정한다. 
function circumference(radius) {
  return 2 * Math.PI * radius;
}- circum()을 호출한 곳을 찾아 모두- circumference()으로 바꾼다.
🧷 예시: 매개변수 추가하기
도서 관리 프로그램의 Book 클래스에 예약 기능
// Book 클래스
addReservation(customer) {
  this._reservations.push(customer);
}- 예약 시 우선순위 큐를 지원하라는 새로운 요구가 추가되었다. 
- addReservation()의 본문을 새로운 함수로 추출한다. 
// Book 클래스
addReservation(customer) {
  this.zz_addReservation(customer);
}
zz_addReservation(customer) {
  this._reservation.push(customer);
}- 새 함수의 선언문과 호출문에 원하는 매개변수를 추가한다. 
// Book 클래스
addReservation(customer) {
  this.zz_addReservation(customer, false);
}
zz_addReservation(customer, isPriority) {
  assert(isPriority === true || isPriority === false);  // 어서션을 추가하여 매개변수를 실제로 사용하는지 확인 
  this._reservation.push(customer);
}🧷 예시: 매개변수 속성으로 바꾸기
고객이 뉴잉글랜드에 살고 있는지 확인하는 함수
function inNewEngland(aCustomer) {
  return ["", "", ...].includes(aCustomer.address.state);
}// 호출문
const newEnglanders = someCustomers.filter(c => inNewEngland(c));- 매개변수로 사용할 코드를 변수로 추출해둔다. 
function inNewEngland(aCustomer) {
  const stateCode = aCustomer.address.state;
  return ["", "", ...].includes(stateCode);
}- 함수 추출하기로 새 함수를 만든다. 
function inNewEngland(aCustomer) {
  const stateCode = aCustomer.address.state;
  return xxNEWinNewEngland(stateCode);
}
function xxNEWinNewEngland(stateCode) {
  return ["", "", ...].includes(aCustomer.address.state);
}- 기존 함수 안에 변수로 추출해둔 입력 매개변수를 인라인 한다. 
function inNewEngland(aCustomer) {
  return xxNEWinNewEngland(aCustomer.address.state);
}- 함수 인라인하기로 기존 함수의 본문을 호출문들에 집어넣는다. 실질적으로 기존 함수 호출문을 새 함수 호출문으로 교체하는 셈이다. 
// 호출문
const newEnglanders = someCustomers.filter(c => xxNEWinNewEngland(c.address.state));- 함수 선언 바꾸기를 한 번 더 적용하여 새 함수의 이름을 기존 함수의 이름으로 바꾼다. 
// 호출문
const newEnglanders = someCustomers.filter(c => inNewEngland(c.address.state));// 최상위
function inNewEngland(stateCode) {
  return ["", "", ...].includes(stateCode);
}Last updated