리팩토링 6장: 기본적인 리팩터링

wonderful world·2022년 3월 13일
1

리팩토링 2판

목록 보기
1/9

6.1 함수 추출하기

함수 추출하기는 내가 가장 많이 사용하는 리팩터링 중 하나다

6.2 함수 인라인하기

6.3 변수 추출하기

객체는 특정 로직과 데이터를 외부와 공유하려 할 때 공유할 .. 설명해주는 적당한 크기의 문맥이 되어준다.

6.4 변수 인라인하기

6.5 함수 선언 바꾸기

좋은 이름을 떠올리는 데 효과적인 방법이 하나 있다. 바로 주석을 이용해 함수의 목적을 설명해보는 것이다. 그러다 보면 주석이 멋진 이름으로 바뀌어 되돌아 올 때가 있다.

6.6 변수 캡슐화하기

먼저 그 데이터로의 접근을 독점하는 함수를 만드는 식으로 캡슐화

데이터의 유효범위가 넓을수록 캡슐화해야 한다.

let defaultOwner = {firstName: "마틴", lastName: "파울러"};
let defaultOwnerData = {firstName: "마틴", lastName: "파울러"};
export function defaultOwner() { return defaultOwnerData;}
export function setDefaultOwner(arg) { defaultOwnerData = arg; }

defaultOwnerData 가 외부에서 변경되지 않기 위해서 defaultOwner() 에서 새 객체로 deep copy 해서 반환. 외부의 영향을 차단하기 위해서 새 객체로 반환하는 것이 유용할 때가 있음.

6.7 변수 이름 바꾸기

스스로 자신을 설명할 수 있는 이름을 붙여라

let a = height * width

to

let area = height * width

6.8 매개변수 객체 만들기

같이 업데이트 되어야 할 변수 그룹들을 하나의 데이터 구조로 치환하라

function amountInvoiced(startDate, endDate) {}
function amountReceived(startDate, endDate) {}
function amountOverdue(startDate, endDate) {}

to

function amountInvoiced(aDateRange) {}
function amountReceived(aDateRange) {}
function amountOverdue(aDateRange) {}

Motivation

  • 데이터 아이템들 사이에 관계를 명확히 해라
  • 파라미터 리스트의 크기를 줄여라
  • 코드를 더 일관성있게 하라
  • 코드에 더 깊숙한 변경을 가능하게 하라

6.9 여러 함수를 클래스로 묶기

공통의 데이터에 대한 함수 그룹들을 베이스 클래스로 묶어라

function base(aReading) {}
function taxableCharge(aReading) {}
function calculateBaseCharge(aReading) {}

to

class Reading() {
  base() {}
  taxableCharge() {}
  calculateBaseCharge() {}
}

Motivation

  • 많은 인자를 제거함으로써 함수 호출을 단순화해라
  • 시스템의 다른 파트들에 객체를 더 넘기기 쉽게해라

6.10 여러 함수를 변환 함수로 묶기

소스 데이터를 입력으로 받아 모든 파생값을 계산하고 각 파생값을 출력 데이터의 필드에 넣어라

function base(aReading) {}
function taxableCharge(aReading) {}

to

function enrichReading(argReading) {
  const aReading = _.cloneDeep(argReading)
  aReading.baseCharge = base(aReading)
  aReading.taxableCharge = taxableCharge(aReading)
  return aReading
}

Motivation

  • 중복 로직을 피해라

6.11 단계 쪼개기

서로 다른 작업을 수행하는 코드를 서로 다른 모듈로 분할해라

const orderData = orderString.split(/\s+/)
const productPrice = priceList[orderData[0].split("-")[1]]
const orderPrice = parseInt(orderData[1]) * productPrice

to

const orderRecord = parseOrder(orderString)
const orderPrice = price(orderRecord, priceList)

function parseOrder(aString) {
  const values = aString.split(/\s+/)
  return {
    productID: values[0].split("-")[1],
    quantity: parseInt(values[1])
  }
}

function price(order, priceList) {
  return order.quantity * priceList[order.productID]
}

Motivation

  • 코드의 차이를 드러내면서 다른 점을 명확히 해라
  • 각 모듈을 개별적으로 취급할 수 있다

Reference

profile
hello wirld

0개의 댓글