💡 Инструкция: Выберите один ответ из пяти. На работу отведено 70 минут. В заданиях с кодом опирайтесь на показанный фрагмент и наблюдаемое поведение; в ситуационных — на публичный договор и последствия решения.
Вопрос 2 из 25
Команда хочет сократить набор проверок для «Ручное преобразование» до одного сценария. Какой вариант сохраняет важные различия?
Dart Dart · Ручное преобразование · границы Копировать
final class Profile {
const Profile({required this.id, required this.name, this.age});
final String id;
final String name;
final int? age;
factory Profile.fromJson(Map<String, Object?> json) {
final id = json['id'];
final name = json['name'];
if (id is! String || name is! String) {
throw const FormatException('invalid profile');
}
return Profile(id: id, name: name, age: json['age'] as int?);
}
}
// Контекст задания: анализ граничных входов.
Во всех спорных входах «Ручное преобразование» проверять только отсутствие необработанного исключения, не сравнивая состояние.
Для «Ручное преобразование» ограничиться случаем «отсутствующее обязательное поле», а остальные входы считать тем же классом отказа.
Автоматизировать обычный путь «Ручное преобразование», а случай «корневое значение не-объект» оставить в ручном чек-листе выпуска.
Не объединять в один исход следующие случаи: отсутствующее обязательное поле, неверный тип, лишнее поле и корневое значение не-объект.
Проверить для «Ручное преобразование» только самый сложный случай «корневое значение не-объект», считая остальные границы косвенно покрытыми.
Вопрос 3 из 25
Какое утверждение о показанном фрагменте и теме «Ручное преобразование» опирается на реальную гарантию Dart или используемого интерфейса?
Dart Dart · Ручное преобразование · семантика Копировать
final class Profile {
const Profile({required this.id, required this.name, this.age});
final String id;
final String name;
final int? age;
factory Profile.fromJson(Map<String, Object?> json) {
final id = json['id'];
final name = json['name'];
if (id is! String || name is! String) {
throw const FormatException('invalid profile');
}
return Profile(id: id, name: name, age: json['age'] as int?);
}
}
// Контекст задания: проверка семантики фрагмента.
Ручной `fromJson` обязан проверить ожидаемые типы и отсутствие обязательных полей; приведение `as` без проверки превращает ошибку схемы в позднее исключение.
Для «Ручное преобразование» считать случаи «отсутствующее обязательное поле, неверный тип, лишнее поле и корневое значение не-объект» эквивалентными, если программа не завершается аварийно.
Порядок внутренних вызовов «Ручное преобразование» считать публичной гарантией, которую нельзя менять при рефакторинге.
Спорный результат «Ручное преобразование» должен разбирать вызывающий код, поскольку компонент отвечает лишь за обычный путь.
Случай «корневое значение не-объект» объявить внутренней деталью «Ручное преобразование», даже если клиент видит иной результат.
Вопрос 11 из 25
Обычный путь в коде зелёный. Как построить проверку «Nullable-поля», чтобы не пропустить различия между отказами?
Dart Dart · Nullable-поля · границы Копировать
final class UserDto {
const UserDto({required this.id, this.nickname});
final String id;
final String? nickname;
factory UserDto.fromJson(Map<String, Object?> json) {
if (!json.containsKey('id')) throw const FormatException('id missing');
return UserDto(id: json['id'] as String, nickname: json['nickname'] as String?);
}
}
// Контекст задания: анализ граничных входов.
Проверить для «Nullable-поля» только самый сложный случай «значение по умолчанию», считая остальные границы косвенно покрытыми.
Во всех спорных входах «Nullable-поля» проверять только отсутствие необработанного исключения, не сравнивая состояние.
Для «Nullable-поля» ограничиться случаем «отсутствующее поле», а остальные входы считать тем же классом отказа.
Составить отдельные сценарии для границ: отсутствующее поле, явный `null`, неверный ненулевой тип и значение по умолчанию.
Автоматизировать обычный путь «Nullable-поля», а случай «значение по умолчанию» оставить в ручном чек-листе выпуска.
Вопрос 13 из 25
Какой тезис о коде «Nullable-поля» можно защитить без ссылки на удачный тестовый запуск?
Dart Dart · Nullable-поля · семантика Копировать
final class UserDto {
const UserDto({required this.id, this.nickname});
final String id;
final String? nickname;
factory UserDto.fromJson(Map<String, Object?> json) {
if (!json.containsKey('id')) throw const FormatException('id missing');
return UserDto(id: json['id'] as String, nickname: json['nickname'] as String?);
}
}
// Контекст задания: проверка семантики фрагмента.
Случай «значение по умолчанию» объявить внутренней деталью «Nullable-поля», даже если клиент видит иной результат.
Порядок внутренних вызовов «Nullable-поля» считать публичной гарантией, которую нельзя менять при рефакторинге.
Спорный результат «Nullable-поля» должен разбирать вызывающий код, поскольку компонент отвечает лишь за обычный путь.
Для «Nullable-поля» считать случаи «отсутствующее поле, явный `null`, неверный ненулевой тип и значение по умолчанию» эквивалентными, если программа не завершается аварийно.
Nullable-поле означает допустимое отсутствие значения, тогда как обязательное поле с неверным типом — ошибка данных; эти случаи нельзя бесшумно смешивать.
Вопрос 16 из 25
Фрагмент выглядит убедительно на типичных данных. Какие входы по теме «Совместимость схем» нельзя проверять одним общим ожиданием?
Dart Dart · Совместимость схем · границы Копировать
Map<String, Object?> migratePayload(Map<String, Object?> source) {
final version = source['schemaVersion'] as int? ?? 1;
return switch (version) {
1 => {...source, 'displayName': source['name'], 'schemaVersion': 2},
2 => source,
_ => throw FormatException('unsupported schema $version'),
};
}
// Контекст задания: анализ граничных входов.
Автоматизировать обычный путь «Совместимость схем», а случай «неизвестную будущую версию» оставить в ручном чек-листе выпуска.
Во всех спорных входах «Совместимость схем» проверять только отсутствие необработанного исключения, не сравнивая состояние.
Различать в тестах каждый из случаев: старую версию документа, переименованное поле, новое обязательное поле и неизвестную будущую версию.
Проверить для «Совместимость схем» только самый сложный случай «неизвестную будущую версию», считая остальные границы косвенно покрытыми.
Объединить «старую версию документа» и «переименованное поле» в один тест «Совместимость схем» с общим ожидаемым исходом.
Вопрос 17 из 25
Какое описание семантики показанного решения по теме «Совместимость схем» является точным?
Dart Dart · Совместимость схем · семантика Копировать
Map<String, Object?> migratePayload(Map<String, Object?> source) {
final version = source['schemaVersion'] as int? ?? 1;
return switch (version) {
1 => {...source, 'displayName': source['name'], 'schemaVersion': 2},
2 => source,
_ => throw FormatException('unsupported schema $version'),
};
}
// Контекст задания: проверка семантики фрагмента.
Спорный результат «Совместимость схем» должен разбирать вызывающий код, поскольку компонент отвечает лишь за обычный путь.
Эволюция схемы требует сохранять чтение старых данных или явно мигрировать их; переименование ключа без переходного периода ломает уже сохранённые объекты.
Порядок внутренних вызовов «Совместимость схем» считать публичной гарантией, которую нельзя менять при рефакторинге.
Случай «неизвестную будущую версию» объявить внутренней деталью «Совместимость схем», даже если клиент видит иной результат.
Для «Совместимость схем» всегда заменять явную ошибку нейтральным значением: `null`, пустой коллекцией или нулём.
Вопрос 18 из 25
Несколько мест использования повторяют одну и ту же защиту. Какая правка должна стать единой для темы «Совместимость схем»?
Dart Dart · Совместимость схем · исправление Копировать
Map<String, Object?> migratePayload(Map<String, Object?> source) {
final version = source['schemaVersion'] as int? ?? 1;
return switch (version) {
1 => {...source, 'displayName': source['name'], 'schemaVersion': 2},
2 => source,
_ => throw FormatException('unsupported schema $version'),
};
}
// Контекст задания: выбор места исправления.
Скопировать защиту «Совместимость схем» во все найденные места вызова и считать повторение единым исправлением.
Добавить обработку «старую версию документа» в ближайший вызывающий метод, не меняя общий компонент «Совместимость схем».
Добавить в «Совместимость схем» специальный флаг только для одного экрана или сервиса, сохранив общий контракт.
Версионировать схему и мигрировать старые данные последовательно, сохраняя явный отказ для неподдерживаемой версии.
В решении «Совместимость схем» перехватывать любое исключение и возвращать нейтральное значение без указания причины.
Вопрос 22 из 25
Фрагмент допускает частный обход спорного случая. Как перенести ответственность туда, где определяется правило «Диагностика результата»?
Dart Dart · Диагностика результата · исправление Копировать
Profile decodeProfile(String body, Uri source) {
try {
final value = jsonDecode(body);
if (value is! Map<String, Object?>) {
throw const FormatException('object expected');
}
return Profile.fromJson(value);
} on FormatException catch (error, stack) {
Error.throwWithStackTrace(ProfileDecodeException(source, error), stack);
}
}
// Контекст задания: выбор места исправления.
Перенести проверку «Диагностика результата» в тестовый код, не меняя производственную реализацию.
Добавить в «Диагностика результата» специальный флаг только для одного экрана или сервиса, сохранив общий контракт.
Скрыть сбой «Диагностика результата» автоматической повторной попыткой без ограничения числа запусков.
Добавить к ошибке путь к полю и безопасный контекст источника, не выводя весь документ.
Оставить поведение «Диагностика результата» прежним, но заменить сообщение об ошибке на более подробное.
Вопрос 23 из 25
Обычный путь в коде зелёный. Как построить проверку «Диагностика результата», чтобы не пропустить различия между отказами?
Dart Dart · Диагностика результата · границы Копировать
Profile decodeProfile(String body, Uri source) {
try {
final value = jsonDecode(body);
if (value is! Map<String, Object?>) {
throw const FormatException('object expected');
}
return Profile.fromJson(value);
} on FormatException catch (error, stack) {
Error.throwWithStackTrace(ProfileDecodeException(source, error), stack);
}
}
// Контекст задания: анализ граничных входов.
Для «Диагностика результата» ограничиться случаем «ошибка во вложенном поле», а остальные входы считать тем же классом отказа.
Автоматизировать обычный путь «Диагностика результата», а случай «попадание секретов в сообщение или журнал» оставить в ручном чек-листе выпуска.
Объединить «ошибка во вложенном поле» и «большой пользовательский документ» в один тест «Диагностика результата» с общим ожидаемым исходом.
Проверить независимо друг от друга: ошибка во вложенном поле, большой пользовательский документ и попадание секретов в сообщение или журнал.
Во всех спорных входах «Диагностика результата» проверять только отсутствие необработанного исключения, не сравнивая состояние.