eslint/complexity 제한
작동 방식
프로그램 내 최대 순환 복잡도를 강제 적용합니다. 순환 복잡도란 프로그램 내 선형 독립 경로의 수를 의미합니다.
왜 문제가 되는가?
높은 코드 복잡도는 코드의 가독성을 저하시킵니다. 이 규칙은 프로그램 내 분기 수를 줄여 코드를 더 쉽게 이해할 수 있도록 하기 위해 도입됩니다.
예시
{ "max": 2 } 설정 시 잘못된 코드 예시
js
function foo() {
if (foo1) {
return x1; // 1번째 경로
} else if (foo2) {
return x2; // 2번째 경로
} else {
return x3; // 3번째 경로
}
}
function bar() {
// 두 가지 경로 존재 - bar1이 거짓일 때, 그리고 bar1이 참일 때(이 경우 bar1 = bar1 && bar2)
bar1 &&= bar2;
// 두 가지 경로 존재 - bar3이 참일 때, 그리고 bar3이 거짓일 때(이 경우 bar3 = 4)
bar3 ||= 4;
}
// 두 가지 경로 존재 - baz1이 정의되었을 때와, baz1이 정의되지 않았고 'a'로 할당되었을 때
function baz(baz1 = "a") {
const { baz2 = "b" } = baz3; // 추가로 두 가지 경로 존재 - baz2가 정의되었을 때와 정의되지 않았을 때
}
function d() {
d1 = d2?.d3?.(); // 옵셔널 체이닝은 각각 두 가지 경로를 생성함 - 객체가 정의되었을 때와 정의되지 않았을 때
}{ "max": 2 } 설정 시 올바른 코드 예시
js
// 이 예시는 ESLint 문서에서 직접 인용됨
function foo() {
// 이 함수의 복잡도 = 1
class C {
x = a + b; // 이 초기화식의 복잡도 = 1
y = c || d; // 이 초기화식의 복잡도 = 2
z = e && f; // 이 초기화식의 복잡도 = 2
static p = g || h; // 이 초기화식의 복잡도 = 2
static q = i ? j : k; // 이 초기화식의 복잡도 = 2
static {
// 이 정적 블록의 복잡도 = 2
if (foo) {
baz = bar;
}
}
static {
// 이 정적 블록의 복잡도 = 2
qux = baz || quux;
}
}
}구성 방법
이 규칙은 다음 속성을 가진 구성 객체를 수용합니다.
max
type: integer
기본값: 20
순환 복잡도의 최대 값
variant
type: "classic" | "modified"
기본값: "classic"
사용할 순환 복잡도 유형
"classic"
클래식은 메카브 순환 복잡도를 의미합니다.
"modified"
수정형은 클래식 순환 복잡도를 기반으로 하지만, switch 문은 case 문의 개수에 관계없이 복잡도를 1만큼 증가시킵니다.
사용 방법
구성 파일 또는 명령줄 인터페이스를 통해 이 규칙을 활성화하려면 다음을 사용할 수 있습니다:
json
{
"rules": {
"complexity": "error"
}
}bash
oxlint --deny complexity