Home [리팩터링] chapter 8 기능 옮기기
Post
Cancel

[리팩터링] chapter 8 기능 옮기기

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는 또 다른 함수를 사용해 입력 컬렉션을 필터링해 부분집합을 만든다. 이 부분집합은 파이프라인의 다음 단계를 위한 컬렉션으로 쓰인다.

This post is licensed under CC BY 4.0 by the author.

[TS] Typescript의 함수

[리팩터링] chapter 9 데이터 조직화

Comments powered by Disqus.