scala с чего начать

Как я Scala учил

Месяца назад я получил свою первую работу и стал стажер-разработчиком, наша команда использует язык Scala. Мне кажется, все начинающие разработчики в первый день потерянные. одновременно наваливается куча новых имен, технологий, каких-то правил, да и мало ли что еще, абсолютно все для тебя ново, это же первая работа. В моем же случае я еще и не знал языка, на котором буду программировать, до момента собеседования я даже никогда о нем не слышал. Итог: в первый день я был в полном ауте. Спросите как тогда я вообще получил эту работу? Я знал Java, на собеседовании мне сказали что джависту перейти на скалу будет достаточно легко и можно не переживать. Но видимо чуть-чуть попереживать все же стоило, потому что первое время перед собой я видел просто экраны, заполненные текстом, в которых сходу была ясна едва ли половина.

Но больше дискомфорта приносило даже не то, что я чего-то не понимал, а то что там многое по-другому, да даже тип переменной идет после названия, а порой его вообще нет.

Вот так описывается функция:

А еще у Scala есть консоль REPL(Read-eval-print-loop), как, например, в Python. Как вы уже заметили пропали точки с запятой. Можно запускать одностраничные программы без main’а, названия методов и переменных могут содержать и начинаться вообще с любых символов, никаких правил. Там не static, но есть Object, там примитивы тоже объекты, == там на самом деле equals. Если у метода нет параметров то не обязательно ставить точку для вызова метода, скобки тоже опциональны если нет параметров, а если принимает только 1 параметр, то можно написать вот так:

И еще один интересный пример:

Нет, это не просто 1 плюс 1, здесь у объекта 1, вызывается метод + и ему передается единственным параметром объект 1. Для меня этого было разрывом шаблона.

На помощь моему шоку пришла замечательная книга Дэвида Поллака — Beginning Scala. Книга начинается с одной фразы, после которой я понял что обязательно должен дочитать ее до конца:

Ouch! That hurts my brain! Stop making me think differently. Oh, wait… it hurts less now. I get it. This different way of solving the problem has some benefits. I felt that way after my first year of law school. I felt that way for a while when I began coding Scala.

Scala is a programming language that provides a best-of-all-worlds experience for developers.

Тем не менее автор честно предупреждает, что овладеть им не так уж просто, ему для этого потребовалось 2 года, но он надеется, что мы сможем быстрее и он в этом поможет. Это не очень-то простая книга и она предполагает определенный опыт в программировании у читателя. Особенно она понравится тем, кто раньше программировал на Java, т.к. встречается много отсылок к этому языку и можно сравнивать.

Помимо Beginning Scala параллельно я читал уроки Twitter’s Scala School, для всех уроков есть перевод на русский язык, книгу Дэвида Поллака же удалось найти только в английском варианте.

Закрепить теорию помимо самостоятельных путешествий по исходникам скалы и работы помогал проект Scala Exercises, там очень простые задания, но вполне подходят для закрепления какого-то аспекта на первых порах и проверки того, что ты все внимательно прочитал и понял действительно правильно.

И расскажу немного про самые распространенные и очень простые вещи, которые пришлось постичь в первую очередь.

Легко возвращать значение по умолчанию в случае пустого Option

В случае каких-то действий:

Пример из Scala Beginning. Путь есть некая база данных, которая содержит записи типы Person

Метод вернет Some[Person] если такая запись будет найдена и None иначе.
Теперь мы хотим получать возраст пользователя по ключу.

Нам не пришлось тестировать на None и метод получился очень лаконичным.

Pattern matching. В начале я подумал, что это тот же джавовский switch и использовать я его почти не буду, но это не так. В Scala это одна из самых часто используемых конструкций.

Можно добавить дополнительные условия и добавить действие по умолчанию

Крайне удобно использовать pattern-matching с case-классами. Пример из Scala Beginning

Начнем с того, что в Scala функции — это инстансы, реализующие определенный интерфейс, а точнее trait FunctionX, где X это количество параметров и принимает значение от 1 до 22. В этом трейте единственный метод — aplly, который и вызывается для функции. Поскольку функции это обычные инстансы, то мы можем передавать и возвращать их из методов и функций.
Пример из Scala Beginning. Передаем в answer какую-то функцию из Int в String, а она возвращает результат работы этой функции с параметром 42.

или что тоже самое

Очень удобная вещь функциональные комбинаторы/

Оставить в массиве только положительные элементы:

Чуть более сложный пример. Посчитать сумму значений функции f от положительных элементов списка. 2 способа это сделать:

А в конце хотелось бы сказать зачем вообще я все это написал. Я не хотел никого учить Scala или рассказывать о языке как о таковом, таких статей на хабре и в интернете достаточно много, и многие очень хорошие и полезные. Моей целью было просто рассказать свою историю, которая кому-то может быть интересна и сможет помочь и поддержать какого-нибудь такого же потерянного новичка, которого судьба только-только столкнула с этой скалой. Желаю тебе удачи! Опытных же программистов призываю поделиться в комментариях своими советами и мнениями, на счет пути начинающего Scala-программиста.

Источник

Зачем нужен Scala?

Разбираем, почему это не самый популярный язык.

Встречали в вакансиях позицию разработчика на Scala? Это редкий зверь, но платят нормально. Разберёмся, что это такое и зачем нужно.

Разработчик языка рассчитывал, что Scala станет преемником Java: он наследует многое хорошее из Java, работает по схожим принципам и добавляет что-то своё. И хотя Scala не стал таким же распространённым, всё равно стоит понять, из чего он сделан.

Плюсы Scala

Scala, как и Java, работает под JVM — виртуальной машиной Java (Java Virtual Machine). JVM — это такая прослойка между программой и железом. Благодаря этой прослойке один и тот же код можно исполнить на чём угодно, для чего есть JVM: и на компьютере, и на терминале оплаты, и на умном холодильнике. Не нужно каждый раз думать: «А какие там драйверы экрана?» или «С какой скоростью работает сетевой шлюз?» — всё это берёт на себя JVM, а мы пишем только логику и интерфейс.

Минусы Scala

Но если всё было бы так просто, про Java все давно бы забыли, но этого не произошло. Более того, сейчас не так много Scala-вакансий на рынке, чтобы говорить о популярности этого языка. На это есть несколько причин:

Синтаксис

С точки зрения кода в Scala всё то же самое, что и в Java-языках, кроме некоторых ООП-особенностей, поэтому начнём с привычных деталей, а потом перейдём к отличиям.

Основы. Каждая команда заканчивается точкой с запятой, а присваивание и математические операторы такие же, как в Java и JavaScript.

Типов данных — много, как в любом типизированном языке. Как и в Ruby, каждый тип — это объект, который можно менять, добавлять в него новые методы.

Переменные. Объявляются с помощью служебных слов val и var, но разница между ними в Scala настолько размытая и непрозрачная, что иногда даже опытным разработчикам сложно понять, какое слово будет уместнее в каждой ситуации.

Условные операторы и циклы. Всё привычно — for, while и do-while, но с одним отличием: в цикле for применяется упрощённая запись для организации переменной цикла. Обратите внимание на код ниже — сколько танцев с бубном ради одного цикла, который сам занимает три строки (не считая комментария):

Кто и для чего использует Scala

У Scala нет явно выраженной области применения, как у некоторых других языков. С другой стороны, из-за объединения ООП и функционального программирования этот язык прижился в тех командах, которым нужно совмещать в работе оба подхода.

Второе преимущество — возможность запустить код в любом JVM-окружении, поэтому Scala выбирают те, кому нравится объектный подход, но не нравится то, как это сделано в Java.

Основные популярные фреймворки — Play и Lift, и их используют в основном СМИ и новостные сайты:

С чего начать

Если хотите изучить основы Scala и попробовать свои силы в объектно-ориентированном программировании в мире Java, то вот с чего можно начать.

Большая статья в RSDN Magazine — «Обзор языка программирования Scala». Хороший и понятный материал, но подан в сухом академическом стиле.

«Scala в примерах» в Викиучебнике — написано попроще, но без введения для новичков.

«Руководство по Scala» в Записках задумчивого программиста — просто, понятно, но иногда автор не даёт подробных объяснений тому, что происходит в коде.

Источник

Scala Tutorial — Изучите Scala с помощью пошагового руководства

scala с чего начать. Смотреть фото scala с чего начать. Смотреть картинку scala с чего начать. Картинка про scala с чего начать. Фото scala с чего начать

темы:

Особенности Scala

У Scala есть много причин быть популярными и востребованными. Немногие из причин упомянуты ниже:

Область применения

scala с чего начать. Смотреть фото scala с чего начать. Смотреть картинку scala с чего начать. Картинка про scala с чего начать. Фото scala с чего начать

Начало работы с Scala

Scala — это очень совместимый язык, поэтому его можно очень легко установить в операционные системы Windows и Unix.
Так как Scala очень похож на другие широко используемые языки синтаксически, в Scala проще кодировать и изучать. Scala-программы могут быть написаны в любом текстовом редакторе, таком как блокнот, notepad ++ или что-либо в этом роде. Можно также использовать онлайновую IDE для написания кодов Scala или даже установить ее в своей системе, чтобы сделать эти коды более удобными для написания, потому что IDE предоставляют множество функций, таких как интуитивно понятный редактор кода, отладчик, компилятор и т. Д.
Для начала, написание кодов Scala и выполнение различных интригующих и полезных операций, необходимо установить Scala в своей системе. Это можно сделать, следуя пошаговым инструкциям, приведенным ниже:

Мы получим вывод, как показано ниже:
scala с чего начать. Смотреть фото scala с чего начать. Смотреть картинку scala с чего начать. Картинка про scala с чего начать. Фото scala с чего начать
Вывод команды.

Как запустить программу Scala?

Давайте рассмотрим простую программу Hello World.

// Scala программа для печати Hello World

def main(args : Array[String])

// печатает Привет, гики!

println( «Hello, World!» )

Выход:

Как правило, есть два способа запуска программы Scala:

Основы Scala

переменные

Переменные — это просто место хранения. Каждая переменная известна по своему имени и хранит некоторую известную и неизвестную часть информации, известную как значение. В Scala есть два типа переменных:

Пример:

операторы

Оператор — это символ, который представляет операцию, которая должна быть выполнена с одним или несколькими операндами. Операторы позволяют нам выполнять различные виды операций над операндами. В Scala используются следующие типы операторов:

Пример :

// Scala программа для демонстрации
// Операторы

Источник

Scala как первый язык

Эта статья, как и мой предыдущий пост, не похожа на то, что обычно публикуют на Хабре. Здесь не объясняется никаких новых или старых концепций, я не рассказываю что такое ООП и функциональное программирование, сложного кода почти нет. Я хочу пригласить вас к дискуссии стоит ли начинать программировать с языка Scala.

Меня иногда просят научить программированию или помочь с поиском подходящего курса. Я хорошо понимаю недостатки и сложности со скалой, но думаю, что Scala 3 — подходящий язык, для того чтобы начать обучение с него, если правильно составить курс. Вся языковая мощь и сложность, конечно, не нужны начинающему программисту, но ему и незачем о них знать. На скале можно писать вполне простой и понятный код, постепенно наращивая инструментарий.

Я согласен с теми комментаторами, кто считает что для этого нужен толковый преподаватель. Это безусловно. Или талантливый преподаватель, который разбирается в предмете, или хорошая книжка, или толковый курс просто необходимы. Иначе есть риск захлебнуться, так и не научившись плавать.

И тем не менее я считаю, что Scala — это язык будущего.

scala с чего начать. Смотреть фото scala с чего начать. Смотреть картинку scala с чего начать. Картинка про scala с чего начать. Фото scala с чего начатьЛестница в логотипе отсылает к институту EPFL в Лозанне. Там придумали этот язык

Если коротко, то Scala — это возможность научиться функциональному программированию на безопасном языке, у которого есть большое будущее

Умный компилятор

У скалы один из самых умных и сложных компиляторов. Это приводит к медленным билдам (особенно в первых версиях языка), и за это скалу хейтят. Но зато мы можем отдать компилятору очень много работы по анализу кода, проверке его на безопасность и отсутствие ошибок, что очень важно для программиста. Эта сложность — на стороне разработчика, в том числе и начинающего, которому компилятор очень помогает и облегчает работу.

Скала — это единственный язык, где я пишу код, и он сразу работает без утомительной отладки. Конечно, так происходит не всегда, но с джавой, джаваскриптом, си, паскалем и бейсиком так не происходило никогда. Я люблю говорить, что джава — это язык для компилятора, а скала — это язык для программиста.

JVM-экосистема

Как известно, Джеймс Гослинг, создатель языка джава, считает самой лучшей ее частью джава-машину. Действительно, много инженеров потратило десятки человеко-лет на разработку виртуальной машины и достигли скоростей, в некоторых случаях превышающих Си++. Вот исследование производительности JVM в мобильных устройствах, в нем чаще побеждает нативный код на Си, но в одном случае победила JVM: Java vs C app performance.

scala с чего начать. Смотреть фото scala с чего начать. Смотреть картинку scala с чего начать. Картинка про scala с чего начать. Фото scala с чего начатьНа Android 6 AArch64 JVM победила Си в математических вычислениях, хотя и проиграла во всех других видах

Java Memory Model (Модель памяти для многопоточных вычислений) — это зрелая, непротиворечивая, проверенная многими годами промышленного программирования парадигма, которая при правильном использовании гарантирует достаточный уровень абстракции и безопасности. Благодаря этому возможны удобные конструкции для параллельного программирования, доступные даже начинающим.

Кроме того, на джаве написаны миллионы строк кода, которые вы можете использовать из скалы или без проблем в нее транслировать.

Кстати, Джеймсу Гослингу скала тоже нравится.

scala с чего начать. Смотреть фото scala с чего начать. Смотреть картинку scala с чего начать. Картинка про scala с чего начать. Фото scala с чего начать

Но в этом всем есть и минусы. Как мы знаем, высокоуровневые абстракции протекают, и для того чтобы программировать на скале, важно знать как устроена виртуальная машина джава, и учитывать ее особенности. Например, такие как Type Erasure. Это довольно серьезный минус, но плюсы от использования JVM его перевешивают.

Эволюция vs революция

В экосистеме скалы приняты довольно слабые гарантии обратной совместимости по сравнению с джавой. С одной стороны, это приводит к тому, что разработчикам постоянно приходится поддерживать свой код в форме при переходе на новую версию языка или библиотек. Кроме того, разработчикам библиотек приходится прибегать к кросс-компиляции для того чтобы обеспечить несколько версий скомпилированных библиотек, подходящих для нескольких версий языка. Это, безусловно, минус.

Но с другой стороны такой подход обеспечивает быстрое и динамичное развитие языка, которое не может себе позволить джава. Именно поэтому я думаю что будущее — за скалой.

К тому же, в Scala 3 появилось типизированное абстрактное синтаксическое дерево компилятора TASTY, которое позволит взаимодействовать классам, собранным разными версиями компилятора. Разумеется, начинающим программистам нет нужды разбираться в этом.

Scala 3

Благодаря более слабым гарантиям обратной совместимости, разработчики языка получили возможность пересмотреть его основы, включая синтаксис.

Первоначальным посылом к созданию скалы было сделать язык промышленного уровня, на котором будет приятно программировать. Это действительно был большой шаг вперед.

Но некоторые решения, принятые более 15 лет назад, были неверными и приводили к неочевидному, либо многословному коду. И сейчас создатели языка делают его действительно лучше. После этих изменений шансы скалы в качестве первого языка программирования заметно вырастают.

Я уже пару лет с нетерпением жду его выхода и мечтаю начать писать на нём. Вот сжатый рассказ Мартина Одерски про новую версию языка: Countdown to Scala 3 by Martin Odersky. Для опытных разработчиков — интересная статья Annoying things in Scala 2 that’ll be (mostly) gone in Scala 3

Dependent Object Types — это теоретические основы языка Scala 3, разработанные его основателем Мартином Одерски. Мало какой язык может похвастать математически точным исчислением, лежащем в его основе.

scala с чего начать. Смотреть фото scala с чего начать. Смотреть картинку scala с чего начать. Картинка про scala с чего начать. Фото scala с чего начатьМартин Одерски

Согласитесь, приятно учить язык с таким бэкграундом, хотя начинающим программистам знать о нём не обязательно.

Выразительность и лаконичность

То, что я больше всего люблю в языке — это его сжатость и лаконичность. Я ненавижу длиннейшие конструкции джавы, в которых приходится сложно и многословно объяснять компилятору простые вещи. Моя любимая шутка про джаву — что это такой язык, в котором уан-лайнер занимает около 30 строк. Так вот, в скале уан-лайнер — это уан-лайнер.

Я думаю, что это качество важно не только для опытных разработчиков, но и для тех кто только изучает язык. Думаю, выразительность — это та причина, по которой так популярны динамические и скриптовые языки. Уверен, скала способна с ними в этом поспорить. И даже сама послужить отличным скриптовым языком.

Конечно, лаконичность не должна наносить ущерб читаемости кода. Таких неудачных примеров в программировании полно, вспомним регулярные выражения, паттерн-матчинг и парсер-комбинаторы. Понятно, что для написания библиотек важно понимать сложные концепции и знать много умных слов. Но для того, чтобы ими пользоваться и писать простой код, всего этого знать не надо. Минимальный уровень скалы, который подойдет начинающим, очень простой.

Вот мой любимый пример для библиотечного кода на скале. Конечно, он не предназначен для начинающих разработчиков:

В новой версии языка даже есть возможность писать намного меньше фигурных скобок, если есть желание. Это будет выглядеть примерно так:

Статическая типизация

По-моему это самое важное, что должно быть в первом языке программирования. Программисту важно понимать, что не стоит складывать яблоки с апельсинами.

Именно по этой причине на мой взгляд не стоит начинать обучение с Питона, Руби, Джаваскрипта, Си и Си++. Динамическая типизация — это верный способ выстрелить себе в ногу.

Другое дело, что статическая типизация неудобна, неочевидна и требует дополнительного бойлер-плейта. Скала вполне успешно позволяет избавиться от этих недостатков в простых программах.

Объектно-ориентированное программирование — это самая популярная парадигма, без которой не обходится ни один современный язык программирования.

В скале эта парадигма изначально присуща языку, в отличии от Питона, Си/Си++ и в каком-то смысле джаваскрипта. Разумеется, сейчас у этих языков с ООП полный порядок.

Функциональное программирование

Функциональное программирование — это многообещающая тенденция. Скале она присуща в не меньшей степени чем ООП, и они взаимно обогащают друг друга благодаря этому языку. Рискну предположить, что скала — первый язык промышленного уровня с такими свойствами. Сейчас за ним подтягивается Котлин и другие более новые языки.

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

Иммутабельность

Вообще-то это свойство функционального программирования. Мне кажется очень важным прививать умение пользоваться неизменяемыми структурами данных с самого начала. Это позволит в будущем создавать безопасный многопоточный код. И не только многопоточный.

Расширяемость

Как известно, название языка изначально преподносилось как аббревиатура Scalable Language. Особенности языка позволяют писать гибкие и красивые DSL, удобные даже для не-программистов, вкладывать абстракции друг в друга, создавать очень удобные библиотеки и простые скрипты.

Часто этот инструмент обращается против пользователей библиотек, повышая порог входа в их API. Но в умелых руках такая гибкость может обратиться в большое благо. Опытные разработчики могу создавать на Scala простое и удобное API, тем самым заметно облегчая жизнь начинающим программистам.

В целом язык скала предоставляет большое количество мощных инструментов, и обратная сторона этого — высокий порог входа, особенно в отсутствии хорошего курса, учебника, или наставника.

Но думаю, что с хорошим наставником или туториалом вполне можно начинать изучать программирование с языка скала и получать правильные привычки статической типизации, функционального программирования и иммутабельных структур данных.

scala с чего начать. Смотреть фото scala с чего начать. Смотреть картинку scala с чего начать. Картинка про scala с чего начать. Фото scala с чего начатьИсточник: https://prwatech.in/blog/apache-spark/introduction-to-scala-programming-language/

Рынок вакансий

Конечно, вакансий для скала-программистов значительно меньше, чем для джава-программистов. Но зато Scala выше оплачивается.

scala с чего начать. Смотреть фото scala с чего начать. Смотреть картинку scala с чего начать. Картинка про scala с чего начать. Фото scala с чего начатьhttps://insights.stackoverflow.com/survey/2019

Вот вам картинка про области применения скалы:

scala с чего начать. Смотреть фото scala с чего начать. Смотреть картинку scala с чего начать. Картинка про scala с чего начать. Фото scala с чего начатьИсточник: https://prwatech.in/blog/apache-spark/introduction-to-scala-programming-language/

Мои первые книжки

Самая лучшая книжка про скалу, которую я читал — Scala by Example Мартина Одерски, написанная уже 10 лет назад. Прежде чем начинать сейчас читать книгу по скале, очень рекомендую убедиться что она обновлена до версии Scala 3.

А любимый курс — это Functional Programming in Scala, я проходил его в самой первой версии, с тех пор он, конечно, успел измениться. Первые уроки этого курса основываются все на той же Scala by Example. Сейчас команда курса работает над его обновлением.

Если вы хотите поиграть скалой или дотти, не устанавливая IDE — добро пожаловать в Scastie.

Пример кода

Много примеров короткого кода на скале можно найти вот в этом обсуждении: Samples of Scala and Java code where Scala code looks simpler/has fewer lines? Вот один из них:

Scala

Java 8

Java 7

Поступь прогресса

На прощанье — шутка Кея Хорстмана «The March of Progress»

1980: C

1988: C++

1996: Java

2004: Java

2008: Scala and Groovy

2012: Scala 2.10

На этом я рискну опубликовать этот пост, но по-прежнему планирую его дописывать по результатам обсуждения с вами.

Источник

Советы начинающему скалисту

Часть 1. Функциональная

Эта статья (если быть до конца честным — набор заметок) посвящена ошибкам, которые совершают новички, ступая на путь Scala: не только джуниоры, но и умудренные опытом программисты с сединами в бороде. Многие из них до этого всегда работали лишь с императивными языками такими как C, C++ или Java, поэтому идиомы Scala оказываются для них непонятными и, более того, неочевидными. Поэтому я взял на себя смелость предостеречь новообращённых и рассказать им об их типичных ошибках — как совсем невинных, так и тех, что в мире Scala караются смертью.

Структура публикации:

Вместо вступления

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

Изначально планировалось написать эту статью на английском под звучным заглавием: «Scala for juniors and junior seniors». Но работать с русским текстом оказалось намного быстрее и удобнее, поэтому пришлось пожертвовать непереводимой игрой слов в названии. Просто имейте в виду, что статья рассчитана не только на чистых джуниоров, но и вообще на всех, кто начинает свое знакомство с языком Scala, какой бы большой опыт императивного программирования у них ни был.

Эта статья, по большому счету, представляет собой солянку из практических советов, в виду чего она лишена какой-либо сложной многоуровневой академичной структуры подачи материала. Вместо этого статья разбита на две части: в первой мы поговорим об идиомах функционального программирования в Scala, а во второй обсудим объектно-ориентированные идиомы. И начнем мы с наиболее недооцененной возможности Scala — псевдонимов типов (type aliases).

О псевдонимах типов

Однако добавление псевдонима для указателей на функцию-обработчик сигнала решает эту проблему:

В C++ без псевдонимов типов немыслимо статическое метапрограммирование, вдобавок, они позволяют не сойти с ума от полных имен шаблонных типов.

И этим дело не ограничивается: в Ocaml и SML вы также можете создавать
union-типы (типы-объединения):

Злоупотреблять данным средством определенно не стоит, однако есть ряд ситуаций, когда они действительно будут полезными:

Больше примеров вы можете найти здесь, просто промотайте чуть ниже до раздела с примерами.

Еще раз о присваивании

Присваивание в Scala — это не совсем то, к чему вы привыкли. Давайте рассмотрим эту операцию и увидим, что она не так проста, как может показаться на первый взгляд:

Мы только что разобрали кортеж на две переменные, однако кортежами дело не ограничивается:

Аналогичные операции мы можем провести и с case class :

Искушенный читатель уже заметил, что присваивание ведет себя точно также, как и сопоставление с образцом. Подобная функциональность реализована и в других языках, например, Python и Erlang. Используйте эту функциональность в первую очередь для распаковки структур данных. Но не злоупотребляйте: распаковка сложных структур данных очень сильно ухудшает читаемость.

Options

Многие из вас уже знакомы с типом Optional в Java 8. В Scala тип Option выполняет те же функции. А многим адептам Java этот тип может быть известным по гугловской библиотеке Guava.

Мы делаем проверку, и у нас, вроде бы, ничто не должно взорваться. Поверьте, в промышленном коде можно ошибиться, и в условии может оказаться совсем не то выражение, которое ожидалось. И даже тесты могут быть написаны неправильно. Не вами, так вашими предшественниками.

Вообще, в примере выше есть еще одна проблема. Ваш flow зависит от какого-то Boolean, и целостность его нарушается.

Некоторые разработчики имеют свойство подгонять тесты под уже «работающий» код. Правильнее и короче вышеприведенный код можно записать так:

Зачастую вам нужно трансформировать значение внутри Option, если оно вообще там имеется. Для этого существует метод map : он вынимает значение, преобразовывает его и упаковывает обратно в контейнер.

А иногда бывает и так:

Представим, что у нас есть некая функция которая возвращает Option :

тогда мы можем получить подобный результат:

Списки

Конечно, с вами этого никогда не случится, если вы проверяете лист на пустоту.

Вызов list.head и сотоварищей — один из самых лучших способов лишить себя
сна при работе со списками.

Извивайтесь гремучей змеей, делайте все возможное чтобы не использовать list.head и его друзей.

Немного о производительности

С точки зрения производительности для односвязного списка, коим является скаловский List (он же scala.collection.immutable.List ), наиболее дешевой операцией будет запись в начало списка, нежели в конец. Для записи в конец списка требуется пройти весь список до конца. Сложность записи в начало списка O(1), в конец O(n). Не забывайте об этом.

Option[List[?]]

А вот и нет! Если у нас в системе может возникнуть ошибка, нам определенно нужно знать какая. А для этого нам надо вернуть или Throwable или некий код. Позволяет ли Option нам это сделать? Не очень, однако Try и Either могут вам в этом помочь.

Option[A] => Option[B]

Кортежи

Наличие кортежей (tuples) — интересная особенность ряда функциональных (и не только) языков. В функциональных языках кортежи возможно использовать аналогично записям (records). Описываем кортеж с нужными данными и оборачиваем в новый тип, например, используя newtype в Haskell, в результате получая новый тип, об имплементации которого пользователю ничего не известно. В чисто функциональных языках без кортежей никуда: они позволяют замечательно представлять словари (dictionaries). Конволюция без них была бы менее наглядной.

В некоторых языках, например, Erlang, записи появились гораздо позже кортежей. Более того, записи (records) в Erlang так же являются кортежами.

Кортежи зачастую приходится использовать и пришедшим из объектно-ориентированных языков: им эти языковые средства в диковинку. Начнем с того, что их не именуют.

Если кортеж не используется как анонимная помойка, его следует именовать.

Для функционального стиля хорошим тоном считается использование упомянутых ранее псевдонимов для типов (type aliasing):

В будущем вы ссылаетесь на вполне себе именованные типы, и у вас не будет таких страшных вещей:

В Scala достучаться до элемента кортежа можно и по индексу. Например:

Особенно печально это выглядит при работе с коллекциями:

И так делать не надо. Конечно, есть исключительные случаи, когда подобного рода меры повышают читаемость:

Но в большинстве случаев синтаксис с подчеркиванием лучше не использовать. Про него вообще лучше забыть и не вспоминать. В Scala существуют более естественные способы обходиться без подобного синтаксиса.

Чтобы понять и разобраться, почему все именно так, давайте обратимся к функциональным языкам.

Вопрос: Уважаемая редакция, почему индексы списков в Scala начинаются с нуля, а кортежей — с единицы? Василий, Похабинск.

Ocaml

Erlang

Python
А вот вам пример не из функционального языка:

А теперь давайте применим полученные знания к Scala

Также кортежи можно использовать как анонимные помойки, и это порой оправданно. Дело в том, что во многих функциональных языках существует сопоставление с образцом на уровне сигнатур функций:

Схожий механизм находит применение в SML и Erlang. К сожалению, Scala такой возможности лишена. Поэтому кортежи можно использовать для группировки и последующего сопоставления с образцом:

Об использовании кортежей в Haskell и SML вы можете прочитать если перейдете по ссылкам.

О нижнем подчеркивании

Как вы уже могли заметить — эти значения не используются. Но это не тот случай, когда их надо затирать нижним подчеркиванием. Поверьте, скорость программирования не упирается в скорость набора текста: можно написать несколько лишних символов в угоду читаемости.

В заключение

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *