Martin Fowler - Refactoring을 읽고 정리한 글입니다.(213~216p)
Move Statesments to Callers의 반대 케이스.
예제
// Before
result.push(`<p>title: ${person.photo.title}</p>`); // 이 라인을
result.concat(photoData(person.photo));
function photoData(aPhoto) {
return [
`<p>location : ${aPhoto.location}</p>`,
`<p>date : ${aPhoto.date.toDateString()}</p>`,
];
}
// After
result.concat(photoData(person.photo));
function photoData(aPhoto) {
return [
`<p>title: ${person.photo.title}</p>`, // 여기로 이동
`<p>location : ${aPhoto.location}</p>`,
`<p>date : ${aPhoto.date.toDateString()}</p>`,
];
}
사진정보를 html로 만들어주는 예제이다.
concat: 인자로 주어진 배열이나 값들을 합쳐서 반환하는 메서드
title을 push하고 메서드를 실행하는게 아니라 메서드 자체에 title을 포함시켰다.
Motivation
중복제거는 중요하다. 만약 특정 함수를 부를때마다 같은 코드를 실행해야한다면 반복되는 코드를 합쳐서 함수에 집어넣는다. 그렇게 하면 반복되는 코드가 한곳에 있게 되고 모든 콜러가 사용할 수 있다. 만약에 분리되어야하면 Move Statements to Caller로 또 쉽게 옮길수있다.
그래도 함수에 들어있을때 이해하기 쉬워야하고 상식적이어야 한다. 만약에 상식적이지 않아도 항상 같이 불린다면 Extract Function을 사용한다. (예를들면 사진정보를 프린트할때마다 유저정보도 프린트해야한다면 그냥 유저정보 프린트하는 함수를 따로 추출해서 각각 부른다)
Mechanics
반복되는 코드가 부르는 함수 근처에 있는게 아니면 Slide Statement를 사용해서 인접하게 해라.
타겟 함수가 소스 펑션만 호출하는거면 그냥 코드 잘라내서 타겟에 집어넣고 테스트하고, 이후 방법들은 무시해라.
호출하는 곳이 더 있으면, Extract Function을 사용해서 대상 함수 호출과 그 안으로 옮길 스테이트먼트를 모두 추출해라. 일시적이지만 그렙하기(나중에 검색해서 바꾸기) 쉬운 이름을 지어라.
다른 모든 호출하는 곳을 새로운 함수를 쓰도록 변환하고 바꾼곳을 모두 테스트해라.
모든 곳이 새로운 함수를 쓰게 되면, Inline Function을 사용해서 원래 함수를 새 함수에 완전히 집어넣고, 원래 함수를 지워라.
함수 이름을 원래 함수랑 같은 이름으로 바꿔라.
'Web development > Books' 카테고리의 다른 글
Refactoring - Decompose Conditional (0) | 2019.12.31 |
---|---|
Refactoring - Split Variable (0) | 2019.12.31 |
Refactoring - Inline Class (0) | 2019.12.31 |
Refactoring - Encapsulate Collection (0) | 2019.12.31 |
Refactoring - Introduce Parameter Object (0) | 2019.12.31 |
댓글