초기화 형식 인자 사용하기

초기화 형식 인자 사용하기

클래스 생성자에서 받은 인자를 같은 이름의 필드에 그대로 넣어 주는 코드는 자주 볼 수 있어요. this.x = x;처럼 직접 대입하는 대신, Dart의 **초기화 형식 인자(initializing formals)**를 쓰면 그 반복을 줄일 수 있어요. 이 린트 규칙이 가능한 곳에 초기화 형식 인자를 쓰도록 알려줘요.

출처: prefer_initializing_formals

본문

가능하면 초기화 형식 인자를 사용하세요.

초기화 형식 인자를 사용하면 코드가 더 간결해져요.

나쁜 예:

class Point {
  num? x, y;
  Point(num x, num y) {
    this.x = x;
    this.y = y;
  }
}

좋은 예:

class Point {
  num? x, y;
  Point(num this.x, num this.y);
}

나쁜 예:

class Point {
  num? x, y;
  Point({num? x, num? y}) {
    this.x = x;
    this.y = y;
  }
}

좋은 예:

class Point {
  num? x, y;
  Point({required num this.x, required num this.y});
}

num this.x처럼 파라미터에 this.를 붙이면, 인자가 바로 같은 이름의 필드에 초기화되는 거예요. 생성자 몸통에서 대입하는 코드가 사라지면서 훨씬 깔끔해지죠.

이름이 다르면 린트가 생기지 않아요

이 규칙은 파라미터 이름과 필드 이름이 같을 때만 린트를 만들어요. 이름이 다르면 이 린트를 해결하기 위해 필드나 파라미터를 둘 중 하나는 바꿔야 하는데, 둘 다 잠재적으로 하위 호환성을 깨는 변경일 수 있거든요. 예를 들어 다음 코드는 린트를 만들지 않아요.

class Point {
  bool? isEnabled;
  Point({bool? enabled}) {
    this.isEnabled = enabled; // OK
  }
}

더 엄격한 타입을 강제할 수도 있어요

초기화 형식 인자로 초기화되는 필드보다 더 엄격한 타입을 강제하는 것도 가능해요. 아래 예시에서 이름 없는 Bid 생성자는 amount가 nullable(int?)로 선언되어 있는데도, non-null int를 요구해요.

class Bid {
  final int? amount;
  Bid(int this.amount);
  Bid.pass() : amount = null;
}

이 규칙 켜는 법

prefer_initializing_formals 규칙을 켜려면 analysis_options.yaml 파일의 linter > rules 아래에 규칙 이름을 추가하면 돼요.

linter:
  rules:
    - prefer_initializing_formals

혹시 YAML 맵 문법으로 린트 규칙을 설정하고 있다면, linter > rules 아래에 이렇게 적어주면 돼요.

linter:
  rules:
    prefer_initializing_formals: true

더 알아보기