단독 함수만을 위한 객체 안으로 캡슐화 하는 객체를 명령 객체 혹은 명령이라고 한다. 명령은 평범한 함수 메커니즘보다 훨씬 유연하게 함수를 제어하고 표현할 수 있다.
되돌리기 같은 보조 연산을 제공하거나, 수명주기를 더 정밀하게 제어하는 데 필요한 매개변수를 만들어주는 메서드등을 제공할 수 있다. 일급 함수를 지원하지 않는 언어를 사용할때 일급 함수의 기능 대부분을 흉내 낼 수 있다. 단, 유연성은 (언제나 그렇듯) 복잡성을 키우고 얻는 대가임을 잊지 말아야 한다
🧷 절차
대상 함수의 기능을 옮길 빈 클래스를 만든다. 클래스 이름은 함수 이름에 기초해 짓는다.
방금 생성한 빈 클래스로 함수를 옮긴다.
함수의 인수들 각각은 명령의 필드로 만들어 생성자를 통해 설정할지 고민해본다.
🧷 예시
🧷 리팩터링 전
function score(candidate, medicalExam, scoringGuide) {
let result = 0;
let healthLevel = 0;
let highMedicalRiskFlag = false;
if (medicalExam.isSmoker) {
healthLevel += 10;
highMedicalRiskFlag = true;
}
let certificationGrade = 'regular';
if (scoringGuide.stateWithLowCertification(candidate.originState)) {
certificationGrade = 'low';
result -= 5;
}
// ...
result -= Math.max(healthLevel - 5, 0);
return result;
}