1. Это из другой темы. Смотрю - вводятся “контракт...
# russian
a
3. Это из другой темы. Смотрю - вводятся “контракты” но как-то странно- без наследования. Это уже решённый вопрос, или можно попробовать убедить так не делать?
a
Не понял мысль. Наследование чего?
a
Правильный контракт поддерживает наследование. Если я в интерфейсе написал
fun get(v: Int) require v > 0
то: 1. В любой реализации метода я могу ожидать, что параметр больше нуля 2. Я не могу написать
override fun get(v: Int) require v > 1
но могу написать
override fun get(v: Int) require or v >= 0
и при вызове метода интерфейса с параметром 0 в этой реаллизации ошибки не будет А то, что делается- это просто аналог обычного
if
a
Ну как я это понимаю, контракт - это скорее деталь реализации, чем часть интерфейса. Он говорит о том, что данная реализация будет работать именно таким образом. Пример я не понял, потому что require - это вообще не контракт
a
Я про https://github.com/JetBrains/kotlin/blob/master/libraries/stdlib/src/kotlin/contracts/ContractBuilder.kt А контракт - я про
eiffel
и его контракты.
a
Я понял. Но require там нет. Есть такая функция, но она ка раз работает как if.
a
Вот я и про то- костыль вместо контракта
a
Так, давайте не путать require и контракты, они совсем по-разному работают и для разных целей
a
В прородителе контрактов как раз require и описывал контракт 🙂
a
Возвращаясь к контрактом. В нынешнем виде они описывают все-таки реализацию, а не интерфейс. Поэтому не очень понимаю, в чем претензия. Если нужно наследование, то нужно это делать на уровне типов
i
Вот предложение про контракты, подробнее https://github.com/Kotlin/KEEP/blob/master/proposals/kotlin-contracts.md В частности, наследование и верификация контрактов пока открытые вопросы.