Giter Site home page Giter Site logo

cis-scala's Introduction

Курс по Scala кафедры корпоративных информационных систем МФТИ

Контакты

  • Канал в slack (осень 2020): #scala_fall2020
  • Telegram для контактов: @valentiay
  • Почта для домашек: [email protected]

Запуск проекта и тестирование домашних заданий

Для сборки проекта используется sbt. Ниже несколько полезных команд.

# Перезагрузить конфигурацию проекта, если *.sbt-файлы, описывающие билд изменились
sbt reload

# Собрать проект (без тестов)
sbt compile

# Запустить конкретный Main-класс
sbt "runMain seminars.seminar1.HelloWorld1"

# Запустить все тесты
sbt test

# Запустить тесты для конкретного пакета (например, пакета с тестами на 1 дз)
sbt testOnly homeworks.homework1.*

# Запустить тесты на конкретный клас (например, на первую задачу первого дз)
sbt testOnly homeworks.homework1.task1Test

Также слайды и тесты можно запустить с помощью Intellij Idea с scala-плагином.

Линтер

В проекте подключен линтер WartRemover. При использовании одного из инструментов ниже, проект не соберется. В большинстве случаев нужно отрефакторить код так, чтобы этот инструмент не использовался. Отключить ошибку можно аннотацией @SuppressWarnings(Array("org.wartremover.warts.All")), перед этим лучше уточнить в чате, стоит ли так делать. Если с рефакторингом возникают проблемы, тоже можно попросить помощи в чате.

AsInstanceOf

Почти всегда тип можно привести без использования кастов. Для чисел можно использовать встроенные методы .toChar, .toInt, toLong и т.п.

Для апкаста можно указывать типы в функциях, например так:

import scala.util.Random

def nextLong: Long = Random.nextInt

При работе с эффектами можно использовать метод функтора .widen:

import cats.effect.IO
import cats.syntax.applicative._
import cats.syntax.functor._

val a: IO[Option[String]] = None.pure[IO].widen

Вместо даункастов нужно использовать паттерн-матчинг.

.asInstanceOf может использоваться для некоторых оптимизаций, например, newtype.

MutableDataStructures

В функциональном программировании идиоматично использовать неизменяемые струтуры данных. Это позволяет избежать многих ошибок и писать более читаемый код. Подробнее здесь. Почти все задачи решаются с помощью методов .map, .filter, .foldLeft и т.п. Изменияемые структуры данных используют для повышения производительности в некторых случаях, но в нашем курсе таких задач нет.

Null

Использование null ведет к непредсказуемым исключениям. Вместо него нужно использовать Option.

Return

При использовании return появляются неожиданные точки выхода из программы, что снижает читаемость кода. Значения должны возвращаться в конце блока.

Throw

Использование исключений, как и return дает неожиданные точки выхода. Вместо исключений нужно использовать Option, Either или средства библиотеки эффектов.

Var

Аналогично MutableDataStructures

While

Чаще всего ведет к использованию изменяемых переменных и коллекций. Вместо while нужно использовать хвостовую рекурсию или .foldLeft и подобные.

Пример кода, компиляция которого упадет со всеми возможными ошибками линтера

def foo: Int = {
  val as = scala.collection.mutable.ListBuffer.empty[Int]
  as += 1
  as += null.asInstanceOf[Int]
  as += 2

  var i = 0
  while (i < as.length) {
   val a = as(i)
    if (a == null) throw new NullPointerException("Unexpected null!")
    if (a % 2 == 0) return a
    i += 1
  }
  0
}

cis-scala's People

Contributors

valentiay avatar

Stargazers

 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.