Martin Fowler - Refactoring을 읽고 정리한 글입니다.(140~143p)
요약
자연스럽게 같이 다녀야 하는 파라미터들을 객체화한다.
Motivation
함수에 함수를 거쳐 다니는 데이터아이템이 종종 있는데, 저자는 이 데이터덩어리를 하나의 데이터구조로 수정하는것을 좋아함.
데이터를 구조적으로 그룹핑하는건 데이터 항목 간의 관계를 위해 새로운 크기의 매개변수 목록을 사용하도록 명시하기 때문에 가치있다.
이렇게하면 새로운 구조를 사용하는 어떤 함수라도 파라미터 리스트의 크기가 줄어든다.
모든 함수에서 그 구조의 엘리먼트를 얻기 위해 같은 이름을 사용할 수 있어서, 일관성을 유지하게 해준다..
그러나 이 리팩터링의 진정한 힘은 어떻게 그것이 코드를 더 깊게 변화시킬 수 있느냐 하는 것이다.
이 새로운 구조들을 확인할 때, 이 구조들을 사용하기 위해 프로그램의 행동 방향을 바꿀 수 있다.
공통 기능 집합으로서 또는 데이터 구조를 이러한 기능과 결합시키는 그것이 분류될 때 이 데이터에 대한 공통 행동을 캡처(포착?)하는 기능을 생성할 것이다.
이 프로세스는 코드의 개념적 그림을 변화시킬 수 있으며, 이러한 구조들을 내가 도메인에 대한 이해를 크게 단순화할 수 있는 새로운 난제로 올릴 수 있다.
이게 먹힐 때. 어느 것도 놀랄 만큼 강력한 효과를 가질 수 없지만, 프로세스를 시작하기 위해 매개 변수 개체 소개를 사용하지 않는 한 이 방법은 가능하다.
Mechanics
- 적당한 구조를 하나 만든다- 저자는 클래스를 만드는걸 선호함
- 테스트
- Change Function Declaration을 사용해서 새로운 구조에 파라미터를 하나 추가한다.
- 테스트.
- 각각 부르는 곳에서 새로운 구조를 pass in the correct instance하도록 조정한다. 하나마다 테스트.
- 새 구조의 각 엘리먼트마다 원래 파라미터에서 구조의 엘리먼트를 사용하도록 변경한다. 파라미터를 삭제하고 테스트한다.
Example
어떤 장소에 대한 정보 객체.
readings : 표시 도수. 시간별 온도 정보를 가지고 있음.
지정한 범위 밖의 온도를 리턴하는 함수.
위 함수를 호출하는 곳.
숫자범위를 관리해주는 클래스 생성.
Change function declaration기법을 써서 새 객체를 readingOutsideRange의 파라미터로 추가.(range)
자바스크립트에서는 그냥 둬도 되지만, 다른 언어라면 그 인자 자리에 null을 넣어줘야함.
코드 동작을 바꾼건 없기때문에 테스트는 통과됨. 이제 각 호출하는 곳으로 가서 테스트가 통과할수있게 조정함.
NumberRange클래스를 사용해서 range라는 변수를 만들고, 호출하는곳에 넣어줌.
이제 대체할수있음. max 지우고 대신 range.max사용하도록 변경.
min도 대체해줌.
이제 range만 쓰게 할 수 있음. 이제 리팩토링은 완성.
파라미터 덩어리들을 실제 오브젝트로 교체하는건 진짜 좋은 일을 하기 위한 준비작업이다.
이렇게 클래스 만들어서 진짜 좋은점은 코드 동작을 새 클래스에 옮길수있다는점이다.
이 경우 이제 온도범위 안에 있는지를 확인하는 함수를 NumberRange클래스 안에 정의해서, 가져다 쓸수있게 만듬.
이렇게하면 이제 온도범위에 대한 것뿐만 아니라, 다른 곳에서도 어떤 숫자가 최솟값 최댓값 범위 안에 있는지 확인하는 용도로 사용가능.
value 기반의 equality method를 만들 수 있게 해줘서. 진짜 값 객체를 만들수있다.
=이렇게 하면 특정 용도나 상황이 아니라 값에 대해서만 평가하는 메서드가 되어서 여기저기서 유용하게 쓸수있다.. 라는것같음.
'Web development > Books' 카테고리의 다른 글
Refactoring - Inline Class (0) | 2019.12.31 |
---|---|
Refactoring - Encapsulate Collection (0) | 2019.12.31 |
Refactoring - Rename Variable (0) | 2019.12.31 |
Refactoring - Building Test (0) | 2019.12.31 |
Refactoring - Bad Smells (0) | 2019.12.31 |
댓글