Comments 8
Сталкивался в стандартной библиотеке с контрактами, но в работе не применял - казалось что это что-то очень узкоспециализированное, но последний пример наглядный и многое прояснил, спасибо. У нас большая кодовая база на Kotlin и в некоторых местах полезно будет внедрить
Отключайте пожалуйста проверку орфографии комментариев или плагин поставьте. Очень сбивает при чтении скринов
А ещё лучше код прикладывать не скринами, а кодом:
@OptIn(Experimentatcontracts::class)
fun isHybridCarWithMainElectroAndDieselAdditional(car: Car, mainMotor: Motor, additionalmotor: Motor?): Boolean {
contract {
returns(true) implies(car is Hybrid)
returns(true) implies(mainMotor is ElectroMotor)
returns(true) implies(additionalMotor is DieselMotor)
}
return car is Hybrid && car.mainMotor is ElectroMotor && car.additionalMotor is DieselMotor
}
fun checkCar(car: Car) {
when {
isHybridCarWithMainElectroAndDieselAdditional(car, car.mainMotor, car.additionalMotor) -> {
println("Doing with hybrid and main electro motor and diesel additional motor")
car.mainMotor.iAmElectro()
}
}
}
И в приведённой функции есть неконсистентность:
контракт говорит о том что: если функция возвращает
true
, то аргумент функцииmainMotor
имеет типElectroMotor
.тогда как в реальности: функция игнорирует аргумент функции и проверяет тип поля
mainMotor
из аргументаcar
.
Да, в примере использования аргумент функции mainMotor
содержит значение поля mainMotor
из аргумента car
, но это частный случай примерения, а не общее поведение.
Мне одному кажется, что большинство фич котлина - это просто особые частные случаи использования фич jvm обернутые немотивированно запутанным синтаксическим сахаром, в котором ещё и специально перемешали термины ЯВУ докучи напридумав своих?
В каком-то смысле это можно считать контрактом, но больше смахивает на хинты компайлеру, чтобы получить поведение как в тайпскрипте (type narrowing, type assertion, type guard). В целом выглядит не очень (многословно и трудночитаемо), если знать как это сделано в оригинале.
Специально зарегистрировался, чтобы поставить дизлайк, а нельзя, по этому напишу в виде комментария.
Автор, пожалуйста, вставь код текстом, а не картинками. Хабр Редактор имеет функцию форматирования кода
Контракты в Kotlin или как заключить сделку с совестью