Каков принятый / рекомендуемый синтаксис для кода Scala с большим количеством цепочек методов?

В Scala я предпочитаю писать большие цепочечные выражения множеству более мелких выражений с присваиваниями val . В моей компании мы разработали стиль для этого типа кода. Вот полностью надуманный пример (идея состоит в том, чтобы показать выражение с большим количеством связанных вызовов):

import scala.util.Random
val table = (1 to 10) map { (Random.nextInt(100), _) } toMap

def foo: List[Int] =
  (1 to 100)
    .view
    .map { _ + 3 }
    .filter { _ > 10 }
    .flatMap { table.get }
    .take(3)
    .toList

Руководство по стилю Scala Даниэля Спивака (pdf), которое мне в целом нравится, предлагает начальную точку в цепочке вызовы методов могут быть плохими (см. документ: Вызов метода / Функции высшего порядка), хотя он не распространяется настрочные выражения, подобные этому напрямую.

Есть ли другой, более приемлемый / идиоматический способ написать функцию foo выше?

ОБНОВЛЕНИЕ: 28 июня 2011 г.

Множество замечательных ответов и обсуждений ниже. Похоже, что не существует 100% -ного ответа «вы должны сделать это так», поэтому я собираюсь принять самый популярный ответ по голосам, который в настоящее время является подходом для понимания. Лично я думаю, что пока буду придерживаться обозначения с точкой и принять риски, связанные с этим.

22
задан overthink 28 June 2011 в 19:24
поделиться

1 ответ

Мое правило: если выражение помещается на одной строке (80-120 символов), держите его на одной строке и по возможности пропускайте точки:

def foo: List[Int] = 
   (1 to 100).view map { _ + 3 } filter { _ > 10 } flatMap table.get take 3 toList

Как указал Кевин, точка - свободный стиль может улучшить краткость (но может повредить читабельности для разработчиков, не знакомых с ним):

def foo: List[Int] = 
   (1 to 100).view map{3+} filter{10<} flatMap table.get take 3 toList

Нотация ведущей точки вполне приемлема, если вам нужно разделить выражение на несколько строк из-за длины , Другая причина использования этой нотации - когда для операций нужны отдельные комментарии. Если вам нужно распределить выражение по нескольким строкам из-за его длины или необходимости комментировать отдельные операции, лучше всего обернуть все выражение в скобки (как Алекс Бойсверт предлагает . В этих ситуациях каждая (логическая) операция должна идти в отдельной строке (т. е. каждая операция идет в одной строке, за исключением случаев, когда несколько последовательных операций можно кратко описать одним комментарием). ):

def foo: List[Int] = 
   ( (1 to 100).view
     map { _ + 3 }
     filter { _ > 10 }
     flatMap table.get
     take 3
     toList )   

Этот метод позволяет избежать потенциальных проблем с выводом точки с запятой , которые могут возникнуть при использовании обозначения начальной точки или при вызове метода 0-arg в конце выражения.

2
ответ дан 29 November 2019 в 04:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: