컬렉션에 값이 있는지 볼 때는 indexOf보다 contains를 써요
컬렉션에 값이 있는지 볼 때는 indexOf보다 contains를 써요
prefer_contains 린트 규칙은, List와 String에 값이 있는지 확인할 때 indexOf 대신 contains를 쓰라고 권하는 규칙이에요. Stable 상태이고, 공식 추천(Recommended) 규칙이며 코드 수정도 자동으로 가능해요.
본문
컬렉션이 특정 원소를 갖고 있는지 확인할 때 indexOf로 인덱스를 찾는 코드는 읽기 어렵고 성능도 안 좋을 수 있어요. 그럴 때는 contains를 쓰는 게 훨씬 깔끔해요.
BAD — indexOf가 -1인지로 없는 걸 판단했어요.
if (lunchBox.indexOf('sandwich') == -1) return 'so hungry...';
GOOD — contains로 있는지 없는지를 바로 확인해요.
if (!lunchBox.contains('sandwich')) return 'so hungry...';
indexOf(...) == -1은 '이 값이 없다'는 걸 간접적으로 표현하는 거라서, 의도를 한 번 더 읽어야 해요. contains는 '들어 있나?'라는 질문을 그대로 담고 있어서 바로 읽혀요. 성능 면에서도 컬렉션 타입에 따라 contains가 더 유리한 경우가 있어요.
규칙 켜기
analysis_options.yaml 파일의 linter > rules 아래에 prefer_contains를 추가하면 돼요.
linter:
rules:
- prefer_contains
YAML 맵 문법으로 설정한다면 이렇게 써요.
linter:
rules:
prefer_contains: true
더 알아보기
- 인덱스를 직접 다뤄야 할 때가 아니라, 존재 여부만 궁금할 때 이 규칙이 적용돼요.