← Назад к вопросам

Что такое dto?

2.0 Middle🔥 202 комментариев
#Архитектура Flutter#ООП и паттерны

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое 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

  • Получение данных с сервера
  • Отправка данных на сервер
  • Передача между слоями
  • Кеширование
  • Логирование

Лучшие практики

  1. Используйте final поля
  2. Сделайте неизменяемым
  3. Реализуйте fromJson и toJson
  4. Используйте копирование для изменений
  5. Не добавляйте бизнес-логику

DTO - это важный паттерн для чистого разделения между передачей данных и бизнес-логикой.

Что такое dto? | PrepBro