Pull to refresh

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). В целом выглядит не очень (многословно и трудночитаемо), если знать как это сделано в оригинале.

Специально зарегистрировался, чтобы поставить дизлайк, а нельзя, по этому напишу в виде комментария.

Автор, пожалуйста, вставь код текстом, а не картинками. Хабр Редактор имеет функцию форматирования кода

Sign up to leave a comment.

Articles