Код-ревью Middle Dart: классы и миксины обновлено

Код-ревью: модель данных

Вопрос

Модель товара для корзины. Найдите проблемы.

class Product {
  String id;
  String title;
  double price;
  List<String> tags;

  Product(this.id, this.title, this.price, this.tags);

  factory Product.fromJson(Map<String, dynamic> json) {
    return Product(json['id'], json['title'], json['price'], json['tags']);
  }

  @override
  bool operator ==(Object other) => other is Product && other.id == id;
}

Коротко

Модели делают неизменяемыми: final-поля, const-конструктор, copyWith для изменений. fromJson с явным приведением типов (или генерация через jsonserializable/freezed). Пара == и hashCode всегда вместе.

Что должен найти ревьюер

  1. Стильстрока 2
    Поля изменяемые: модель можно случайно поменять из UI, а состояние в BLoC/Riverpod перестанет корректно сравниваться. Сделать поля final и конструктор const.
  2. Ошибкастрока 4
    double для цены: ошибки округления. Хранить сумму в минимальных единицах (int) или десятичным типом.
  3. Ошибкастрока 10
    Нет проверки типов: json['price'] может прийти как int, и присваивание в double упадёт; tags придёт как List<dynamic> и тоже упадёт. Нужно (json['price'] as num).toDouble() и List<String>.from(...).
  4. Ошибкастрока 14
    Переопределён ==, но не hashCode: в Set и Map одинаковые товары будут разными ключами.
  5. Стильстрока 5
    Список tags изменяемый и отдаётся наружу как есть. Лучше List.unmodifiable или неизменяемые коллекции.

Разбор

Модели делают неизменяемыми: final-поля, const-конструктор, copyWith для изменений. fromJson с явным приведением типов (или генерация через json_serializable/freezed). Пара == и hashCode всегда вместе. Деньги в целых минимальных единицах.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме