뜻이 드러나지 않는 리터럴 값이 코드에 박혀 있는 것을 매직 넘버(Magic Number) 또는 매직 리터럴(Magic Literal)이라 한다. 의미를 담은 이름의 상수로 바꾸면 코드가 스스로 뜻을 말한다.
// before
if (response.status === 404) ...
const energy = mass * 9.81 * height
// after
const NOT_FOUND = 404
const STANDARD_GRAVITY = 9.81
if (response.status === NOT_FOUND) ...
const energy = mass * STANDARD_GRAVITY * height- 의미를 이미 안다고 해도 각자 머리에서 해석한 것일 뿐이다. 코드에 적혀 있는 편이 낫다
- 주의: 값이 같아도 뜻이 다르면 같은 상수로 묶지 않는다. 우연히 같은 숫자를 하나로 묶으면 한쪽만 바뀔 때 버그가 된다
- 상수가 여러 개 생기면 관련된 것끼리 모아 두는 정리가 이어진다(응집 순서)
- 값의 종류가 정해져 있다면 상수 대신 열거 타입(Enum)이 낫다(enum과 as const 객체)
켄트 벡은 이 정리를 Explaining Constants(한국어판 "설명하는 상수")라 부르고 설명 변수와 나란히 둔다.
출처: 『리팩터링 2판』 마틴 파울러 (원서 Refactoring, 2nd Edition) · refactoring.com: Replace Magic Literal · Refactoring.Guru: Replace Magic Number with Symbolic Constant · 『켄트 벡의 Tidy First?』 켄트 벡 (원서 Tidy First?)