Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое DTO?
DTO (Data Transfer Object) - это объект, используемый для передачи данных между слоями приложения или между клиентом и сервером. DTO содержит только данные без бизнес-логики.
Основные характеристики DTO
- Содержит только данные (поля)
- Нет методов с логикой (только getters/setters)
- Сериализуемый (JSON, XML)
- Простая структура данных
- Используется для передачи
Пример простого DTO
class UserDTO {
final String id; final String name; final String email; final String? phone;
UserDTO({
required this.id,
required this.name,
required this.email,
this.phone,
});
factory UserDTO.fromJson(Map jsonData) {
return UserDTO(
id: jsonData[id],
name: jsonData[name],
email: jsonData[email],
phone: jsonData[phone],
);
}
Map toJson() {
return {
id: id,
name: name,
email: email,
phone: phone,
};
}
}
DTO для API ответов
class PostDTO {
final int id; final String title; final String content; final int userId; final DateTime createdAt;
PostDTO({
required this.id,
required this.title,
required this.content,
required this.userId,
required this.createdAt,
});
factory PostDTO.fromJson(Map json) {
return PostDTO(
id: json[id],
title: json[title],
content: json[content],
userId: json[userId],
createdAt: DateTime.parse(json[createdAt]),
);
}
Map toJson() {
return {
id: id,
title: title,
content: content,
userId: userId,
createdAt: createdAt.toIso8601String(),
};
}
}
DTO для запросов к серверу
class CreateUserRequestDTO {
final String name; final String email; final String password;
CreateUserRequestDTO({
required this.name,
required this.email,
required this.password,
});
Map toJson() {
return {
name: name,
email: email,
password: password,
};
}
}
Использование DTO
class UserRepository {
final HttpClient httpClient;
Future getUser(String userId) async {
final response = await httpClient.get(
uri: Uri.parse(api.example.com/users/$userId),
);
final json = jsonDecode(response.body);
return UserDTO.fromJson(json);
}
Future createUser(CreateUserRequestDTO dto) async {
final response = await httpClient.post(
uri: Uri.parse(api.example.com/users),
body: jsonEncode(dto.toJson()),
);
final json = jsonDecode(response.body);
return UserDTO.fromJson(json);
}
}
Разница между моделью и DTO
Модель:
- Бизнес-логика
- Методы
- Валидация
- Используется в коде
DTO:
- Только данные
- Никакой логики
- Передача данных
- Сериализация
Конвертация между DTO и Model
class User {
final String id; final String name; final String email;
User({
required this.id,
required this.name,
required this.email,
});
factory User.fromDTO(UserDTO dto) {
return User(
id: dto.id,
name: dto.name,
email: dto.email,
);
}
UserDTO toDTO() {
return UserDTO(
id: id,
name: name,
email: email,
);
}
}
Когда использовать DTO
- Получение данных с сервера
- Отправка данных на сервер
- Передача между слоями
- Кеширование
- Логирование
Лучшие практики
- Используйте final поля
- Сделайте неизменяемым
- Реализуйте fromJson и toJson
- Используйте копирование для изменений
- Не добавляйте бизнес-логику
DTO - это важный паттерн для чистого разделения между передачей данных и бизнес-логикой.