one_member_abstracts: 멤버가 하나뿐인 abstract 클래스는 함수로 쓰세요
one_member_abstracts: 멤버가 하나뿐인 abstract 클래스는 함수로 쓰세요
클래스를 정의했는데 멤버가 하나뿐이고 이름이 call이나 invoke처럼 의미 없이 붙어 있다면, 그건 사실 함수 하나면 충분한 상황일 때가 많아요. one_member_abstracts는 단순한 함수로 충분한데 멤버가 하나뿐인 abstract 클래스를 만들지 말라고 알려주는 린트(lint) 규칙이에요. 다만 이 규칙은 지금 폐기(deprecated)된 상태라는 걸 먼저 짚고 넘어갈게요.
본문
상세 설명
단순한 함수로 충분한데 멤버가 하나뿐인 abstract 클래스를 정의하는 건 피하세요. 참고로, 멤버가 하나뿐인 abstract 클래스는 종종 다음 단계로 넘어가는 디딤돌이 되기 때문에, 이 린트 규칙은 Dart 3.13부터 폐기됐고 향후 Dart SDK에서 제거될 예정이에요. 이 린트의 포함을 analysis options에서 모두 제거하세요. 계속 적용하고 싶다면 analyzer plugin으로 규칙을 구현하는 걸 고려해 보세요.
Effective Dart에서도 같은 이야기를 하고 있어요. Java와 달리 Dart에는 일급 함수(first-class functions), 클로저(closure), 그리고 이들을 쓰기 좋은 가벼운 문법이 있어요. 콜백 같은 게 필요할 뿐이라면 그냥 함수를 쓰면 돼요. 클래스를 정의했는데 abstract 멤버가 하나뿐이고 그 이름이 call이나 invoke처럼 의미 없는 이름이라면, 사실 함수면 충분할 가능성이 높아요.
BAD:
abstract class Predicate {
bool test(item);
}
GOOD:
typedef Predicate = bool Function(item);
활성화하기
one_member_abstracts 규칙을 활성화하려면 analysis_options.yaml 파일의 linter > rules 아래에 one_member_abstracts를 추가해요.
linter:
rules:
- one_member_abstracts
대신 YAML map 문법으로 린터 규칙을 설정한다면, linter > rules 아래에 one_member_abstracts: true를 추가해요.
linter:
rules:
one_member_abstracts: true
참고로 이 규칙은 Dart 3.13부터 폐기됐어요. 새 프로젝트에서는 굳이 켜지 않는 편이 좋아요.