Вот слово самого человека, который написал scala, и до сих пор является основным разработчиком этого языка.
Источник: Принципы функционального программирования в Scala
Мартина Одерского
Вам также предлагается пройти его курс сейчас или на следующем предложении ссылка [1]
===========================
Справочник по стилю Scala Справка
На этой странице вы можете найти список распространенных проблем, которые мы обнаружили при просмотре некоторых материалов.
Некоторые проблемы стиля могут быть обнаружены с помощью автоматической проверки стиля, которую мы также используем для процесса оценки. Проверка стиля, основанная на Scalastyle, может быть выполнена локально в sbt, запустив задачу styleCheck.
Общие проблемы
1 Избегать приведения и типовых тестов
Никогда не используйте isInstanceOf или asInstanceOf - всегда есть лучшее решение, как для заданий, так и для любого реального проекта Scala. Если вам захочется использовать приведение, сделайте шаг назад и подумайте о том, чего вы пытаетесь достичь. Перечитайте инструкции к заданию и посмотрите на соответствующие видео лекции.
2 Отступ
Убедитесь, что ваш код имеет правильные отступы, он станет намного более читабельным.
Это может показаться тривиальным и не очень уместным для наших упражнений, но представьте, что в будущем вы станете частью команды, работающей над теми же файлами с другими кодерами: очень важно, чтобы все соблюдали правила стиля, чтобы сохранить код здоровый.
Если ваш редактор не выполняет отступы так, как вы хотели бы, вы должны выяснить, как изменить его настройки. В Scala стандартом является отступ с использованием 2 пробелов (без табуляции).
3 Длина строки и пробелы
Убедитесь, что строки не слишком длинные, иначе ваш код будет очень трудно читать. Вместо того, чтобы писать очень длинные строки, введите некоторые привязки локальных значений. Равномерное использование пробелов делает ваш код более читабельным.
Пример (длинная строка, пропущенные пробелы):
if(p(this.head))this.tail.filter0(p, accu.incl(this.head))else this.tail.filter0(p, accu)
Лучше:
if (p(this.head))
this.tail.filter0(p, accu.incl(this.head))
else
this.tail.filter0(p, accu)
Еще лучше (см. № 4 и № 6 ниже):
val newAccu =
if (p(this.head)) accu.incl(this.head)
else accu
this.tail.filter0(p, newAccu)
4 Использование локальных значений для упрощения сложных выражений
При написании кода в функциональном стиле методы часто реализуются как комбинация вызовов функций. Если такое комбинированное выражение становится слишком большим, код может стать трудным для понимания.
В таких случаях лучше сохранить некоторые аргументы в локальном значении, прежде чем передавать их в функцию (см. # 3 выше). Убедитесь, что локальное значение имеет значимое имя (см. # 5 ниже)!
5 Выберите значимые имена для методов и значений
Имена методов, полей и значений должны быть тщательно подобраны, чтобы их было легко понять. Имя метода должно прояснить, что делает метод. Нет, temp никогда не бывает хорошим именем: -)
Несколько превосходных примеров:
val temp = sortFuntion0(list.head, tweet) // what does sortFunction0 do?
def temp(first: TweetSet, second : TweetSet): TweetSet = ...
def un(th: TweetSet,acc: TweetSet): TweetSet = ...
val c = if (p(elem)) accu.incl(elem) else accu
def loop(accu: Trending, current: TweetSet): Trending = ...
def help(ch: Char, L2: List[Char], compteur: Int): (Char, Int) = ...
def help2(L: List[(Char, Int)], L2: List[Char]): List[(Char, Int)] = ...
6 Распространенные выражения Subexpressions
Вам следует избегать ненужных вызовов ресурсоемких методов. Например
this.remove(this.findMin).ascending(t + this.findMin)
дважды вызывает метод this.findMin. Если каждый вызов является дорогостоящим (например, требует прохождения всей структуры данных) и не имеет побочного эффекта, вы можете сохранить его, введя привязку локального значения:
val min = this.findMin
this.remove(min).ascending(t + min)
Это становится еще более важным, если функция вызывается рекурсивно: в этом случае метод вызывается не только несколько раз, но и экспоненциально.
7 Не копируйте и не вставляйте код!
Код копирования-вставки - это всегда предупреждающий знак плохого стиля! Есть много недостатков:
Код длиннее, для его понимания требуется больше времени
Если две части не идентичны, но очень похожи, очень трудно определить различия (см. Пример ниже)
Сохранение двух копий и обеспечение их синхронизации очень подвержено ошибкам
ЯКоличество работ, необходимых для внесения изменений в код, умножается. Вы должны разбивать общие части на отдельные методы, а не копировать код.Пример (см. Также № 3 выше для другого примера):
val googleTweets: TweetSet = TweetReader.allTweets.filter(tweet =>
google.exists(word => tweet.text.contains(word)))
val appleTweets: TweetSet = TweetReader.allTweets.filter(tweet =>
apple.exists(word => tweet.text.contains(word)))
This code is better written as follows:
def tweetsMentioning(dictionary: List[String]): TweetSet =
TweetReader.allTweets.filter(tweet =>
dictionary.exists(word => tweet.text.contains(word)))
val googleTweets = tweetsMentioning(google)
val appleTweets = tweetsMentioning(apple)
8 Scala не требует точек с запятой
Точки с запятой в Scala требуются только при написании нескольких операторов в одной строке.Следует избегать ввода лишних точек с запятой, например:
def filter(p: Tweet => Boolean): TweetSet = filter0(p, new Empty);
9 Не отправляйте код с «print» утверждениями
Вы должны очистить свой код и удалить все операторы print или println перед тем, какотправив его.То же самое применимо, когда вы работаете в компании и создаете код, который используется в производстве: окончательный код не должен содержать операторов отладки.
10 Избегайте использования Return
В Scala вы частоне нужно использовать явные возвраты, потому что управляющие структуры, такие как if, являются выражениями.Например, в
def factorial(n: Int): Int = {
if (n <= 0) return 1
else return (n * factorial(n-1))
}
операторы возврата могут быть просто отброшены.
11 Избегайте изменяемых локальных переменных
Поскольку это курс по функциональному программированию, мы хотим, чтобы выпривыкнуть к написанию кода в чисто функциональном стиле, без использования побочных операций.Вы можете часто переписывать код, который использует изменяемые локальные переменные, для кодирования с помощью вспомогательных функций, которые используют аккумуляторы.Вместо:
def fib(n: Int): Int = {
var a = 0
var b = 1
var i = 0
while (i < n) {
val prev_a = a
a = b
b = prev_a + b
i = i + 1
}
a
}
предпочитайте:
def fib(n: Int): Int = {
def fibIter(i: Int, a: Int, b: Int): Int =
if (i == n) a else fibIter(i+1, b, a+b)
fibIter(0, 0, 1)
}
12 Исключить избыточные выражения «Если»
Вместо
if (cond) true else false
вы можете простонапишите
cond
(аналогично для случая negaitve).
Другие проблемы со стилем?Пожалуйста, отправляйте сообщения на форум, используя style или styleChecktags, и мы дополним это руководство по стилю предложениями.