Возможна ли goto-ошибка для яблок в Kotlin if-Statement без скобок? - PullRequest
0 голосов
/ 22 мая 2019

Представьте себе в Котлине:

if (this) doThis()
else if(that) doThat()
else doWhatEver()

Я всегда читал с использованием фигурных скобок ( см. Яблоки goto fail )!

Правило 1.3.a

Скобки всегда должны окружать блоки кода (иначе, составные операторы), следуя if, else, switch, while, do и для операторов;одиночные операторы и пустые операторы, следующие за этими ключевыми словами, также всегда должны быть заключены в фигурные скобки.

Как компилятор Kotlin справляется с отсутствием фигурных скобок в приведенном выше коде?Я думал, что Котлин может быть достаточно умен, чтобы избежать сбоев в этом?

1 Ответ

1 голос
/ 22 мая 2019

Пример, который вы приводите, не является двусмысленным; это может иметь только одно разумное значение. И это довольно сильно отличается от проблемы, на которую вы ссылаетесь (которая вообще не включает в себя пункты else). Поэтому я не уверен, что вы спрашиваете.

Kotlin похож на большинство C-подобных языков в том, как он интерпретирует ifelse). Строго говоря, ошибка такого типа все еще возможна. Но у Kotlin есть две особенности, которые могут снизить риск возникновения таких проблем.

Во-первых, в отличие от C и Java и подобных языков, if может использоваться как выражение (возвращающее значение). При таком способе компилятор гарантирует, что каждая ветвь возвращает значение; это обычно приводит к ошибке компилятора, если есть путаница вокруг нескольких ветвей.

Вторым является структура when, которая работает как оператор C / Java switch, но избегает провалов и, следовательно, необходимости в break s; его также можно использовать в качестве выражения, обеспечивающего один проход и одно возвращаемое значение.

Так что в Kotlin, связанный код лучше всего написать с when, который был бы проще, а также предотвращал бы этот тип ошибки.

В конечном счете, я не думаю, что это действительно сопоставимо. Связанный код является низкоуровневым C, который имеет очень отличающиеся методы и ограничения от общего кода приложения. В частности, использование goto для устранения ошибок по своей природе подвержено ошибкам. И если бы они правильно использовали ветви else, это сделало бы код более понятным и предотвратило бы эту ошибку.

Можно написать плохой код на любом языке, если вы достаточно решительны! Хороший язык - это язык, который облегчает написание хорошего кода и труднее написание плохого кода. (И я думаю, что Котлин в этом отношении очень хорошо забивает.)

...