Menu
Coddy logo textTech

Итоги — Data Fetcher

Часть раздела Объектно-ориентированное программирование путешествия по Dart на Coddy — урок 81 из 110.

challenge icon

Задание

Легко

Давайте создадим класс DataFetcher, который объединит все концепции асинхронного ООП из этой главы! Вы создадите сервис данных, использующий асинхронную инициализацию, асинхронные методы для получения отдельных элементов и поток для доставки нескольких результатов с течением времени.

Вы организуете свой код в двух файлах:

  • data_fetcher.dart: Создайте класс DataFetcher, который имитирует получение данных из удаленного источника. Ваш класс должен иметь:
    • Финализированное поле String с именем source, в котором хранится информация о том, откуда поступают данные
    • Приватный конструктор, который инициализирует источник
    • Статический асинхронный фабричный метод connect(String sourceName), который возвращает Future<DataFetcher>. Имитируйте задержку соединения в 100 миллисекунд, затем верните новый экземпляр с источником, установленным в предоставленное имя
    • Асинхронный метод fetchItem(int id), который возвращает Future<String>. Имитируйте задержку в 50 миллисекунд, затем верните строку в формате: [source]-Item-[id]
    • Метод-генератор потока fetchMultiple(int count), который возвращает Stream<String>. Он должен выдавать элементы для ID от 1 до count включительно, используя ваш метод fetchItem для каждого из них (ожидайте (await) каждое получение перед выдачей (yield))
  • main.dart: Импортируйте ваш загрузчик данных и продемонстрируйте совместную работу всех трех асинхронных паттернов:
    • Выведите Connecting to data source...
    • Используйте асинхронную фабрику для подключения к источнику с именем CloudDB
    • Выведите Connected to [source], используя поле source загрузчика
    • Выведите пустую строку
    • Выведите Fetching single item:
    • Получите и выведите элемент с ID 42
    • Выведите пустую строку
    • Выведите Fetching multiple items:
    • Используйте await for для итерации по fetchMultiple(3) и вывода каждого элемента
    • Выведите пустую строку
    • Выведите All operations complete!

Этот челлендж сочетает в себе паттерн статической асинхронной фабрики для инициализации, обычные асинхронные методы для одиночных операций и async* с yield для потоковой передачи нескольких результатов. Обратите внимание, как метод потока может вызывать другие асинхронные методы внутри себя!

Ожидаемый вывод:

Connecting to data source...
Connected to CloudDB

Fetching single item:
CloudDB-Item-42

Fetching multiple items:
CloudDB-Item-1
CloudDB-Item-2
CloudDB-Item-3

All operations complete!

Попробуйте сами

import 'data_fetcher.dart';

void main() async {
  // TODO: Вывести 'Connecting to data source...'
  
  // TODO: Используйте асинхронную фабрику для подключения к источнику с именем 'CloudDB'
  
  // TODO: Вывести 'Connected to [source]', используя поле source объекта fetcher
  
  // TODO: Вывести пустую строку
  
  // TODO: Вывести 'Fetching single item:'
  
  // TODO: Получить и вывести элемент с ID 42
  
  // TODO: Вывести пустую строку
  
  // TODO: Вывести 'Fetching multiple items:'
  
  // TODO: Используйте 'await for' для итерации по fetchMultiple(3) и вывода каждого элемента
  
  // TODO: Вывести пустую строку
  
  // TODO: Вывести 'All operations complete!'
}

Все уроки раздела Объектно-ориентированное программирование