본문 바로가기
개발/책읽기

Refactoring - Replace Function with Command

by 자몬다 2020. 1. 2.
Martin Fowler - Refactoring을 읽고 정리한 글입니다.(337~343p)

 

// Before
function score(candidate, medicalExam, scoringGuide) {
	let result = 0;
    let healthLevel = 0;
    // long body code
}

// After
class Scrorer {
	constructor(candidate, medicatExam, scroingGuide) {
    	this._candidate = candidate;
        this._medicalExam = medicalExam;
        this._scoringGuide = scoringGuide;
    }
    
    execute() {
    	this._result = 0;
        this._healthLevel = 0;
        // long body code
    }
}

독립적이든, 객체에 붙어있는 메서드든, 함수는 프로그래밍의 기초, 벽돌과 같다.

하지만 캡슐화하는것이 유용한 순간들이 있다. 저자는 이런 경우를 "command object"나 command라고 부른다고 한다.

주로 요청이나 실행이 object의 목적과 관련있을때 필요한 single method와 관련이 깊다.

 

장점

command는 일반 함수의 메커니즘보다 유연성을 높게 해준다. 

command는 complimentary operations를 가질 수 있다.(예: undo)

complimentary: 칭찬하는, 무료의.

더 풍부한 라이프라이클을 갖는 파라메터를 만들 수 있게 도와주기도 한다.

object는 있지만 일급 함수가 없는 언어로 개발할 때 대신 command를 쓸 수 있다.

first-class function : 함수를 다른 변수와 동일하게 다루는 언어는 일급 함수를 가졌다고 표현합니다. 예를 들어, 일급 함수를 가진 언어에서는 함수를 다른 함수에 매개변수로 제공하거나, 함수가 함수를 반환할 수 있으며, 변수에도 할당할 수 있습니다.(MDN web docs)

복잡한 함수를 분해하는데도 사용가능하다.

특히 이렇게하면 중첩된 함수들을 테스트/디버깅 용도로 즉시 부를 수 있게 된다.

 

주의점

저자는 사실 95%는 일급함수를 택하고, 나머지의 경우에만 command를 사용한다고 한다.

command를 쓰면 유연해지지만, 그만큼 값을 치르게 된다고 한다.

command는 논란이 많은 요소이다.

command object로 context를 set하고 나서 command를 사용한다.

 

Mechanics

  1. 기존 함수에 기반한 이름을 가진 빈 클래스를 생성한다.
  2. 함수 이동을 사용하여 함수를 빈 클래스로 이동시킨다.
    • 기존 함수는 포워딩 함수로 리팩토링의 마지막까지 남겨두어라. (wikipedia 참고: Forwarding)
    • 네이밍 컨벤션을 따라야 한다. 컨벤션이 없으면, 일반적인 이름을 지어야한다. 
  3. 각 인자에 맞는 필드를 만들고, 인자를 constructor로 이동시킨다.

 

 

728x90

'개발 > 책읽기' 카테고리의 다른 글

Refactoring - Replace Function with Command  (0) 2020.01.02
Refactoring - Introduce Assertion  (0) 2019.12.31
Refactoring - Decompose Conditional  (0) 2019.12.31
Refactoring - Split Variable  (0) 2019.12.31
Refactoring - Move Statesments into Function  (0) 2019.12.31
Refactoring - Inline Class  (0) 2019.12.31

댓글0