KT Kotlin  ·  25 вопросов  ·  ~70 мин  ·  ⏱ Таймер 10:00  ·  Средний  · 

Sealed class и исчерпывающие модели

Закрытые иерархии проверяются через исчерпывающий when, моделирование состояний и последующее расширение модели. Нужно оценить не только удобство текущего сопоставления, но и то, какие места придётся пересмотреть при добавлении нового варианта.

Отвечено: 0 из 25
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 25 вопросов отведено 70 минут. В каждом задании верен только один вариант. После завершения будут показаны общий результат и 5 тематических шкал.
Вопрос 1 из 25
Что точнее описывает механику фрагмента «Добавление нового варианта»?
KotlinЭволюция модели · Добавление нового варианта
// На ревью требуется объяснить причину поведения.
sealed interface Payment
data class Card(val last4: String) : Payment
data object Cash : Payment

fun audit(p: Payment) = when (p) {
    is Card -> "card:${p.last4}"
    Cash -> "cash"
}
Вопрос 2 из 25
Какая небольшая правка заметно повышает надёжность «Тестирование закрытой команды»?
KotlinТестирование и инструменты · Тестирование закрытой команды
// Сохраните назначение фрагмента, но укрепите его контракт.
sealed interface Command
data object Start : Command
data object Stop : Command
data class SetRate(val value: Int) : Command

fun apply(c: Command): String = when (c) {
    Start -> "started"
    Stop -> "stopped"
    is SetRate -> require(c.value > 0).let { "rate=${c.value}" }
}
Вопрос 3 из 25
На каком входе или состоянии граница «Эволюция sealed-состояния» становится заметной?
Вопрос 4 из 25
Какова практическая цена решения «Smart cast в ветви when»: Ставить более специфичные проверки до широких и выбирать названия ветвей, отражающие предметный смысл, а не только класс?
Вопрос 5 из 25
Какое свойство модели помогает избежать невозможных сочетаний флагов?
KotlinСостояния · Состояние как сумма вариантов
// Проследите фактическое выполнение без изменения кода.
sealed interface Checkout
data object Idle : Checkout
data class Editing(val total: Int) : Checkout
data class Paying(val requestId: String) : Checkout
data class Done(val receipt: String) : Checkout

fun canEdit(s: Checkout) = s is Idle || s is Editing
Вопрос 6 из 25
Что добавить в регрессионный набор для «Тестирование закрытой команды»?
Вопрос 7 из 25
Какой побочный эффект существеннее остальных после правки «Эволюция sealed-состояния»: Не добавлять общий `else` в доменном `when`, если новый вариант обязан заставить каждого потребителя принять решение?
Вопрос 8 из 25
Что важно в ветвях `when` кроме исчерпывающего перечисления?
KotlinВетвление when · Smart cast в ветви when
// Проследите фактическое выполнение без изменения кода.
sealed interface Result
class Ok(val value: Int) : Result
class Error(val cause: Throwable) : Result

fun valueOrZero(r: Result) = when (r) {
    is Ok -> r.value
    is Error -> 0
}
Вопрос 9 из 25
Почему поведение «Состояние как сумма вариантов» не является случайностью?
KotlinСостояния · Состояние как сумма вариантов
// На ревью требуется объяснить причину поведения.
sealed interface Checkout
data object Idle : Checkout
data class Editing(val total: Int) : Checkout
data class Paying(val requestId: String) : Checkout
data class Done(val receipt: String) : Checkout

fun canEdit(s: Checkout) = s is Idle || s is Editing
Вопрос 10 из 25
Какая правка устраняет причину риска в «Добавление нового варианта», а не только его проявление?
KotlinЭволюция модели · Добавление нового варианта
// Сохраните назначение фрагмента, но укрепите его контракт.
sealed interface Payment
data class Card(val last4: String) : Payment
data object Cash : Payment

fun audit(p: Payment) = when (p) {
    is Card -> "card:${p.last4}"
    Cash -> "cash"
}
Вопрос 11 из 25
Что даст добавление нового прямого варианта `Empty` без изменения `label`?
KotlinЗакрытая иерархия · Эволюция sealed-состояния
// Проследите фактическое выполнение без изменения кода.
sealed interface LoadState
data object Loading : LoadState
data class Ready(val items: Int) : LoadState
data class Failed(val message: String) : LoadState

fun label(s: LoadState) = when (s) {
    Loading -> "..."
    is Ready -> "${s.items}"
    is Failed -> s.message
}
Вопрос 12 из 25
Какой контракт определяет наблюдаемый результат «Smart cast в ветви when»?
KotlinВетвление when · Smart cast в ветви when
// На ревью требуется объяснить причину поведения.
sealed interface Result
class Ok(val value: Int) : Result
class Error(val cause: Throwable) : Result

fun valueOrZero(r: Result) = when (r) {
    is Ok -> r.value
    is Error -> 0
}
Вопрос 13 из 25
Какую точечную правку стоит принять на ревью фрагмента «Состояние как сумма вариантов»?
KotlinСостояния · Состояние как сумма вариантов
// Сохраните назначение фрагмента, но укрепите его контракт.
sealed interface Checkout
data object Idle : Checkout
data class Editing(val total: Int) : Checkout
data class Paying(val requestId: String) : Checkout
data class Done(val receipt: String) : Checkout

fun canEdit(s: Checkout) = s is Idle || s is Editing
Вопрос 14 из 25
Какой контрпример точнее всего показывает границу «Добавление нового варианта»?
Вопрос 15 из 25
Предложенная правка для «Тестирование закрытой команды» звучит так: Сочетать по одному содержательному примеру на вариант с граничными тестами данных внутри параметризованных подтипов. Какой недостаток важнее обсудить?
Вопрос 16 из 25
Что следует изменить прежде всего во фрагменте «Smart cast в ветви when»?
KotlinВетвление when · Smart cast в ветви when
// Сохраните назначение фрагмента, но укрепите его контракт.
sealed interface Result
class Ok(val value: Int) : Result
class Error(val cause: Throwable) : Result

fun valueOrZero(r: Result) = when (r) {
    is Ok -> r.value
    is Error -> 0
}
Вопрос 17 из 25
Какой сценарий выявит скрытое ограничение «Состояние как сумма вариантов»?
Вопрос 18 из 25
Команда собирается совместить компиляционный проход с проверкой форматов хранения, сетевых схем и поведения старых клиентов. Что придётся учитывать после внедрения в «Добавление нового варианта»?
Вопрос 19 из 25
Какой набор тестов даёт наибольшую пользу?
KotlinТестирование и инструменты · Тестирование закрытой команды
// Проследите фактическое выполнение без изменения кода.
sealed interface Command
data object Start : Command
data object Stop : Command
data class SetRate(val value: Int) : Command

fun apply(c: Command): String = when (c) {
    Start -> "started"
    Stop -> "stopped"
    is SetRate -> require(c.value > 0).let { "rate=${c.value}" }
}
Вопрос 20 из 25
Почему пример «Эволюция sealed-состояния» даёт именно такой результат?
KotlinЗакрытая иерархия · Эволюция sealed-состояния
// На ревью требуется объяснить причину поведения.
sealed interface LoadState
data object Loading : LoadState
data class Ready(val items: Int) : LoadState
data class Failed(val message: String) : LoadState

fun label(s: LoadState) = when (s) {
    Loading -> "..."
    is Ready -> "${s.items}"
    is Failed -> s.message
}
Вопрос 21 из 25
Команда собирается хранить минимальные данные в каждом варианте и проверять допустимые переходы в одном reducer или доменном объекте. Что придётся учитывать после внедрения в «Состояние как сумма вариантов»?
Вопрос 22 из 25
Команда добавляет `BankTransfer`. Какой порядок изменений надёжнее?
KotlinЭволюция модели · Добавление нового варианта
// Проследите фактическое выполнение без изменения кода.
sealed interface Payment
data class Card(val last4: String) : Payment
data object Cash : Payment

fun audit(p: Payment) = when (p) {
    is Card -> "card:${p.last4}"
    Cash -> "cash"
}
Вопрос 23 из 25
Что в семантике Kotlin или используемого API объясняет «Тестирование закрытой команды»?
KotlinТестирование и инструменты · Тестирование закрытой команды
// На ревью требуется объяснить причину поведения.
sealed interface Command
data object Start : Command
data object Stop : Command
data class SetRate(val value: Int) : Command

fun apply(c: Command): String = when (c) {
    Start -> "started"
    Stop -> "stopped"
    is SetRate -> require(c.value > 0).let { "rate=${c.value}" }
}
Вопрос 24 из 25
Что изменить в «Эволюция sealed-состояния», чтобы скрытое допущение стало явным контрактом?
KotlinЗакрытая иерархия · Эволюция sealed-состояния
// Сохраните назначение фрагмента, но укрепите его контракт.
sealed interface LoadState
data object Loading : LoadState
data class Ready(val items: Int) : LoadState
data class Failed(val message: String) : LoadState

fun label(s: LoadState) = when (s) {
    Loading -> "..."
    is Ready -> "${s.items}"
    is Failed -> s.message
}
Вопрос 25 из 25
Какой дополнительный сценарий нужен для «Smart cast в ветви when»?

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

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

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

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