리팩터링 (6장 기본적인 리팩토링 -1)

박주진·2021년 10월 12일
0

리팩터링

목록 보기
3/7

아래 내용은 리팩터링 2판 내용과 한달한권 읽기 강의를 기반하여 정리한 글입니다.
여기부터는 구체적인 리팩토링 기법들 입니다.

함수 추출하기

  • 코드를 보고 무슨 일을 하는지 파악하는데 시간이 걸린다면 함수로 추출 후 무슨 일(목적) 하는지가 드러나는 이름을 지어라!(목적과 구현을 분리하는 방식)
  • 저자는 보통 5-6줄인 넘어가면 악취가 풍긴다고 생각한다.
  • 함수가 많아져 함수 호출이 성능에 영향을 줄거라고 걱정할 필요는 없다. 왜나하면 함수가 짧으면 캐싱하기가 더 쉽기 떄문에 컴파일러가 최적화하는데 유리한 경우가 더 많다.
  • 추출된 함수의 이름을 잘짓는게 핵심이다!
  • 긴 함수의 주석이 달려 있다면 주석을 참고하면 도움이 된다.

활용될 수 있는 악취들

  • 거의 대부분의 악취
  • 긴 함수
  • 중복 코드

함수 인라인 하기

  • 함수 본문이 함수 이름만큼 명확한 경우.
  • 함수 본문을 호출한는 곳에 위치 시킨다.

활용될 수 있는 악취들

  • 성의 없는 요소
  • 산탄총 수술
  • 추측성 일반화

변수 추출하기

  • 표현식이 너무 복잡해서 이해하기 어려울 때 지역변수를 활용하면 코드의 목적을 명확하게 드러낼 수 있다.
  • 추가된 변수는 디버깅시 breakpoint를 통해 중간값을 확인할 수 있다.
  • 추출하고자 하는 표현식의 문맥이 현재 함수 안에서만 의미가 있다면 지역변수로 추출하고 해당 표현식의 문맥이 함수를 벗어나 넓은 문맥에서 사용된다면 함수로 추출하라.
//전
function a() {
return order.quntity * order.itemPrice - Math.max(0,order.quantity - 500) * orderItemPrice * 0.05
}

//후
function a() {
const basePrice =  order.quntity * order.itemPrice;
const quantityDiscount = Math.max(0,order.quantity - 500) * orderItemPrice * 0.05
return basePrice - quantityDiscount 
}

활용될 수 있는 악취들

  • 없음 하지만 다른 기법의 절차의 일부로서 의미가 있음

변수 인라인하기

  • 변수명이 표현식과 다를 바 없는 경우

활용될 수 있는 악취들

  • 없음 하지만 다른 기법의 절차의 일부로서 의미가 있음

함수 선언 바꾸기

  • 이름 바꾸기
    • 좋은 이름을 가진 함수는 구현코드를 읽지 않고도 무슨 일을 하는지 파악이 가능하다.
    • 이름이 잘못된 함수를 발견하거나 더 나은 이름이 떠오르면 즉시 바꿔라.
    • 주석을 이용해 함수의 목적을 설명해보고 그 주석을 이용해 이름을 만들면 좋다.
    • 외부에 공개된 api를 변경하는 절차
      • 변경된 함수를 하나더 만든다.
      • 기존 함수에서 새 함수를 호출하게 한다.
      • 이전 함수를 deprecated 처리한다.
      • 모든 client가 새 함수로 이전하면 이전 함수를 제거한다.
  • 매개 변수 바꾸기
    • 매개변수를 통해 함수의 활용 범위, 결합도, 캡슐화 수준을 변경할 수 있다.
    • 매개변수를 올바로 선택하는 방법은 정답이 없다.
      - 예) 지불 객체를 매개변수로 받는 지불 기한을 판단하는 함수가 있다.
      • 장점은 지불 객체가 제공하는 여러 속성에 쉽게 접근할 수 있어 내부 로직이 지불객체의 다양한 속성을 이용해 판단하도록 복잡해지더라도 변경없이 대응이 가능하다.(캡술화 수준이 높아짐)
      • 단점은 지불객체와 결합되고 활용범위가 낮아진다.
      • 그래서 시간이 흐르고 어떻게 연결하는게 더 나은지 이해하게 되면 그때 상황에 맞게 개선하자.
    • 변경절차
      • 적당한 이름을 가진 함수로 추출
      • 기존 함수에서 새 함수 호출 및 추가된 매개변수 처리
      • 사용하는 쪽에서 새 함수를 이용하도록 변경
      • 모두 변경되면 그전 함수를 제거하고 새함수를 그전 함수 이름으로 변경

활용될 수 있는 악취들

  • 기이한 이름
  • 서로 다른 인터페이스의 대안 클래스들
  • 주석
  • 추측성 일반화

변수 캡슐화하기

  • 변수는 함수보다 변경하기 까다롭다 그 이유는 함수는 단계적으로 변경이 가능하나 변수는 한번에 참조하는 모든 곳을 바꿔야 하기 때문이다.
  • 접근범위가 넓은 데이터는 데이터 접근을 독점하는 함수를 만들어서 캡슐화(결합도 저하) 한다.(getter, setter)
    • getter, setter를 추가하면 데이터 변경 전,후 추가 로직을 쉽게 끼워 넣을 수 있는 확실한 통로가 생긴다.
  • 불변 데이터는 가변 데이터보다 캡슐화할 이유가 적다.
  • getter, setter에서 데이터 복제본을 반환하거나 복제본을 저장하는 방법으로 하여 원본을 변경할 수 없게 하는게 좋다.

활용될 수 있는 악취들

  • 가변 데이터
  • 전역 데이터
  • 데이터를 다루는 대부분의 리팩터링의 사전 기법으로 활용됨

변수 이름 바꾸기

  • 절차
  • 폭넓게 쓰이는 변수
    • 캡슐화를 먼저 한다.
    • 호출하는 모든 코드들이 캡슐화 함수를 통해 접근하도록 한다.
    • 변수명을 바꾼다.
  • 상수
    • 변경된 이름을 가진 복제본을 만든다. 그 후 복제본이 원본을 참조하도록 한다.
    • 점진적으로 호출하는 곳을 복제본을 참조하도록 한다.
    • 다 바꾸고 나면 원본을 삭제한다.

활용될 수 있는 악취들

  • 기이한 이름

매개변수 객체 만들기

  • 같이 뭉쳐 다니는 데이터(데이터 뭉치의)를 묶어 객체로 만들어라 그러면 매개변수도 줄어들고 문제영역을 확실히 나타내는 개념을 도출할 수 있다.

활용될 수 있는 악취들

  • 데이터 뭉치
  • 긴 매개변수 목록
  • 기본형 집착
  • 긴 함수

0개의 댓글