💡 Инструкция: Выберите один ответ из пяти. На 20 вопросов отведено 55 минут. В каждом задании верен только один вариант. После завершения будут показаны общий результат и 4 тематических шкал.
Вопрос 8 из 20
Как сделать ответственность во фрагменте «Частичное изменение через copy» понятной следующему разработчику?
Kotlin Копирование через copy · Частичное изменение через copy Копировать
// Сохраните назначение фрагмента, но укрепите его контракт.
data class Config(val host: String, val ports: List<Int>)
fun main() {
val base = Config("api", listOf(80, 443))
val dev = base.copy(host = "localhost")
println(dev)
}
Добавить защитную проверку перед фрагментом, поскольку код не компилируется: нельзя пропускать `ports` в `copy`.
Применять `copy` для явных переходов неизменяемой модели, а сложные допустимые переходы оформлять доменными методами.
Перенести проверку в вызывающий код, исходя из того, что будет выведен исходный объект, поскольку `copy` меняет его на месте.
Ограничиться поясняющим комментарием о том, что будет выведен `Config(host=localhost, ports=[])`, потому что непереданные свойства сбрасываются.
Оставить реализацию без изменений и закрепить тестом предположение: Возникнет ошибка, так как `host` объявлен через `val`.
Вопрос 13 из 20
Какой контрпример точнее всего показывает границу «Поверхностный copy data class»?
Воспроизвести редкий сценарий, где возникнет `ConcurrentModificationException` при изменении списка через копию.
Свойства, объявленные только в теле data class, не участвуют в сгенерированных `equals`, `hashCode`, `copy` и destructuring.
Проверить границу полезности утверждения: Будет напечатано `[]`, потому что `copy()` сбрасывает изменяемые свойства.
Проверить, сохраняется ли контракт, когда будет напечатано `[reader]`, потому что data class глубоко копирует коллекции.
Отдельно воспроизвести случай, в котором код не компилируется: `copy()` требует передать все свойства.
Вопрос 14 из 20
Предложенная правка для «Частичное изменение через copy» звучит так: Применять `copy` для явных переходов неизменяемой модели, а сложные допустимые переходы оформлять доменными методами. Какой недостаток важнее обсудить?
Сопровождение усложнится, если окажется, что код не компилируется: нельзя пропускать `ports` в `copy`.
Цепочки `copy` хорошо показывают изменение состояния, но при десятках полей подсказывают, что модель стоит декомпозировать.
Граница полезности решения описывается условием: Возникнет ошибка, так как `host` объявлен через `val`.
Обратная сторона изменения состоит в том, что будет выведен `Config(host=localhost, ports=[])`, потому что непереданные свойства сбрасываются.
Главная цена решения — необходимость учитывать, что будет выведен исходный объект, поскольку `copy` меняет его на месте.