eslint/yoda 스타일
작동 방식
"요다" 조건을 요구하거나 허용하지 않도록 합니다. 이 규칙은 변수와 리터럴 값을 비교하는 조건의 스타일을 일관되게 유지하려는 목적을 가지고 있습니다.
왜 좋지 않은가?
요다 조건이라는 표현은 조건에서 리터럴 값이 먼저 오고 변수가 두 번째로 오기 때문에 붙여진 이름입니다. 예를 들어, 다음은 요다 조건의 예시입니다:
if ("red" === color) {
}이 조건은 "만약 빨간색이 색상과 같다면"처럼 읽히며, 스타워즈 캐릭터 요다의 말투와 비슷합니다. 반면에 피연산자를 다른 순서로 배열한 경우를 비교해 보겠습니다:
if (color === "red") {
// ...
}이 경우 일반적으로 "만약 색상이 빨간색과 같다면"으로 읽히며, 비교를 설명하는 데 더 자연스러운 표현이라고 여겨질 수 있습니다. 요다 조건을 지지하는 사람들은 리터럴 값에 =을 사용하는 실수를 방지할 수 있다는 점을 강조합니다. 리터럴 값에 할당할 수 없기 때문에 == 대신 =를 사용하는 실수는 문법 오류를 발생시키고, 이를 조기에 발견할 수 있기 때문입니다. 이러한 관습은 도구가 아직 충분히 발전하지 않았던 초기 프로그래밍 시절에 매우 흔했습니다. 반면 요다 조건을 반대하는 사람들은 도구의 발전으로 인해 우리는 더 나은 프로그래머가 되었으며, 도구(예: ESLint)가 =과 ==의 실수를 이미 잡아주기 때문에, 요다 조건 패턴의 유용성은 코드 가독성 저하만큼 가치가 없다고 주장합니다.
예시
never
기본값 "never" 옵션에서 잘못된 코드 예시:
if ("red" === color) {
// ...
}
if (`red` === color) {
// ...
}
if (`red` === `${color}`) {
// ...
}
if (true == flag) {
// ...
}
if (0 <= x && x < 1) {
// ...
}기본값 "never" 옵션에서 올바른 코드 예시:
if (5 & value) {
// ...
}
if (value === "red") {
// ...
}
if (value === `red`) {
// ...
}
if (`${value}` === `red`) {
}exceptRange
"never", { "exceptRange": true } 옵션에서 올바른 코드 예시:
function isReddish(color) {
return color.hue < 60 || 300 < color.hue;
}
if (x < -1 || 1 < x) {
// ...
}
if (count < 10 && 0 <= rand && rand < 1) {
// ...
}
if (`blue` < x && x < `green`) {
// ...
}
function howLong(arr) {
return 0 <= arr.length && arr.length < 10 ? "short" : "long";
}onlyEquality
"never", { "onlyEquality": true } 옵션에서 올바른 코드 예시:
if (x < -1 || 9 < x) {
}
if (x !== "foo" && "bar" != x) {
}
if (x !== `foo` && `bar` != x) {
}always
"always" 옵션에서 잘못된 코드 예시:
if (color == "blue") {
// ...
}
if (color == `blue`) {
// ...
}"always" 옵션에서 올바른 코드 예시:
if ("blue" == value) {
// ...
}
if (`blue` == value) {
// ...
}
if (`blue` == `${value}`) {
// ...
}
if (-1 < str.indexOf(substr)) {
// ...
}구성 방법
첫 번째 옵션
형식: "never" | "always"
"never"
기본값인 "never" 옵션은 객체 리터럴을 통해 exceptRange와 onlyEquality를 포함하여 예외 설정을 할 수 있습니다.
"always"
"always" 옵션은 비교에서 리터럴 값이 항상 먼저 오도록 요구합니다.
두 번째 옵션
이 옵션은 다음과 같은 속성을 가진 객체입니다:
exceptRange
형식: boolean
기본값: false
"exceptRange" 속성이 true로 설정되면, 괄호 안에 직접 감싸져 있는 범위 비교에서 요다 조건을 허용합니다. 이는 if나 while 조건의 괄호도 포함합니다.
범위 비교란 변수가 두 개의 리터럴 값 사이에 있는지 아닌지를 확인하는 비교를 의미합니다.
onlyEquality
형식: boolean
기본값: false
"onlyEquality" 속성이 true로 설정되면, 규칙은 등호 연산자(==, ===)에 대해서만 요다 조건을 보고합니다. onlyEquality 옵션은 exceptRange가 허용하는 예외보다 더 많은 예외를 허용하므로, 두 옵션을 함께 사용하는 것은 의미가 없습니다.
사용 방법
이 규칙을 구성 파일 또는 명령줄 인터페이스에서 활성화하려면 다음을 사용할 수 있습니다:
{
"rules": {
"yoda": "error"
}
}oxlint --deny yoda