코딩 컨벤션 업무를 하며 알게 된 것들 - 1
이번 업무를 통해 Airbnb나 StandardJS 등 유명한 가이드의 규칙을 자세히 살펴보았습니다. 또 ESLint에는 어떤 규칙들이 있는지, 왜 이런 규칙이 있는지 찾아보는 좋은 계기가 되었습니다. ESLint 규칙을 찾아보면서 몰랐던 내용이나, 흥미로운 내용을 따로 정리해 보았습니다.
1. no-octal
console.log(010); // 8
console.log(011); // 9
console.log(080); // 80
console.log(091); // 91
- "0"-prefixed octal literals 은 strict 모드나 ES6 이후 버전에서는 SyntaxError 에러를 발생시킵니다.*
2. yoda
이름이 좀 이상한것 같아 찾아보니 찾아보니 스타워즈의 요다 였습니다. 요다가 말하는 방식 (yodish)에서 이름을 따온 룰 이라고 합니다.
보통 영어에서 "Yoda is a jedi Master" 와 같이 subject, verb, object 순으로 말하는데,
요다는 "A jedi Master yoda is" 와 같이 object, subject, verb 순으로 말한다더군요.
if ("red" === color) {
// "만약 'red'가 color면 처럼" 읽힌다!
}
if (color === 'red') {
// "만약 color가 'red'면 처럼" 읽힌다!
}
if (color = 'red') {
// = 이 하나 빠졌다!
}
==
을 의도했지만 실수로 =
를 하나 빼먹게 된다면 변수 color에는 'red' 라는 값이 할당됩니다. 에러도 발생하지 않고 초기에 버그를 잡기 힘듭니다. 하지만 다음과 같이if ('red' = color) {
// = 이 하나 빠졌다!
}
- 개발 툴도 좋아지고 다른 lint 규칙으로 yodish의 장점을 커버할 수 있기 때문에 많은 곳에서 yoda를 규칙을 never(사용 못 하도록)로 설정합니다.
3. no-magic-numbers
- ESLinter 에서는 숫자만 매직넘버로 거르지만 '매직넘버' 라는 용어는 숫자뿐만 아니라 의미가 불분명한 모든 토큰을 가리킵니다.
- What is a magic number, and why is it bad? - stackoverflow
// 배열 길이 0 인지
if (someArray.length === 0) {}
// 원의 둘레
const circleCircumference = radius * Math.PI * 2;
const ZERO = 0;
const TWO = 2;
if (someArray.length === ZERO) {}
const circleCircumference = radius * Math.PI * TWO;
ignores 옵션으로 특정 숫자들은 사용할 수 있게 하는 설정이 가능합니다. 하지만 어떤 기준으로 어떤 숫자를 허용할 건지에 대한 의문이 생깁니다. 그래서 매직넘버의 예외로 둘 수 있는 기준이 있나? 생각이 들어 찾아보았습니다만 기준에 대한 명확한 자료를 찾지는 못했습니다.
stackoverflow 나 github의 몇몇 글을 찾아보니 간혹 이 규칙을 적용한 경우에는 예외로 사용할 수 있는 수를 [0], [-1, 0, 1], [-1, 0, 1, 2] 와 같이 비슷하지만 조금씩 다른 옵션들을 사용하고 있었습니다. 하지만 아마 대부분 휴리스틱에 의존한 설정이 아닐까 싶습니다.