리팩터링 (6장 기본적인 리팩토링 -1)
아래 내용은 리팩터링 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에서 데이터 복제본을 반환하거나 복제본을 저장하는 방법으로 하여 원본을 변경할 수 없게 하는게 좋다.
활용될 수 있는 악취들
- 가변 데이터
- 전역 데이터
- 데이터를 다루는 대부분의 리팩터링의 사전 기법으로 활용됨
변수 이름 바꾸기
- 절차
- 폭넓게 쓰이는 변수
- 캡슐화를 먼저 한다.
- 호출하는 모든 코드들이 캡슐화 함수를 통해 접근하도록 한다.
- 변수명을 바꾼다.
- 상수
- 변경된 이름을 가진 복제본을 만든다. 그 후 복제본이 원본을 참조하도록 한다.
- 점진적으로 호출하는 곳을 복제본을 참조하도록 한다.
- 다 바꾸고 나면 원본을 삭제한다.
활용될 수 있는 악취들
- 기이한 이름
매개변수 객체 만들기
- 같이 뭉쳐 다니는 데이터(데이터 뭉치의)를 묶어 객체로 만들어라 그러면 매개변수도 줄어들고 문제영역을 확실히 나타내는 개념을 도출할 수 있다.
활용될 수 있는 악취들
- 데이터 뭉치
- 긴 매개변수 목록
- 기본형 집착
- 긴 함수
Author And Source
이 문제에 관하여(리팩터링 (6장 기본적인 리팩토링 -1)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@wnwl1216/리팩터링-6장-기본적인-리팩토링-1저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)