💡 Инструкция: Выберите один ответ из пяти. На работу отведено 70 минут. В заданиях с кодом опирайтесь на показанный фрагмент и наблюдаемое поведение; в ситуационных — на публичный договор и последствия решения.
Вопрос 2 из 25
Какой тезис о коде «Локальное состояние» можно защитить без ссылки на удачный тестовый запуск?
Dart Dart · Локальное состояние · семантика Копировать
class _CounterState extends State<Counter> {
int value = 0;
void increment() => setState(() => value++);
@override
Widget build(BuildContext context) => TextButton(
onPressed: increment,
child: Text('$value'),
);
}
// Контекст задания: проверка семантики фрагмента.
Для «Локальное состояние» считать случаи «состояние, нужное одному виджету, поздний результат старого запроса и обновление после `dispose`» эквивалентными, если программа не завершается аварийно.
Локальное состояние подходит для краткоживущей детали одного виджета — раскрытия, выбранной вкладки, текста до отправки; выносить его глобально без нужды усложняет поток данных.
Случай «обновление после `dispose`» объявить внутренней деталью «Локальное состояние», даже если клиент видит иной результат. Дополнительные границы «Локальное состояние» при таком рассуждении считают избыточными.
Порядок внутренних вызовов «Локальное состояние» считать публичной гарантией, которую нельзя менять при рефакторинге. Клиенту «Локальное состояние» предлагают самостоятельно уточнять смысл спорного результата.
Спорный результат «Локальное состояние» должен разбирать вызывающий код, поскольку компонент отвечает лишь за обычный путь. Предполагается, что компиляция уже подтверждает весь договор «Локальное состояние».
Вопрос 11 из 25
Фрагмент выглядит убедительно на типичных данных. Какие входы по теме «Потоки состояния» нельзя проверять одним общим ожиданием?
Dart Dart · Потоки состояния · границы Копировать
Widget build(BuildContext context) {
return StreamBuilder<SessionState>(
stream: sessions.states,
initialData: const SessionState.loading(),
builder: (_, snapshot) => SessionView(state: snapshot.requireData),
);
}
// Контекст задания: анализ граничных входов.
Автоматизировать обычный путь «Потоки состояния», а случай «закрытие источника состояния» оставить в ручном чек-листе выпуска.
Задать самостоятельные ожидания для случаев: первое значение, ошибка потока, поздний слушатель и закрытие источника состояния.
Проверить для «Потоки состояния» только самый сложный случай «закрытие источника состояния», считая остальные границы косвенно покрытыми.
Во всех спорных входах «Потоки состояния» проверять только отсутствие необработанного исключения, не сравнивая состояние.
Для «Потоки состояния» ограничиться случаем «первое значение», а остальные входы считать тем же классом отказа.
Вопрос 12 из 25
Какое описание семантики показанного решения по теме «Потоки состояния» является точным?
Dart Dart · Потоки состояния · семантика Копировать
Widget build(BuildContext context) {
return StreamBuilder<SessionState>(
stream: sessions.states,
initialData: const SessionState.loading(),
builder: (_, snapshot) => SessionView(state: snapshot.requireData),
);
}
// Контекст задания: проверка семантики фрагмента.
Порядок внутренних вызовов «Потоки состояния» считать публичной гарантией, которую нельзя менять при рефакторинге. Различия между версиями SDK для «Потоки состояния» в этом выводе не учитываются.
Поток состояния должен иметь определённое начальное значение, правила обработки ошибок и владельца подписки; два конкурирующих источника истины приводят к гонкам интерфейса.
Случай «закрытие источника состояния» объявить внутренней деталью «Потоки состояния», даже если клиент видит иной результат.
Спорный результат «Потоки состояния» должен разбирать вызывающий код, поскольку компонент отвечает лишь за обычный путь. Так внутренняя структура «Потоки состояния» фактически становится частью внешнего обещания.
Для «Потоки состояния» считать случаи «первое значение, ошибка потока, поздний слушатель и закрытие источника состояния» эквивалентными, если программа не завершается аварийно.