Обеспечение присутствия всех полей в списке параметров конструктора

#flutter #dart #intellij-idea #dart-analyzer

#flutter #dart #intellij-idea #dart-анализатор

Вопрос:

Существует ли стандартный Dart-способ убедиться, что все поля класса присутствуют в списке параметров конструктора?

Очень упрощенный пример:

 class Message{
  String header;
  String body;
  DateTime sentAt;

  Message(this.header, this.body, this.sentAt);

  Message makeCopy(){
    return Message(header, body, sentAt);
  }
}
  

Теперь приходит коллега и добавляет поле String category , но забывает добавить его в конструктор — и, что еще хуже, в конструктор копирования. Есть ли способ заставить IDE (IntelliJ) выдавать предупреждение или ошибку об этом отсутствующем новом поле?

Я думаю о чем-то похожем на предупреждение, выдаваемое при пропуске значения enum из switch -инструкции.

Или есть хотя бы какой-то способ заставить IntelliJ выдавать такое предупреждение?

Комментарии:

1. Вероятно, возможно с помощью pub.dev/packages/pedantic

Ответ №1:

Вы получите предупреждения или ошибки, если вы создадите свои поля final , из вашего класса кажется, что это было бы хорошей идеей в любом случае.

Теперь … конечно, это только переводит эту проблему в «как мне убедиться, что мой коллега также делает все новые поля окончательными».

Для этого вы можете объявить свой класс @immutable , и тогда анализаторы смогут предупредить вас.

Анализаторы:

  • pub.dev/пакеты/педантичный
  • pub.dev/пакеты/effective_dart

Возможное объявление класса:

 import 'package:meta/meta.dart';

@immutable
class Message {
  final String header;
  final String body;
  final DateTime sentAt;

  const Message(this.header, this.body, this.sentAt);

  Message makeCopy() {
    return Message(header, body, sentAt);
  }
}
  

Попробуйте добавить новое поле или удалить одно из конструктора, вы получите ошибки.

Ответ №2:

Есть только один способ, но в большинстве случаев это правильный путь.

Вы создаете все поля final и применяете неизменяемость, что приведет к ошибке компилятора, если поле не инициализировано в конструкторе.

Вы можете использовать dartanalyzer для обеспечения соблюдения следующих правил или, по крайней мере, генерирования предупреждений. https://dart-lang.github.io/linter/lints/prefer_final_fields.html
https://dart-lang.github.io/linter/lints/prefer_const_declarations.html

Чтобы упростить работу с dartanalyzer, вы можете взглянуть на пакет pedantic или на мой предпочтительный lint.