소스 코드에 데이터를 직접 입력해서 저장하는 것을 말한다.
파일 경로, URL, IP 주소, 비밀번호 등이 하드코딩의 대상이 될 수 있다.
// 파일 경로를 직접 넣어준 경우
const file: File = new File("C:\documents\test.txt");
// 의미 있는 특정한 숫자(4)를 그대로 사용한 경우
pulbic move: void(randomNumber: number) {
if (randomNumber > 4) {
this.position++;
}
}
매직 넘버(Magic Number)는 하드 코딩된 일정한 값을 의미하는 숫자나 문자열 등을 의미한다.
만약, 하드코딩된 숫자를 작성하지 않은 사람이 접한다면 무엇을 의미하는지 어떤 규칙이 적용되고 있는지 파악하기 어려워진다.
다음은 12개월 할부만 가능한 신용카드의 할부 계산 코드이다.
static calculateMonthlyPrincipal(principal: number) {
return principal / 2;
}
static calculateMonthlyInterest(principal: number) {
return principal * 0.1 / 12;
}
요구사항으로 할부가 10개월만 가능하게 변경된다면?
할부 개월 수를 의미하는 12를 모두 찾아내어 하나하나 10으로 수정하는 작업을 해야만 한다.
이처럼 하드코딩을 하게 되면 유지 보수하기 어려운 코드가 된다.
const INSTALLMENT_MONTHS = 12;
const INTEREST_RATE = 0.1;
static calculateMonthlyPrincipal(principal: number) {
return principal / INSTALLMENT_MONTHS;
}
static calculateMonthlyInterest(principal: number) {
return principal * INTEREST_RATE / INSTALLMENT_MONTHS;
}
이전 예제를 다음과 같이 변경했다.
의미가 불분명한 매직 넘버를 상수로 선언하여 의미를 파악하기가 좀 더 쉬워졌다.
또한 아까처럼 할부 개월 수가 바뀌는 요구사항에도 상수 값만 변경하면 된다. 즉, 변화에 대응하기 더 쉬워지고 유지 보수하기 좋은 코드가 된다.
매직 넘버를 피하는 방법으로는 연관된 상수를 enum으로 관리할 수도 있다.
다음은 프로젝트에서 네이버, 구글 등 인증 유형을 다음과 같이 enum 타입으로 두고 사용한 예시이다.
export enum UserProvider {
GOOGLE = 'GOOGLE',
NAVER = 'NAVER',
LOCAL = 'LOCAL',
}
코드를 작성하면서 하면서 종종 놓치는 부분인 것 같다. 코드를 작성하는 나의 입장에서는 너무 당연해서 넘어가거나 깜빡하여 하드 코딩된 부분들이 남아있는 경우가 있었다.
앞으로는 이런 부분들을 고민하면서 하드코딩을 줄이고 더 깔끔한 코드를 작성해야겠다..
Reference
https://tecoble.techcourse.co.kr/post/2020-05-07-avoid-hard-coding/
https://dev-dmsgk.tistory.com/30