💡 Инструкция: Выберите один ответ из пяти. На 20 вопросов отведено 55 минут. В каждом задании верен только один вариант. После завершения будут показаны общий результат и 4 тематических шкал.
Вопрос 1 из 20
Какой риск не исчезает после правки «Убывающая прогрессия»: Выбирать форму диапазона по контракту границ и закреплять тестом пустой диапазон, одну точку и последний допустимый индекс?
Диапазоны выразительны для дискретных границ, но ручное условие цикла яснее при сложном или меняющемся шаге.
Практическое ограничение подхода: Будет напечатан `[10, 6, 4]`, потому что шаг пересчитывается для попадания в конечную точку.
После внедрения придётся исходить из того, что будет напечатан `[4, 7, 10]`, поскольку `toList()` сортирует диапазон.
Граница полезности решения описывается условием: Будет напечатан `[10, 7]`, потому что правая граница диапазона исключается.
Цена упрощения проявится, если код не компилируется: `step` нельзя применять после `downTo`.
Вопрос 6 из 20
Какой дополнительный сценарий нужен для «if как выражение»?
Зафиксировать сценарий, где ожидается: Будет выведено `80`, поскольку первая ветвь сравнения проверяется повторно.
Считать опасной границей ситуацию, где будет выведено `100`, потому что `if` нельзя присваивать переменной.
Добавить граничный тест на утверждение: Будет выведено `30`, потому что функция возвращает выбранную ветвь, игнорируя последнюю строку.
Проверить, сохраняется ли контракт, когда код не компилируется без явного типа у `discount`.
Если ветви возвращают разные типы, общий выведенный тип может стать слишком широким, например `Any`, и скрыть ошибку модели.
Вопрос 8 из 20
Какой список будет напечатан?
Kotlin Диапазоны · Убывающая прогрессия Копировать
// Проследите фактическое выполнение без изменения кода.
fun main() {
val values = (10 downTo 4 step 3).toList()
println(values)
}
Будет напечатан `[4, 7, 10]`, поскольку `toList()` сортирует диапазон.
Будет напечатан `[10, 7]`, потому что правая граница диапазона исключается.
Будет напечатан `[10, 7, 4]`: `downTo` включает обе границы, а шаг равен трём.
Код не компилируется: `step` нельзя применять после `downTo`.
Будет напечатан `[10, 6, 4]`, потому что шаг пересчитывается для попадания в конечную точку.
Вопрос 9 из 20
Предложенная правка для «if как выражение» звучит так: Для нескольких диапазонов вынести правила цены в ясно упорядоченные условия и покрыть тестами значения на границах 17/18 и 64/65. Какой недостаток важнее обсудить?
После правки останется ограничение: Код не компилируется без явного типа у `discount`.
Главная цена решения — необходимость учитывать, что будет выведено `30`, потому что функция возвращает выбранную ветвь, игнорируя последнюю строку.
Обратная сторона изменения состоит в том, что будет выведено `100`, потому что `if` нельзя присваивать переменной.
Выражение `if` убирает временное присваивание, но длинная цепочка условий хуже читается, чем таблица правил или `when`.
Сопровождение усложнится, если окажется, что будет выведено `80`, поскольку первая ветвь сравнения проверяется повторно.
Вопрос 11 из 20
Почему пример «Убывающая прогрессия» даёт именно такой результат?
Kotlin Диапазоны · Убывающая прогрессия Копировать
// На ревью требуется объяснить причину поведения.
fun main() {
val values = (10 downTo 4 step 3).toList()
println(values)
}
Причину поведения формулируют так: Код не компилируется: `step` нельзя применять после `downTo`.
Объяснение опирается на утверждение: Будет напечатан `[10, 6, 4]`, потому что шаг пересчитывается для попадания в конечную точку.
Контракт здесь понимают так: Будет напечатан `[4, 7, 10]`, поскольку `toList()` сортирует диапазон.
Семантика фрагмента приводит к тому, что будет напечатан `[10, 7]`, потому что правая граница диапазона исключается.
`..` и `downTo` задают включённые прогрессии, `until` исключает верхнюю границу, а `step` должен быть положительным.
Вопрос 14 из 20
Какую точечную правку стоит принять на ревью фрагмента «Убывающая прогрессия»?
Kotlin Диапазоны · Убывающая прогрессия Копировать
// Сохраните назначение фрагмента, но укрепите его контракт.
fun main() {
val values = (10 downTo 4 step 3).toList()
println(values)
}
Выбирать форму диапазона по контракту границ и закреплять тестом пустой диапазон, одну точку и последний допустимый индекс.
Обернуть операцию проверкой и не менять основной контракт: Будет напечатан `[10, 6, 4]`, потому что шаг пересчитывается для попадания в конечную точку.
Вынести участок в отдельный метод, считая верным следующее: Будет напечатан `[4, 7, 10]`, поскольку `toList()` сортирует диапазон.
Оставить структуру прежней, документировав утверждение: Код не компилируется: `step` нельзя применять после `downTo`.
Оставить реализацию без изменений и закрепить тестом предположение: Будет напечатан `[10, 7]`, потому что правая граница диапазона исключается.
Вопрос 17 из 20
Где поведение «Убывающая прогрессия» требует отдельной проверки?
Добавить регрессию на гипотезу: Будет напечатан `[10, 6, 4]`, потому что шаг пересчитывается для попадания в конечную точку.
Большой шаг не гарантирует попадание в правую границу; последовательность заканчивается последним значением, не выходящим за неё.
Проверить границу полезности утверждения: Будет напечатан `[10, 7]`, потому что правая граница диапазона исключается.
Добавить тест на состояние, при котором будет напечатан `[4, 7, 10]`, поскольку `toList()` сортирует диапазон.
Отдельно проверить предположение, что код не компилируется: `step` нельзя применять после `downTo`.
Вопрос 20 из 20
Какая правка устраняет причину риска в «Исчерпывающий when», а не только его проявление?
Kotlin Ветвление when · Исчерпывающий when Копировать
// Сохраните назначение фрагмента, но укрепите его контракт.
sealed interface Reply {
data class Ok(val body: String) : Reply
data object Retry : Reply
data class Failed(val code: Int) : Reply
}
fun text(r: Reply) = when (r) {
is Reply.Ok -> r.body
Reply.Retry -> "повтор"
is Reply.Failed -> "ошибка ${r.code}"
}
Вынести участок в отдельный метод, считая верным следующее: `else` нужен только в `when`, который используется как инструкция, а не как выражение.
Добавить защитную проверку перед фрагментом, поскольку компилятор не требует `else`, когда `when` возвращает `String`.
Оставить реализацию без изменений и закрепить тестом предположение: `data object` автоматически становится ветвью по умолчанию.
Сохранять `when` исчерпывающим без общего `else`, если добавление нового состояния должно приводить к заметной ошибке компиляции.
Перенести проверку в вызывающий код, исходя из того, что ветка `is Reply.Ok` неявно покрывает все реализации интерфейса.