Должен ли я использовать точки с запятой для разграничения операторов Scala?

9

Я привык разделять операторы точкой с запятой из Java, поэтому, естественно, я делаю это и в коде Scala. Я также чувствую, что код легче читать, потому что очевидно, где заканчивается одно утверждение, а другое начинается. Но много раз, когда я публикую часть кода Scala на SO, код редактируется только для удаления точек с запятой.

  1. Я должен использовать точки с запятой или нет? Существуют ли «официальные» руководящие принципы или стиль кодирования?
  2. Есть ли случаи, когда требуются точки с запятой, иначе код неоднозначен?
Петр Пудлак
источник
5
Haskell тебя ничему не научил? ; P удаляет ненужный синтаксис, точки с запятой должны использоваться только для разбиения нескольких предложений / операторов в одной строке
Джимми Хоффа
@JimmyHoffa Haskell научил меня, что синтаксис должен быть красивым и последовательным :).
Петр Пудлак
2
Первая часть этого - то, почему я раздражаюсь всякий раз, когда вижу фрагменты Scala ...
Джимми Хоффа

Ответы:

9

Официально «правильного» способа сделать это не существует, но большинство практиков опускают точки с запятой везде, где могут (именно поэтому многие люди рефлекторно удаляют точки с запятой).

Язык старается изо всех сил заставить вас забыть о необходимости прекращать операторы вообще. К сожалению, это не совсем удачно, поэтому существуют различные сложные ситуации, в которых точки с запятой или дополнительный набор скобок, или подобные «подсказки» необходимы, чтобы избежать нежелательной семантики. Такие ситуации почти достаточно редки, и обычно вам не нужно думать о них. Различаются мнения о том, означает ли это, что вы должны акцентировать внимание на обороне (это то, что я думаю) или никогда не акцентировать внимание, пока не столкнетесь с неприятностями (так думает большинство пользователей). В конечном счете, это зависит от того, идентифицируете ли вы себя как изменника или образцового гражданина.

Килиан Фот
источник
Спасибо, не могли бы вы привести пример (или несколько :)) таких сложных ситуаций?
Петр Пудлак
3
Я боялся, что меня спросят об этом ... Программирование в Scala перечисляет несколько из них, которые меня удивили, но в данный момент у меня нет с собой книги, и я забываю детали. Вот что я пытался подчеркнуть: если бы я мог вспомнить эти исключительные ситуации, это было бы не так плохо, но в действительности я всегда чувствую себя неуверенно, могу ли я действительно пропустить точку с запятой - поэтому я не знаю.
Килиан Фот
Да. Я ни разу не сталкивался с ситуацией, когда пропустить точку с запятой в Скале мне больно. Я никогда не включаю их. Я также запрограммировал Scala только для хобби-подобных вещей, так что, может быть, это укусит меня рано или поздно.
KChaloux
4

Насколько вы хотите понимать языки, которые вы используете? Хотите поиграть в свои сильные стороны или нет? Синтаксис Scala поддерживает понятный и лаконичный код; Несколько крайних случаев, когда использование этого преимущества вызывает проблемы для анализатора Scala, поучительны (то есть вы узнаете больше о Scala, узнав и узнав, как их избежать), и постепенно исправляются (например, суффиксная запись ). Защитное использование точки с запятой может означать, что вам никогда не придется узнавать об этих проблемах, но вы действительно считаете это хорошей вещью? Исправления этих проблем обычно имеют другие последствия, но вы упустите эти возможности.

Другое соображение заключается в том, что, как признает Килиан, большинство разработчиков Scala по умолчанию опускают точки с запятой. Как вы ожидаете работать с чужим кодом, если вы сами избегаете использовать идиоматическую Scala? Вы найдете это намного сложнее, чем нужно.

Я не могу особо подчеркнуть, что эти функции парсера Scala были выбраны для поощрения чистого, повторно используемого и функционального (в смысле fp) кода. Взять в качестве примера синтаксический оператор инфикса; это побуждает разработчиков предоставлять классам простые, одноцелевые методы, которые хорошо сочетаются друг с другом. Библиотека коллекций Scala показывает, насколько красиво это работает. Разработчики классического языка Java, которые принимают это, будут стремиться развивать лучшие привычки и новые взгляды на свой код. Те, кто придерживается всех этих знакомых точек и скобок, пропустят. Я утверждаю, что это также верно для тех, кто слишком робок, чтобы отказаться от точки с запятой.

itsbruce
источник
8
-1 да, «вынужден» изучать язык из-за ошибок компилятора, вышедших из моды в C ++. Кроме того, за утверждениями мало доказательств, которые я хотел бы получить с таким предвзятым тоном.
Теластин
(1) Что сказал @Telastyn - если вы действительно хотите изучать язык таким образом, приобретите кошку, им нравится сидеть за клавишами, потому что они заботятся о вашем образовании. (2) Пропуск точек с запятой не имеет ничего общего с чистым стилем или поощрением его - если вообще что-то, отбрасывание точек с запятой скрывает тот факт, что это отдельные операторы , которые выполняются последовательно и, возможно, имеют побочные эффекты. Оставляя точку с запятой, вы узнаете об этом и, следовательно, предпочитаете более функциональный стиль. Поэтому решение является чисто синтаксическим (например, стиль, разбор и т. Д.).
Эли Барзилай
В то время как «вынужденный изучать язык» не работает, «использование языка в соответствии с намерениями его авторов» и «как его используют большинство других разработчиков» являются важными ориентирами. Поддержание согласованного стиля между несколькими разработчиками полезно. Как из этого ответа, так и из @Killan Foth's, сопровождающие и большинство разработчиков видят точку с запятой как постороннюю.
Сара Мессер