티스토리 뷰
데이터 구조는 프로그램에서 중요할 역할을 수행한다.
따라서, 데이터 구조에만 집중한 리팩터링만 한 묶음 따로 준비한 장이다.
- 하나의 값이 여러 목적으로 사용된다면
- 9.1 변수 쪼개기
- 변수 자체를 없애는게 가장 좋은 해결책일 때
- 9.3 파생 변수를 질의함수로 바꾸기
- 레코드나 클래스의 이름을 바꾸고 싶은 경우
- 9.2 필드 이름 바꾸기
- 참조인지 값인지 햇갈려 문제가 되는 경우
- 9.4 참조를 값으로 바꾸기
- 9.5 값을 참조로 바꾸기
- 의미를 알기 어려운 리터럴이 보이면
- 9.6 매직 리터럴 바꾸기
9.1 변수 쪼개기 (Split Variable)
개요
- 여러 번 대입하는 용도의 수집 변수가 아닌 이상 역할이 둘 이상인 변수가 있다면 쪼개야 한다
- 여러 용도로 쓰인 변수는 코드를 읽을때 커다란 혼란을 주고 버그를 낳는다
적용시점
- 수집 변수가 아닌데 역할이 둘 이상인 변수가 있는 경우
효과
- 코드의 가독성을 높이고 버그를 최소화 한다
before
let temp = 2 * (height + width);
console.log(temp);
temp = height * width;
console.log(temp);
after
const perimeter = 2 * (height + width);
console.log(perimeter);
const area = height * width;
console.log(area);
9.2 필드 이름 바꾸기 (Rename Field)
개요
- 데이터 구조는 프로그램을 이해하는데 큰 역할을 하기 때문에 필드 이름은 중요하다
- 중요한 만큼 반드시 깔끔하게 관리해야 하며 데이터를 잘 이해하게되면 프로그램에 반드시 반영해야 한다
적용시점
- 데이터에 대한 이해도가 높아지면서 변경이 필요하다고 깨닫는 경우
- 판단하여 널리 참조되는 데이터 구조일 때는 단계적인 리팩터링 과정이 필요하다
효과
- 프로그램 전반적으로 이해하기 쉬워진다
before
class Organization {
get name() {...}
}
after
class Organization {
get title() {...}
}
9.3 파생 변수를 질의 함수로 바꾸기 (Replace Derived Variable with Query)
개요
- 가변 데이터는 서로 다른 두 코드를 이상한 방식으로 결합하기도 한다
- 예컨대 한 쪽 코드에서 수정한 값이 연쇄 효과를 일으키는 경우 원인을 찾기 어려울 문제를 야기한다
적용시점
- 값을 쉽게 계산해낼 수 있는 변수들을 모두 제거하고 함수로 분리한다
- 단, 새로운 데이터 구조를 생성하는 변형 연산이라면 그대로 두는 것도 괜찮다
효과
- 코드 자체가 데이터의 의미를 더 분명히 드러낸다
- 변경된 값을 실수로 결과 변수에 반영하지 않는 등의 실수를 방지한다
before
get discountedTotal() {return this._discountedTotal;}
set discount(aNumber) {
const old = this._discount;
this._discount = aNumber;
this._discountedTotal += old - aNumber;
}
after
get discountedTotal() {return this._baseTotal - this._discount;}
set discount(aNumber) {this._discount = aNumber;}
9.4 참조를 값으로 바꾸기 (Change Reference to Value)
개요
- 참조를 복제하여 값으로 바꿔 다루면 자유롭게 활용하기 좋다
적용시점
- 참조를 사용할 필요가 없는 경우
효과
- 값을 복제해 이곳저곳에서 사용하더라도 서로 간의 참조를 관리하지 않아도 된다
- 분산 시스템과 동시성 시스템에서 특이 유용하다
before
class Product {
applyDiscount(arg) {this._price.amount -= arg;}
after
class Product {
applyDiscount(arg) {
this._price = new Money(this._price.amount - arg, this._price.currency);
}
9.5 값을 참조로 바꾸기 (Change Value to Reference)
개요
- 논리적으로 같은 데이터를 물리적으로 복제해 사용할 때 문제는 그 데이터를 갱신해야 할 때다
- 이런 상황이라면 복제된 데이터들을 모두 참조로 바꿔주는게 좋다
적용시점
- 데이터를 하나로 사용해야 하는 경우
효과
- 갱신이 필요할 때 모든 복제본을 찾아서 빠짐없이 갱신하는 처리를 하지 않아도 된다
before
let customer = new Customer(customerData);
after
let customer = customerRepository.get(customerData.id);
9.6 매직 리터럴 바꾸기 (Replace Magic Literal)
개요
- 매직 리터럴이란 소스 코드에 등장하는 일반적인 리터럴 값을 말한다
- 코드를 읽는 사람이 그 값의 의미를 모른다면 코드로는 의미를 명확히 알려주지 못하고 각자의 해석이 필요하게 된다
적용시점
- 매직 리터럴이 존재하는 경우
- 단, const ONE = 1 과 같이 값을 바로 쓰는 것보다 이득이 없는 경우 과용하지 않도록 주의해야한다
효과
- 코드 자체가 뜻을 분명하게 드러낼 수 있다
before
function potentialEnergy(mass, height) {
return mass * 9.81 * height;
}
after
const STANDARD_GRAVITY = 9.81;
function potentialEnergy(mass, height) {
return mass * STANDARD_GRAVITY * height;
}
참고
http://www.yes24.com/Product/Goods/89649360
https://refactoring.com/catalog
'소프트웨어공학, CS > 리팩터링 2판' 카테고리의 다른 글
[리팩터링 2판] 11장 API 리팩터링 (0) | 2021.05.16 |
---|---|
[리팩터링 2판] 10장 조건부 로직 간소화 (0) | 2021.04.18 |
[리팩터링 2판] 8장 기능 이동 (2) | 2021.03.28 |
[리팩터링 2판] 7장 캡슐화 (0) | 2021.03.13 |
[리팩터링 2판] 6장 기본적인 리팩터링 (0) | 2021.03.04 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- AWS
- 코드악취
- 일 잘하는 사람은 단순하게 말합니다
- 리팩토링
- 위임
- 조건부 로직
- 지시의 언어
- amazon vpc
- 일잘러
- HTTP
- 디버깅
- Debug
- 그림으로 공부하는 IT 인프라 구조
- 매개변수화
- Refactoring
- Debugging
- 코드스멜
- 리팩터링이란
- amazon aurora
- 박소연
- 변경함수
- 마틴파울러
- 그림으로 배우는 HTTP & Network
- Debug It! 실용주의 디버깅
- https
- 안심 첫 문장
- SSL
- 질의함수
- 제어플래그
- aws fargate
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함