unnecessary_getters_setters 린트 규칙: 안전하려고 붙이는 getter/setter 피하기

unnecessary_getters_setters 린트 규칙: 안전하려고 붙이는 getter/setter 피하기

unnecessary_getters_setters"안전"을 위해 필드를 그냥 getter/setter로 감싸는 것을 피하라고 알려주는 린트 규칙이에요. Java나 C#에서는 이런 패턴이 흔하지만, Dart에는 그 제약이 없어서 그럴 필요가 없어요.

출처: unnecessary_getters_setters

본문

설명

Effective Dart에서는 이렇게 말해요. "안전"을 위해 필드를 getter와 setter로 감싸는 것을 피하세요.

Java와 C#에서는 모든 필드를 getter와 setter(또는 C#의 프로퍼티) 뒤에 숨기는 게 흔해요. 구현이 그냥 필드로 전달(forward)되기만 하더라도 말이죠. 그렇게 해두면, 나중에 그 멤버에서 더 많은 작업을 해야 할 때 호출부를 건드리지 않고 처리할 수 있기 때문이에요. Java에서는 getter 메서드를 부르는 것과 필드에 접근하는 것이 서로 다르고, C#에서도 프로퍼티에 접근하는 것이 raw 필드에 접근하는 것과 바이너리 호환이 안 되기 때문이에요.

하지만 Dart에는 그런 제약이 없어요. 필드와 getter/setter는 완전히 구분할 수 없을 정도로 똑같이 동작해요. 그래서 클래스에 필드를 그대로 노출해두고, 나중에 필요해지면 그 필드를 getter와 setter로 감싸도 그 필드를 사용하는 어떤 코드도 손대지 않아도 돼요.

BAD:

class Box {
  var _contents;
  get contents => _contents;
  set contents(value) {
    _contents = value;
  }
}

GOOD:

class Box {
  var contents;
}

필드를 그대로 노출해도, 나중에 getter/setter로 바꿔도 사용하는 코드는 똑같으니까 그냥 깔끔하게 필드만 두는 게 좋아요.

활성화 방법

unnecessary_getters_setters 규칙을 활성화하려면 analysis_options.yaml 파일의 linter > rules 아래에 규칙을 추가하면 돼요.

linter:
  rules:
    - unnecessary_getters_setters

대신 YAML 맵 문법을 사용해서 린트 규칙을 설정하고 있다면, linter > rules 아래에 unnecessary_getters_setters: true를 추가하면 돼요.

linter:
  rules:
    unnecessary_getters_setters: true

더 알아보기