💡 Инструкция: Выберите один ответ из пяти. На 20 вопросов отведено 55 минут. В каждом задании верен только один вариант. После завершения будут показаны общий результат и 4 тематических шкал.
Вопрос 4 из 20
Что изменить в «Границы internal и private», чтобы скрытое допущение стало явным контрактом?
Kotlin Видимость · Границы internal и private Копировать
// Сохраните назначение фрагмента, но укрепите его контракт.
internal class Parser {
private fun clean(s: String) = s.trim()
fun parse(s: String): Int = clean(s).toInt()
}
fun main() = println(Parser().parse(" 42 "))
Обернуть операцию проверкой и не менять основной контракт: Возникнет `IllegalAccessError`, когда JVM увидит internal-класс.
Вынести участок в отдельный метод, считая верным следующее: Код не компилируется: публичный метод не может вызывать private-метод.
Перенести проверку в вызывающий код, исходя из того, что код не компилируется, потому что `internal` доступен только внутри файла.
Оставить структуру прежней, документировав утверждение: Будет выведено `0`, поскольку `clean` недоступен точке входа.
Публиковать минимальный API модуля, а детали разбора оставлять `internal` или `private`, не полагаясь только на соглашение имён.
Вопрос 12 из 20
Как превратить неявное предположение в проверяемый контракт «Инвариант в init»?
Kotlin Блоки инициализации init · Инвариант в init Копировать
// Сохраните назначение фрагмента, но укрепите его контракт.
class Range(val start: Int, val end: Int) {
init { require(start <= end) { "перевёрнутый диапазон" } }
val size = end - start + 1
}
fun main() = println(Range(3, 5).size)
Зафиксировать текущее поведение регрессионным тестом: Будет выведено `2`, потому что правый конец не включается.
Проверять инварианты до публикации объекта и давать сообщению об ошибке конкретное значение, нарушившее контракт.
Ограничиться поясняющим комментарием о том, что возникнет `IllegalStateException`, поскольку `require` проверяет только локальные переменные.
Добавить локальную обработку результата, потому что код не компилируется: `require` нельзя использовать в `init`.
Сохранить API и считать достаточным условие: Сначала вычисляется `size`, затем запускается `init`, поэтому результат не определён.
Вопрос 14 из 20
Что изменить в «Параметр primary constructor», чтобы скрытое допущение стало явным контрактом?
Kotlin Основной конструктор · Параметр primary constructor Копировать
// Сохраните назначение фрагмента, но укрепите его контракт.
class Token(raw: String) {
val value = raw.trim().lowercase()
}
fun main() = println(Token(" AbC ").value)
Обернуть операцию проверкой и не менять основной контракт: Возникнет ошибка доступа, поскольку параметр конструктора имеет видимость `private`.
Перенести проверку в вызывающий код, исходя из того, что код не компилируется, потому что `raw` не объявлен через `val`.
Оставить структуру прежней, документировав утверждение: Она напечатает пустую строку: `raw` освобождается после вызова конструктора.
Хранить нормализованное значение как отдельное read-only свойство, а исходный параметр не превращать в состояние без необходимости.
Вынести участок в отдельный метод, считая верным следующее: Она напечатает `AbC`, так как параметры конструктора нельзя преобразовывать до `init`.