Это функциональный, объектно-ориентированный язык, который объединяет всё, о чём вы даже не подозревали, и даже больше! В этой статье мы познакомим вас со Scala и предоставим инструменты для создания приложения на Scala, которое сможет отправлять SMS-сообщения через Twilio прямо из командной строки.
Scala — это язык для JVM, известный сочетанием объектно-ориентированного и функционального стилей программирования. За последние пятнадцать лет он завоевал популярность в различных областях: от веб-программирования до инженерии данных и распределённых систем. Такие компании, как Twitter, Stripe и Twilio, построили на нём крупные системы.
Давайте начнём. Вот что вам понадобится:
— Java JDK 8
— SBT (я использую версию 0.13.6)
— Текстовый редактор (рекомендую использовать IDE, например IntelliJ — её Community Edition бесплатна и полностью поддерживает Scala)
— Аккаунт Twilio (вы можете зарегистрироваться бесплатно, если его ещё нет)
— Номер телефона Twilio, который может отправлять и принимать SMS
Проверьте, установлены ли у вас Java и SBT:
После установки SBT вы можете запустить Scala REPL с помощью команды `sbt console`. Попробуйте сделать это прямо сейчас. Вот хорошая шпаргалка для работы в REPL. Обратите внимание, что каждое значение в Scala имеет возвращаемый тип, и эти типы могут быть выведены автоматически:
Рекомендую ознакомиться с «Экскурсией по Scala» для отличного введения в синтаксис языка.
SBT полезен не только для консоли — это инструмент, который управляет зависимостями, выполняет проект и запускает тесты. В прошлом году в него была добавлена удобная функция, позволяющая легко создавать новые проекты из шаблонов. Структура каталогов не строго регламентирована, но существуют лучшие практики организации файлов, и шаблоны проектов помогут вам настроить это.
Подробнее о шаблонах SBT можно прочитать здесь. Я создал шаблон для нашего проекта, так что перейдите в терминал и введите следующую команду. Когда вас попросят указать название проекта, вы можете назвать его как угодно — я назвал свой `hello`.
После того как вы перейдёте в каталог проекта с помощью команды `cd`, вы сможете запустить проект:
Первый запуск займёт некоторое время, так как будут загружены все зависимости. После завершения загрузки вас попросят ввести своё имя:
Отлично! Вы только что создали свой первый проект на Scala! Мы будем использовать эту основу для дальнейшей разработки приложения.
Теперь, когда у вас есть проект «Hello World» на Scala, вы можете расширить его, чтобы отправлять SMS-сообщения. Для отправки сообщений мы будем использовать API Twilio. У Twilio нет специального SDK для Scala, но нам это и не нужно — Java SDK работает отлично.
Чтобы добавить зависимость, отредактируйте файл `build.sbt`, который находится в корне вашего проекта. Вы увидите раздел `libraryDependencies`, в котором уже есть библиотека `config`. Добавьте ещё одну строку для библиотеки Twilio, которую я нашёл на вкладке SBT в Maven.
Прежде чем использовать библиотеку Twilio, необходимо настроить SDK с вашими учётными данными. Зарегистрируйтесь в Twilio, если у вас ещё нет аккаунта, и возьмите свой Account SID и Auth Token на странице twilio.com/console. Сохраните учётные данные как переменные окружения и замените конфигурацию-заглушку в файле `src/main/resources/application.conf` следующим кодом.
Во время добавления кода вы можете запускать команду `sbt ~compile`. Символ `~` указывает SBT на необходимость инкрементальной компиляции проекта при каждом сохранении файла, что поможет быстро обнаруживать ошибки в программе.
В файле `src/main/scala/Main.scala` мы можем заменить пример с приветствием на код для работы с Twilio. Сначала нам понадобятся необходимые импорты для библиотеки Twilio. Их можно разместить в начале файла вместе с уже существующими импортами.
Теперь вы можете инициализировать клиент Twilio с помощью Account SID и Auth Token. Поскольку у нас уже определена конфигурация, вы можете получить учётные данные из неё.
Как и в Java, Scala является языком с сильной типизацией. Сигнатура метода предоставляет документацию по параметрам, и я часто обращаюсь к исходному коду за этой информацией. Как видно ниже, класс MessageCreator требует два объекта `PhoneNumber` и одну строку `String`.
Наш номер `from` хранится в переменной конфигурации, поэтому мы можем взять его и обернуть в тип данных `PhoneNumber`, предоставляемый Twilio. Пока давайте жёстко закодируем номер `to` и текст сообщения `body`:
Теперь, когда у нас есть все необходимые входные данные, мы можем использовать их для создания и отправки сообщения.
На этом этапе мы можем попробовать запустить нашу программу из командной строки с помощью команды `sbt run` — сделайте это сейчас, и вы должны получить сообщение.
Давайте немного улучшим наш дизайн, чтобы не зависеть от жёстко закодированных значений. Для приёма пользовательского ввода в Scala мы будем использовать метод `readLine` из стандартной библиотеки ввода-вывода. Метод возвращает строку `String`, и мы можем сохранить её в переменной, например:
Попробуйте снова запустить программу и отправьте себе и друзьям разные сообщения.
Давайте улучшим наш отправитель сообщений, добавив более качественную обработку ошибок. Поскольку мы используем Java SDK, большинство методов будут выбрасывать исключения при возникновении ошибок. Например, вот что произойдёт, если мы попытаемся отправить сообщение на неверный номер:
В Scala существует множество способов обработки таких ошибок, и мы будем использовать `Try` и сопоставление с образцом для их перехвата. В нашей программе исключения времени выполнения могут возникать в методе `Message.creator(to, from, body).create()`, и именно на этом мы сосредоточимся при обработке ошибок.
Сначала импортируем необходимые утилиты.
Оберните создание сообщения в `Try` — этот тип либо вернёт успешно вычисленное значение (`Success`), либо приведёт к исключению (`Failure`).
Теперь, если вы попытаетесь отправить сообщение на неверный номер, вы получите более дружелюбное сообщение об ошибке, которое можно настроить.
Здорово!
Поздравляем! Вы успешно создали приложение на Scala, которое может отправлять пользовательские SMS-сообщения. Существует множество способов расширить этот проект, например, легко добавить эмодзи!
Есть много других причин продолжать изучать возможности Scala. Возможно, вы хотите использовать Scala, чтобы воспользоваться экосистемой JVM с менее громоздким кодом. Или вас интересует обработка терабайтов данных с помощью Apache Spark — популярной библиотеки, написанной на Scala и имеющей API для Scala. Какими бы ни были ваши потребности, сообщество Scala выросло настолько, что поддерживает широкий спектр приложений, создаваемых разработчиками.
Готовую версию этого приложения можно найти на моём GitHub: https://github.com/robinske/hello-twilio-scala. Надеюсь, это вдохновит вас узнать больше о Scala, и если вы ищете дополнительные ресурсы, могу порекомендовать следующие:
— Курсы по Scala на Coursera — узнайте о функциональном программировании, конкурентности, больших данных и многом другом в курсах, разработанных Scala Center.
— Упражнения по Scala — проверьте свои знания с помощью вводных головоломок в браузере для Scala и популярных библиотек Scala.
— Электронные книги по Scala — читайте бесплатные книги от Underscore.io, консалтинговой компании по Scala.
Для получения дополнительной информации о языке и его возможностях, включая более подробный анализ причин использования (и неиспользования) Scala, я рассказывал об этом на конференции GOTO Chicago в прошлом году. Если у вас есть вопросы или комментарии по Scala, я всегда рад обратной связи! Удачи в освоении языка, и я с нетерпением жду, что вы создадите.