Код-ревью 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 всегда вместе.
Что должен найти ревьюер
- Стильстрока 2Поля изменяемые: модель можно случайно поменять из UI, а состояние в BLoC/Riverpod перестанет корректно сравниваться. Сделать поля
finalи конструкторconst. - Ошибкастрока 4
doubleдля цены: ошибки округления. Хранить сумму в минимальных единицах (int) или десятичным типом. - Ошибкастрока 10Нет проверки типов:
json['price']может прийти какint, и присваивание вdoubleупадёт;tagsпридёт какList<dynamic>и тоже упадёт. Нужно(json['price'] as num).toDouble()иList<String>.from(...). - Ошибкастрока 14Переопределён
==, но неhashCode: вSetиMapодинаковые товары будут разными ключами. - Стильстрока 5Список
tagsизменяемый и отдаётся наружу как есть. ЛучшеList.unmodifiableили неизменяемые коллекции.
Разбор
Модели делают неизменяемыми: final-поля, const-конструктор, copyWith для изменений. fromJson с явным приведением типов (или генерация через json_serializable/freezed). Пара == и hashCode всегда вместе. Деньги в целых минимальных единицах.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.