p.290 필드 옮기기 함수에 어떤 레코드를 넘길 때마다 또 다른 레코드의 필드도 함께 넘기고 있다면 데이터 위치를 옮겨야 한다. 함수에 항상 함께 건네지는 데이터 조각들은 상호 관계가 명확하게 드러나도록 한 레코드에 담는게 가장 좋다. 변경 역시 주요한 요인이다. 한 레코드를 변경하려 할 때 다른 레코드의 필드까지 변경해야 한다면 필드의 위치가 잘못되었다는 신호다. 구조체 여러 개에 정의된 똑같은 필드들을 갱신해야 한다면 한 번만 갱신해도 되는 다른 위치로 옮기라는 신호다.
기존 코드
Customer class
1
2
3
4
5
6
7
8
9
10
11
12
13
class Customer{
constructor(name, discountRate){
this._name = name;
this._discountRate = discountRate;
this._contract = new CustomerContract(dateToday());
}
get discountRate(){return this._discountRate;}
becomePreferred(){this._discountRate += 0.03;}
applyDiscount(amount){
return amount.distract(amount.multiply(this._discountRate));
}
...
}
CustomerContract class
1
2
3
4
5
class CustomerContract{
constructor(startDate){
this._startDate = startDate;
}
}
수정된 코드
Customer class
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Customer{
constructor(name, discountRate){
this._name = name;
this._setDiscountRate(discountRate);
this._contract = new CustomerContract(dateToday());
}
get discountRate(){return this._contract.discountRate;}
_setDiscountRate(aNumber){this._contract.discountRate = aNumber;}
becomePreferred(){this._setDiscountRate(this.discountRate += 0.03);}
applyDiscount(amount){
return amount.distract(amount.multiply(this._discountRate));
}
...
}
CustomerContract class
1
2
3
4
5
6
7
8
class CustomerContract{
constructor(startDate,discountRate){
this._startDate = startDate;
this._discountRate = discountRate;
}
get discountRate(){return this._discountRate;}
set discountRate(arg){this._discountRate = arg;}
}
p.312 문장 슬라이드하기 명령-질의 원칙을 지켜가며 코딩을해야 값을 반환하는 함수는 모두 부수효과가 없음을 장담할 수 있다. 부수효과가 있는 코드를 슬라이스하거나 부수효과가 있는 코드를 건너뛰어야 한다면 훨씬 신중해야한다. https://martinfowler.com/bliki/CommandQuerySeparation.html
p.320 반복문을 파이프라인으로 바꾸기 컬렉션 파이프라인을 이용하면 처리과정을 일련의 연산으로 표현할 수 있다. 이때 각 연산은 컬렉션을 입력받아 다른 컬렉션을 내뱉는다. 대표적인 연산은 map과 filter다. map은 함수를 사용해 입력 컬렉션의 각 원소를 변환하고, filter는 또 다른 함수를 사용해 입력 컬렉션을 필터링해 부분집합을 만든다. 이 부분집합은 파이프라인의 다음 단계를 위한 컬렉션으로 쓰인다.
Comments powered by Disqus.