변수 쪼개기
// 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);
- 변수는 하나의 역할만 수행해야한다.
- 만약 두가지 이상의 역할을 수행한다면, 변수를 쪼개고 적절한 이름을 붙여준다.
- 참고 : 변수는 웬만하면 선언 후 바로 초기화 → 상수화하는 것이 좋다.
필드 이름 바꾸기
// before
class Organization {
get str() {}
}
// after
class Organization {
get title() {}
}
- 예시가 좀 과장되긴 했지만, 필드명 또한 애매하게 작성하면 안된다.
- 만약 애매한게 있다면, 명확하게 바꿔주자
파생 변수를 질의 함수로 바꾸기
// before
get discountedTotal() {return this.discountedTotal;}
set discount(number) {
const old = this.discount;
this.discount = number;
this.discountedTotal += old - number;
}
// after
get discountedTotal() { return this.baseTotal - this.discount; }
set discount(number) {
this.discount = number;
}
- 위 경우 discountedTotal이라는 가변 필드가 존재하고, set discount를 할 때마다 갱신이 된다.
- 가변 데이터는 소프트웨어의 작동 방식을 이상하게 만든다.
- 따라서 가변 데이터를 가능한 한 줄이고, 더 줄일 수 없다면 유효 범위를 최소화해야한다.
- 위의 경우 discountedTotal의 값은 충분히 다른 변수들로부터 계산이 가능하다.
- 따라서 해당 필드를 지우고, 이를 만들어내는 수식을 활용하여 리턴한다.
참조를 값으로 바꾸기
// before
class SomeClass {
someFunc(arg) {
this.someObject.field -= arg;
}
}
// after
class SomeClass {
someFunc(arg) {
this.someObject = new SomeObject(this.someObject.arg - arg);
}
}
- 객체 안의 내부 객체의 경우 참조 혹은 값으로 취급할 수 있다.
- 참조 : 내부 객체의 필드를 수정할 때 내부 객체는 그대로 둔 채 그 객체의 속성을 갱신 (위의 방식)
- 값 : 내부 객체의 필드를 수정할 때 새로운 필드를 담은 객체로 기존 내부 객체를 통째로 대체
- 값으로 사용하는 경우 불변임을 만족할 수 있다. 즉, 한 객체가 생성되었을 때의 상태가 절대 변하지 않는 것이다.
- 이러한 불변 데이터는 내부로의 영향을 걱정할 필요가 없다.
- 분산 시스템과 동시성 시스템에서 좋다.
- 그러나, 특정 객체를 여러 객체에서 공유하고 있는 상태에서, 공유 객체의 값을 변경했을 때 이를 관련 객체 모두에 알려줘야 한다면 공유 객체를 참조로 다뤄야함 (뭔소린지 모르겠다..)
값을 참조로 바꾸기
// before
let customer = new Customer(customerData);
// after
let customer = customerRepository.get(customerData.id);
- 참조 객체를 값으로 다루는 것은 불변식을 제공하므로 동시성에 좋다.
- 그러나 해당 상태를 갱신할 필요가 있을 때, 값으로 사용했다면 모두 찾아 바꿔야 한다.
- 만약 참조로써 사용했다면 해당 참조의 필드만 수정하면 전부 바뀌므로 이점이 있다.
- 참조로써 사용한다는 것은 그 객체가 단 하나임을 이용하는 것이므로, 싱글톤을 의미한다.
- 이 방식을 사용하고 싶을 경우, 그 객체를 직접 생성하는 것이 아닌 repository, factory 등을 통해 받아오는 저장소가 필요해진다.
- 싱글톤의 최대 단점은 전역 데이터를 사용할 때와 동일하다.
- 또한 set 을 사용할 경우 null일 때 참조를 할 수도 있다.
매직 리터럴 바꾸기
// 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;
}
- 매직 리터럴 : 소스 코드에서 등장하는 일반적인 리터럴 값
- 만약 이 값이 꽤나 중요한 의미를 가지고 있다면, 상수를 부여하여 가독성과 의미를 더해주는 것이 매우 중요하다.
- 가급적 리터럴을 직접 쓰는 일을 줄이고 상수로써 사용해주는 게 좋다.
https://product.kyobobook.co.kr/detail/S000001810241