💡 Инструкция: Выберите один ответ из пяти. На 20 вопросов отведено 55 минут. В каждом задании верен только один вариант. После завершения будут показаны общий результат и 4 тематических шкал.
Вопрос 3 из 20
Что может усложниться в сопровождении после изменения «Пропущенный первый параметр»: Давать по умолчанию только безопасные и ожидаемые значения, а обязательные ограничения проверять через `require` внутри функции?
Решение оправдано лишь при условии: Код не компилируется без явного `limit` перед `offset`.
Компромисс состоит в утверждении: Будет выведено `(40, 60)`, потому что верхняя граница `until` включается.
Параметры по умолчанию уменьшают число перегрузок, но большое их количество превращает функцию в неявный объект конфигурации.
Новый риск связан с тем, что будет выведено `(0, 19)`, поскольку нельзя пропустить первый параметр.
Обратная сторона изменения состоит в том, что будет выведено `(20, 39)`, потому что `offset` складывается со значением по умолчанию до вызова.
Вопрос 8 из 20
Как сделать ответственность во фрагменте «Общий тип ветвей» понятной следующему разработчику?
Kotlin Возвращаемый тип · Общий тип ветвей Копировать
// Сохраните назначение фрагмента, но укрепите его контракт.
fun parse(flag: Boolean) = if (flag) 1 else "1"
fun main() {
val value = parse(true)
println(value::class.simpleName)
}
Спрятать участок за вспомогательной функцией, сохранив предположение: Код не компилируется: ветви `if` обязаны иметь один и тот же точный тип.
Перенести проверку в вызывающий код, исходя из того, что тип функции выводится как `Comparable<*>`, и обращение к `::class` запрещено.
Ограничиться поясняющим комментарием о том, что будет показан `Any`, потому что объект меняет свой класс на общий тип функции.
Уточнить предметную модель: вернуть единый тип, sealed-результат или явное преобразование, а не позволять выводу скрыть неоднородность.
Добавить защитную проверку перед фрагментом, поскольку будет показан `String`, поскольку строковая ветвь расширяет числовую.
Вопрос 15 из 20
Какое объяснение результата «Порядок именованных аргументов» выдерживает проверку соседними случаями?
Kotlin Именованные аргументы · Порядок именованных аргументов Копировать
// На ревью требуется объяснить причину поведения.
fun connect(host: String, port: Int = 443, secure: Boolean = true) =
"$host:$port/$secure"
fun main() = println(connect("api.test", secure = false, port = 8080))
Семантика фрагмента приводит к тому, что возникнет ошибка времени выполнения из-за смешивания позиционного и именованных аргументов.
После позиционных аргументов именованные можно располагать в любом порядке, но имена параметров становятся частью удобства исходного API.
Такой результат объясняют тем, что код не компилируется, потому что `port` указан после `secure`.
Механика примера описывается утверждением: Она напечатает `api.test:443/false`, поскольку именованный `port` игнорируется после аргумента по умолчанию.
Причина результата в том, что она напечатает `api.test:8080/true`, потому что Boolean-параметр нельзя задавать по имени.
Вопрос 16 из 20
Как превратить неявное предположение в проверяемый контракт «Пропущенный первый параметр»?
Kotlin Значения по умолчанию · Пропущенный первый параметр Копировать
// Сохраните назначение фрагмента, но укрепите его контракт.
fun page(limit: Int = 20, offset: Int = 0): IntRange =
offset until (offset + limit)
fun main() = println(page(offset = 40).first to page(offset = 40).last)
Давать по умолчанию только безопасные и ожидаемые значения, а обязательные ограничения проверять через `require` внутри функции.
Спрятать участок за вспомогательной функцией, сохранив предположение: Будет выведено `(20, 39)`, потому что `offset` складывается со значением по умолчанию до вызова.
Добавить локальную обработку результата, потому что будет выведено `(0, 19)`, поскольку нельзя пропустить первый параметр.
Ограничиться поясняющим комментарием о том, что код не компилируется без явного `limit` перед `offset`.
Зафиксировать текущее поведение регрессионным тестом: Будет выведено `(40, 60)`, потому что верхняя граница `until` включается.
Вопрос 18 из 20
Как сделать ответственность во фрагменте «Порядок именованных аргументов» понятной следующему разработчику?
Kotlin Именованные аргументы · Порядок именованных аргументов Копировать
// Сохраните назначение фрагмента, но укрепите его контракт.
fun connect(host: String, port: Int = 443, secure: Boolean = true) =
"$host:$port/$secure"
fun main() = println(connect("api.test", secure = false, port = 8080))
Ограничиться поясняющим комментарием о том, что код не компилируется, потому что `port` указан после `secure`.
Для нескольких однотипных параметров использовать имена или объект конфигурации, чтобы вызов не зависел от запоминания позиции.
Добавить защитную проверку перед фрагментом, поскольку она напечатает `api.test:8080/true`, потому что Boolean-параметр нельзя задавать по имени.
Перенести проверку в вызывающий код, исходя из того, что возникнет ошибка времени выполнения из-за смешивания позиционного и именованных аргументов.
Спрятать участок за вспомогательной функцией, сохранив предположение: Она напечатает `api.test:443/false`, поскольку именованный `port` игнорируется после аргумента по умолчанию.
Вопрос 19 из 20
Какой дополнительный сценарий нужен для «Пропущенный первый параметр»?
Проверить, сохраняется ли контракт, когда код не компилируется без явного `limit` перед `offset`.
Изменение значения по умолчанию в библиотеке может по-разному проявляться у уже скомпилированных и заново скомпилированных клиентов.
Зафиксировать сценарий, где ожидается: Будет выведено `(0, 19)`, поскольку нельзя пропустить первый параметр.
Проверить крайний ввод, при котором будет выведено `(40, 60)`, потому что верхняя граница `until` включается.
Добавить граничный тест на утверждение: Будет выведено `(20, 39)`, потому что `offset` складывается со значением по умолчанию до вызова.