우테코 1주차 회고를 하기 위해서 다른 분들의 PR을 확인하다보니 매직 넘버
라는 용어를 발견했다.
들어는 봤지만 정확한 의미를 모르고 있어서 이를 공부해보기 위해서 여러 자료들을 기반으로 작성해보았다!
조건
단점
WIDTH_RATIO
, HEIGHT_RATIO
라고 작성해두는 편이 좋다예시 1: 의미가 있는 숫자 (ex. PI
, EULER_NUMBER
등)
😈 BAD
add(2.7182818);
😇 GOOD
const EULER_NUMBER = 2.7182818;
add(EULER_NUMBER);
⇒ 이렇게 하면 매직넘버 제거로 오일러 상수를 사용하려고 한 의도가 명확해짐
예시 2: 파일 확장자
😈 BAD
function getFileType(fileName) {
if (fileName.endsWith(".jpg")) {
return "image";
} else if (fileName.endsWith(".mp3")) {
return "audio";
} else if (fileName.endsWith(".txt")) {
return "text";
} else {
return "unknown";
}
}
😇 GOOD
const IMAGE_EXTENSION = ".jpg";
const AUDIO_EXTENSION = ".mp3";
const TEXT_EXTENSION = ".txt";
function getFileType(fileName) {
if (fileName.endsWith(IMAGE_EXTENSION)) {
return "image";
} else if (fileName.endsWith(AUDIO_EXTENSION)) {
return "audio";
} else if (fileName.endsWith(TEXT_EXTENSION)) {
return "text";
} else {
return "unknown";
}
}
예시 3: 시간 관련 숫자들
😈 BAD
function calculateAge(birthDate) {
const currentYear = new Date().getFullYear();
const birthYear = new Date(birthDate).getFullYear();
return currentYear - birthYear;
}
😇 GOOD
const CURRENT_YEAR = new Date().getFullYear();
function calculateAge(birthDate) {
const birthYear = new Date(birthDate).getFullYear();
return CURRENT_YEAR - birthYear;
}
같은 개념으로 반복되어 사용되거나 의미가 있는 메시지들과 같이 상수로 대체 되어야할 문자열을 매직 리터럴이라고 한다.
이도 매직 넘버처럼 상수로 치환하는 것 지향해야 한다.
예시
const MESSEAGE = Object.freeze({
START_GAME : '숫자 야구 게임을 시작합니다.',
INPUT_NUMBER : '숫자를 입력해주세요 : ',
BALL : '볼',
STRIKE : '스트라이크',
NOTHING : '낫싱',
CELEBRATE_END : '3개의 숫자를 모두 맞히셨습니다! 게임 종료',
RESTART_EXIT : '게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.',
STRIKEOUT : '3스트라이크',
RESTART : '1',
EXIT : '2',
ERROR : '[ERROR] 숫자가 잘못된 형식입니다.',
})
매직 리터럴을 정적(static)이고 변경 불가능(final)한 상수로 선언하여 사용하자
reference
https://velog.io/@hwisaac/%EB%A7%A4%EC%A7%81%EB%84%98%EB%B2%84
https://dev.rase.blog/21-03-20-magic-number/