KT Kotlin  ·  30 вопросов  ·  ~85 мин  ·  ⏱ Таймер 25:00  ·  Сложный  · 

DSL и функции с receiver

Тест про DSL проверяет управление получателями и границами контекста: типобезопасные построители, лямбды с receiver, инфиксные функции и @DslMarker. Нужно замечать, какой объект сейчас неявный и почему слишком свободный DSL быстро становится двусмысленным.

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 30 вопросов отведено 85 минут. В каждом задании верен только один вариант. После завершения будут показаны общий результат и 6 тематических шкал.
Вопрос 1 из 30
Что точнее описывает механику фрагмента «Контракты собственного DSL»?
KotlinТестирование и инструменты · Контракты собственного DSL
// На ревью требуется объяснить причину поведения.
val page = html {
    p("hello")
    // raw(userInput)
}
Вопрос 2 из 30
Как сделать ответственность во фрагменте «Builder до публикации конфигурации» понятной следующему разработчику?
KotlinАрхитектура и конкурентность · Builder до публикации конфигурации
// Сохраните назначение фрагмента, но укрепите его контракт.
fun routes(block: RouteRegistry.() -> Unit): RouteRegistry =
    RouteRegistry().apply(block).also { it.freeze() }
Вопрос 3 из 30
Как сделать ответственность во фрагменте «Минимальный type-safe builder» понятной следующему разработчику?
KotlinТипобезопасные построители · Минимальный type-safe builder
// Сохраните назначение фрагмента, но укрепите его контракт.
class Html {
    private val parts = mutableListOf<String>()
    fun p(text: String) { parts += "<p>$text</p>" }
    override fun toString() = parts.joinToString("")
}
fun html(block: Html.() -> Unit) = Html().apply(block).toString()
fun main() = println(html { p("Kotlin") })
Вопрос 4 из 30
Какой редкий случай способен сломать наивную трактовку «Два receiver и явная метка»?
Вопрос 5 из 30
Предложенная правка для «Пользовательская infix-функция» звучит так: Использовать infix только для устойчивого бинарного отношения, которое естественно читается без точки и скобок. Какой недостаток важнее обсудить?
Вопрос 6 из 30
Что даёт общий `@DslMarker` вложенным builder-классам?
KotlinОграничение контекста · DSL marker и внешняя область
// Проследите фактическое выполнение без изменения кода.
@DslMarker annotation class UiDsl
@UiDsl class Screen { fun button(text: String) {} }
@UiDsl class Dialog { fun action(text: String) {} }
fun screen(block: Screen.() -> Unit) = Screen().apply(block)
Вопрос 7 из 30
Что проверить отдельно, чтобы не принять «Builder до публикации конфигурации» за универсальное правило?
Вопрос 8 из 30
Что проверить отдельно, чтобы не принять «Минимальный type-safe builder» за универсальное правило?
Вопрос 9 из 30
Предложенная правка для «Два receiver и явная метка» звучит так: Давать вложенным блокам предметные имена или применять `@DslMarker`, чтобы случайно не вызвать операцию внешнего builder. Какой недостаток важнее обсудить?
Вопрос 10 из 30
Какое значение напечатает «Пользовательская infix-функция»?
KotlinИнфиксные функции · Пользовательская infix-функция
// Проследите фактическое выполнение без изменения кода.
infix fun Int.untilExclusive(other: Int) = this until other
fun main() = println((1 untilExclusive 4).toList())
Вопрос 11 из 30
Почему поведение «DSL marker и внешняя область» не является случайностью?
KotlinОграничение контекста · DSL marker и внешняя область
// На ревью требуется объяснить причину поведения.
@DslMarker annotation class UiDsl
@UiDsl class Screen { fun button(text: String) {} }
@UiDsl class Dialog { fun action(text: String) {} }
fun screen(block: Screen.() -> Unit) = Screen().apply(block)
Вопрос 12 из 30
Что стоит исправить в «Контракты собственного DSL» перед слиянием?
KotlinТестирование и инструменты · Контракты собственного DSL
// Сохраните назначение фрагмента, но укрепите его контракт.
val page = html {
    p("hello")
    // raw(userInput)
}
Вопрос 13 из 30
Какую обратную сторону имеет решение для «Минимальный type-safe builder»: Открывать в receiver только допустимые операции и экранировать внешние данные, не смешивая построение структуры с небезопасным raw-текстом?
Вопрос 14 из 30
Какая строка будет выведена?
KotlinОбласть видимости получателя · Два receiver и явная метка
// Проследите фактическое выполнение без изменения кода.
class Outer { val name = "outer" }
class Inner { val name = "inner" }
fun demo() = Outer().run outer@ {
    Inner().run { "$name/${this@outer.name}" }
}
fun main() = println(demo())
Вопрос 15 из 30
Какое объяснение результата «Пользовательская infix-функция» выдерживает проверку соседними случаями?
KotlinИнфиксные функции · Пользовательская infix-функция
// На ревью требуется объяснить причину поведения.
infix fun Int.untilExclusive(other: Int) = this until other
fun main() = println((1 untilExclusive 4).toList())
Вопрос 16 из 30
Что следует изменить прежде всего во фрагменте «DSL marker и внешняя область»?
KotlinОграничение контекста · DSL marker и внешняя область
// Сохраните назначение фрагмента, но укрепите его контракт.
@DslMarker annotation class UiDsl
@UiDsl class Screen { fun button(text: String) {} }
@UiDsl class Dialog { fun action(text: String) {} }
fun screen(block: Screen.() -> Unit) = Screen().apply(block)
Вопрос 17 из 30
Какой дополнительный сценарий нужен для «Контракты собственного DSL»?
Вопрос 18 из 30
Команда собирается проверять дубли маршрутов и зависимости при freeze, затем отдавать readers read-only структуру без builder-методов. Что придётся учитывать после внедрения в «Builder до публикации конфигурации»?
Вопрос 19 из 30
Какое объяснение результата «Два receiver и явная метка» выдерживает проверку соседними случаями?
KotlinОбласть видимости получателя · Два receiver и явная метка
// На ревью требуется объяснить причину поведения.
class Outer { val name = "outer" }
class Inner { val name = "inner" }
fun demo() = Outer().run outer@ {
    Inner().run { "$name/${this@outer.name}" }
}
fun main() = println(demo())
Вопрос 20 из 30
Какая небольшая правка заметно повышает надёжность «Пользовательская infix-функция»?
KotlinИнфиксные функции · Пользовательская infix-функция
// Сохраните назначение фрагмента, но укрепите его контракт.
infix fun Int.untilExclusive(other: Int) = this until other
fun main() = println((1 untilExclusive 4).toList())
Вопрос 21 из 30
Где упрощённое объяснение «DSL marker и внешняя область» перестаёт работать?
Вопрос 22 из 30
Какое ограничение сохранится после правки «Контракты собственного DSL»: Отделить внутреннее дерево от rendering, чтобы тестировать структуру без хрупкой зависимости от пробелов и порядка атрибутов?
Вопрос 23 из 30
Зачем builder замораживается перед публикацией?
KotlinАрхитектура и конкурентность · Builder до публикации конфигурации
// Проследите фактическое выполнение без изменения кода.
fun routes(block: RouteRegistry.() -> Unit): RouteRegistry =
    RouteRegistry().apply(block).also { it.freeze() }
Вопрос 24 из 30
Как поведёт себя фрагмент «Минимальный type-safe builder» при указанных входных данных?
KotlinТипобезопасные построители · Минимальный type-safe builder
// Проследите фактическое выполнение без изменения кода.
class Html {
    private val parts = mutableListOf<String>()
    fun p(text: String) { parts += "<p>$text</p>" }
    override fun toString() = parts.joinToString("")
}
fun html(block: Html.() -> Unit) = Html().apply(block).toString()
fun main() = println(html { p("Kotlin") })
Вопрос 25 из 30
Какой соседний случай отличает устойчивое решение «Пользовательская infix-функция» от удачного примера?
Вопрос 26 из 30
Команда собирается маркировать все receiver-типы одного DSL и добавлять compile-test на запрещённый ошибочный вызов внешнего уровня. Что придётся учитывать после внедрения в «DSL marker и внешняя область»?
Вопрос 27 из 30
Какие проверки нужны DSL кроме сравнения итоговой строки?
KotlinТестирование и инструменты · Контракты собственного DSL
// Проследите фактическое выполнение без изменения кода.
val page = html {
    p("hello")
    // raw(userInput)
}
Вопрос 28 из 30
Что в семантике Kotlin или используемого API объясняет «Builder до публикации конфигурации»?
KotlinАрхитектура и конкурентность · Builder до публикации конфигурации
// На ревью требуется объяснить причину поведения.
fun routes(block: RouteRegistry.() -> Unit): RouteRegistry =
    RouteRegistry().apply(block).also { it.freeze() }
Вопрос 29 из 30
Что в семантике Kotlin или используемого API объясняет «Минимальный type-safe builder»?
KotlinТипобезопасные построители · Минимальный type-safe builder
// На ревью требуется объяснить причину поведения.
class Html {
    private val parts = mutableListOf<String>()
    fun p(text: String) { parts += "<p>$text</p>" }
    override fun toString() = parts.joinToString("")
}
fun html(block: Html.() -> Unit) = Html().apply(block).toString()
fun main() = println(html { p("Kotlin") })
Вопрос 30 из 30
Какой рефакторинг делает поведение «Два receiver и явная метка» предсказуемее?
KotlinОбласть видимости получателя · Два receiver и явная метка
// Сохраните назначение фрагмента, но укрепите его контракт.
class Outer { val name = "outer" }
class Inner { val name = "inner" }
fun demo() = Outer().run outer@ {
    Inner().run { "$name/${this@outer.name}" }
}
fun main() = println(demo())

Ответьте на все 30 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу