SlideShare una empresa de Scribd logo
1 de 32
Descargar para leer sin conexión
В поисках идеала
Очередная белая презентация
Про что?
● Веб-фреймворки
○ Scala
■ Предыстория
■ Язык
■ Lift
■ Play!
■ Akka
■ Netty
○ Ruby
■ On Rails
■ On JVM
История (не ищите здесь PHP)
Что они нам дали?
● REST
● MVC и MVVM
● ORM и ODM
● Migrations
● Templating
● Caching
● Ajax и Comet
● Testing
● Deployment
● Components
● Performance
● Scalability
● Community
А ещё
● Производительность разработки
● Понятность функционирования
приложения
● Обучаемость
● Поддерживаемость продукта
● Рынок разработчиков
Тренды
● Browser Wars 3.0
● Mobile First
● SPA
● Client frameworks
● Cloud Infrastructure
● NoSQL <-> SQL
● Comet
● REST API
○ Внешние API
● Scalability
● Performance
● Big Data
● HTML5
Scala
● Martin Odersky
● 2003 год
● Erlang, Haskell, Java, Lisp, Smalltalk
● .scala
Scala
● Статическая строгая типизация
● Смешанная парадигма (ООП+Функциональная)
● JVM и .NET
● Сложная система типов
○ inference
● Scalable
○ explicit selftypes
○ abstract type members and generics
○ nested methods and classes
○ mixin composition using traits
○ dependency injection
Scala
● Всё является объектами
● def - начало определения метода
● Определение переменных начинается с ключевых
слов var или val
■ val array: Array[String] = new Array(5)
● Переменные определяются как имя:тип
● Точки с запятой необязательны
Scala - ООП
class Upper {
def upper(strings: String*): Seq[String] = {
strings.map((s:String) => s.toUpperCase())
}
}
val up = new Upper
Console.println(up.upper("A", "First", "Scala", "Program"))
Scala - Functional
// Функциональный литерал
(s:String) => s.toUpperCase()
// Пример применения
object Upper {
def upper(strings: String*) = strings.map(_.toUpperCase())
}
println(Upper.upper("A", "First", "Scala", "Program"))
// _ - это Placeholder-индикатор, можно представить как анонимную
переменную, которая
// принимает в качестве значения строки из map'a
Scala - Functional
def factorial(i: Int): Int = {
def fact(i: Int, accumulator: Int): Int = {
if (i <= 1)
accumulator
else
fact(i - 1, i * accumulator)
}
fact(i, 1)
}
def countTo(n: Int):Unit = {
def count(i: Int): Unit = {
if (i <= n) {
println(i)
count(i + 1)
}
}
count(1)
}
countTo(5)
Scala - Type Inference
import java.util.Map;
import java.util.HashMap;
...
Map<Integer, String> intToStringMap = new HashMap<Integer, String>();
import java.util.Map
import java.util.HashMap
...
val intToStringMap: Map[Integer, String] = new HashMap
import java.util.Map
import java.util.HashMap
...
val intToStringMap2 = new HashMap[Integer, String]
Scala - Type Inference
Когда нужно явно указать тип
1. При объявлении переменной, если при этом ей не присваивается
значение. (e.g., val name = "Programming Scala")
2. Для любого параметра метода. (e.g., def deposit(amount: Money)…)
3. Для возвращаемых значений метода в случае:
a. Когда вы явно вызываете return.
b. Когда метод рекурсивен.
c. При перегрузке метода, в случае если один вызывает другой.
d. В случае, когда возвращаемый тип является более общим, чем
вам нужно, e.g., Any.
Scala - Actors/package shapes {
class Point(val x: Double, val y: Double) {
override def toString() = "Point(" + x + "," + y + ")"
}
abstract class Shape() {
def draw(): Unit
}
class Circle(val center: Point, val radius: Double) extends Shape {
def draw() = println("Circle.draw: " + this)
override def toString() = "Circle(" + center + "," + radius + ")"
}
class Rectangle(val lowerLeft: Point, val height: Double, val width: Double)
extends Shape {
def draw() = println("Rectangle.draw: " + this)
override def toString() =
"Rectangle(" + lowerLeft + "," + height + "," + width + ")"
}
class Triangle(val point1: Point, val point2: Point, val point3: Point)
extends Shape {
def draw() = println("Triangle.draw: " + this)
override def toString() =
"Triangle(" + point1 + "," + point2 + "," + point3 + ")"
}
}
Scala - Actors
package shapes {
import scala.actors._
import scala.actors.Actor._
object ShapeDrawingActor extends Actor {
def act() {
loop {
receive {
case s: Shape => s.draw()
case "exit" => println("exiting..."); exit
case x: Any => println("Error: Unknown message! " + x)
}
}
}
}
}
Scala - Actors
import shapes._
ShapeDrawingActor.start()
ShapeDrawingActor ! new Circle(new Point(0.0,0.0), 1.0)
ShapeDrawingActor ! new Rectangle(new Point(0.0,0.0), 2, 5)
ShapeDrawingActor ! new Triangle(new Point(0.0,0.0),
new Point(1.0,0.0),
new Point(0.0,1.0))
ShapeDrawingActor ! 3.14159
ShapeDrawingActor ! "exit"
Play! 2
● Full-stack MVC фреймворк
● Асинхронный
● Событийно-ориентированный
● Stateless
● Type-safe
● Масштабируемый
● Open Source
● Поддерживает Scala и Java
Play! 2
● Компиляция в реальном времени
● Интерактивная консоль
● Отображение ошибок в браузере и в консоли
● Db Evolutions ~= Миграции
● Компиляция всего
Play! - Web Architecture
Play! - Getting started
Способ 1:
1. Скачать и распаковать Play
2. Добавить местоположение в переменную окружения
export PATH=$PATH:/relativePath/to/play
3. Скомандовать
play new myFirstApp
Play! - Getting started
Способ 2 (предпочтительный):
1. Установить sbt (Scala Build tool) и добавить в project/plugins.sbt
// The Typesafe repository
resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/"
// Use the Play sbt plugin for Play projects
addSbtPlugin("play" % "sbt-plugin" % "2.1.0")
import sbt._
import Keys._
import play.Project._
2. В project/Build.scala добавить
object ApplicationBuild extends Build {
val appName = "My first application"
val appVersion = "1.0"
val appDependencies = Nil
val main = play.Project(
appName, appVersion, appDependencies
)
}
Play! - Application layout
Play! - Конфигурация роутов
Play! - Валидация форм
Play! and Databases
● Type-safe ORM
○ Slick (http://slick.typesafe.com/)
■ Стабильная версия
■ Начиная с Play! 2.1
■ Хорошая документация
● ODM
○ ReactiveMongo (http://reactivemongo.org/)
○ Примеры приложений
■ Demo app: https://github.
com/sgodbillon/reactivemongo-demo-app
■ Tailable cursor app: https://github.
com/sgodbillon/reactivemongo-tailablecursor-demo
Play! Templating
● Scalate (http://scalate.fusesource.org/)
○ Движок шаблонизатора
○ Поддерживает форматы шаблонов
■ Scaml (== Haml)
■ Jade (nodeJS Template engine)
○ Шаблоны хорошо переносятся между разными
фреймворками
○ Независим от фреймворка
○ Хорошо документирован
Play2 - Testing
● Specs
○ specs2 (http://etorreborre.github.io/specs2/)
● Функциональное тестирование
○ Свой движок (Coco)
○ Интеграция с Selenium WebDriver
■ https://github.com/FluentLenium/FluentLenium
Play! - Clients libraries
● Поддерживает CoffeeScript
● Поддерживает LeSS
● Поддерживает Bootstrap
Play! Akka
● Multicore, multiple nodes message passing
● Software Transactional Memory (STM)
● Non-blocking IO
● Remote actors
● Supervisor hierarchy
Что дальше?
● Advanced Scala
○ Akka tricks
● Lift framework
● Play! framework examples, tips&tricks
● Ruby
○ Rails
○ Sinatra
● Итоги

Más contenido relacionado

La actualidad más candente

Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Sergey Platonov
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Sergey Platonov
 
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)Ontico
 
Коротко о React.js
Коротко о React.jsКоротко о React.js
Коротко о React.jsMad Devs
 
Web весна 2013 лекция 9
Web весна 2013 лекция 9Web весна 2013 лекция 9
Web весна 2013 лекция 9Technopark
 
Windows Azure and node js
Windows Azure and node jsWindows Azure and node js
Windows Azure and node jsAlex Tumanoff
 
Григорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммыГригорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммыYandex
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Yauheni Akhotnikau
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о BoostSergey Platonov
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMSergey Platonov
 
Курс Java-2016. Занятие 04 (часть 1). Еще немного про Generics
Курс Java-2016. Занятие 04 (часть 1). Еще немного про GenericsКурс Java-2016. Занятие 04 (часть 1). Еще немного про Generics
Курс Java-2016. Занятие 04 (часть 1). Еще немного про Generics7bits
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй этоRoman Dvornov
 
Курс Java-2016. Занятие 08. Итераторы, многопоточность
Курс Java-2016. Занятие 08. Итераторы, многопоточностьКурс Java-2016. Занятие 08. Итераторы, многопоточность
Курс Java-2016. Занятие 08. Итераторы, многопоточность7bits
 
Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Yauheni Akhotnikau
 
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаSergey Platonov
 

La actualidad más candente (20)

Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++
 
TeaVM: dead code elimination and devirtualization
TeaVM: dead code elimination and devirtualizationTeaVM: dead code elimination and devirtualization
TeaVM: dead code elimination and devirtualization
 
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
 
Коротко о React.js
Коротко о React.jsКоротко о React.js
Коротко о React.js
 
Web весна 2013 лекция 9
Web весна 2013 лекция 9Web весна 2013 лекция 9
Web весна 2013 лекция 9
 
Windows Azure and node js
Windows Azure and node jsWindows Azure and node js
Windows Azure and node js
 
Григорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммыГригорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммы
 
JRebel
JRebelJRebel
JRebel
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о Boost
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
 
Курс Java-2016. Занятие 04 (часть 1). Еще немного про Generics
Курс Java-2016. Занятие 04 (часть 1). Еще немного про GenericsКурс Java-2016. Занятие 04 (часть 1). Еще немного про Generics
Курс Java-2016. Занятие 04 (часть 1). Еще немного про Generics
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
Курс Java-2016. Занятие 08. Итераторы, многопоточность
Курс Java-2016. Занятие 08. Итераторы, многопоточностьКурс Java-2016. Занятие 08. Итераторы, многопоточность
Курс Java-2016. Занятие 08. Итераторы, многопоточность
 
Vba 04
Vba 04Vba 04
Vba 04
 
Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++
 
Intro to Swift techitout
Intro to Swift techitoutIntro to Swift techitout
Intro to Swift techitout
 
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кода
 

Similar a Lift, play, akka, rails part1

Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPITimur Shemsedinov
 
NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript Dmytro Mindra
 
Ciklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScriptCiklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScriptDmytro Mindra
 
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...Stfalcon Meetups
 
WebCamp2016:Front-End.Максим Климишин.Теоретические и практические концепции ...
WebCamp2016:Front-End.Максим Климишин.Теоретические и практические концепции ...WebCamp2016:Front-End.Максим Климишин.Теоретические и практические концепции ...
WebCamp2016:Front-End.Максим Климишин.Теоретические и практические концепции ...WebCamp
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?Vasil Remeniuk
 
Память в Java. Garbage Collector
Память в Java. Garbage CollectorПамять в Java. Garbage Collector
Память в Java. Garbage CollectorOlexandra Dmytrenko
 
Как выглядит современный фронтенд
Как выглядит современный фронтендКак выглядит современный фронтенд
Как выглядит современный фронтендTimophy Chaptykov
 
Scala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentScala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentAnton Kirillov
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesPlatonov Sergey
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesPlatonov Sergey
 
Scala: что, как и зачем?
Scala: что, как и зачем?Scala: что, как и зачем?
Scala: что, как и зачем?Roman Timushev
 
JavaScript & modern scala backend
JavaScript & modern scala backendJavaScript & modern scala backend
JavaScript & modern scala backendGeeksLab Odessa
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке СиPositive Development User Group
 
Formal verification of C code
Formal verification of C codeFormal verification of C code
Formal verification of C codeDenis Efremov
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке СиPositive Hack Days
 

Similar a Lift, play, akka, rails part1 (20)

Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPI
 
NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript
 
Ciklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScriptCiklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScript
 
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
 
WebCamp2016:Front-End.Максим Климишин.Теоретические и практические концепции ...
WebCamp2016:Front-End.Максим Климишин.Теоретические и практические концепции ...WebCamp2016:Front-End.Максим Климишин.Теоретические и практические концепции ...
WebCamp2016:Front-End.Максим Климишин.Теоретические и практические концепции ...
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
Память в Java. Garbage Collector
Память в Java. Garbage CollectorПамять в Java. Garbage Collector
Память в Java. Garbage Collector
 
Как выглядит современный фронтенд
Как выглядит современный фронтендКак выглядит современный фронтенд
Как выглядит современный фронтенд
 
Javascript 1
Javascript 1Javascript 1
Javascript 1
 
Scala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentScala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application Development
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
 
Scala for android
Scala for androidScala for android
Scala for android
 
Scala: что, как и зачем?
Scala: что, как и зачем?Scala: что, как и зачем?
Scala: что, как и зачем?
 
JavaScript & modern scala backend
JavaScript & modern scala backendJavaScript & modern scala backend
JavaScript & modern scala backend
 
Scorex framework
Scorex frameworkScorex framework
Scorex framework
 
In the sun.misc.Unsafe bowels
In the sun.misc.Unsafe bowelsIn the sun.misc.Unsafe bowels
In the sun.misc.Unsafe bowels
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке Си
 
Formal verification of C code
Formal verification of C codeFormal verification of C code
Formal verification of C code
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке Си
 

Más de Eduard Antsupov (8)

Backbone.js
Backbone.jsBackbone.js
Backbone.js
 
SuSE Studio
SuSE StudioSuSE Studio
SuSE Studio
 
Dev collaboration
Dev collaborationDev collaboration
Dev collaboration
 
Multiplayer
MultiplayerMultiplayer
Multiplayer
 
Nosql and Mongodb
Nosql and MongodbNosql and Mongodb
Nosql and Mongodb
 
Linux Kernel Processes
Linux Kernel ProcessesLinux Kernel Processes
Linux Kernel Processes
 
Smalltalk
SmalltalkSmalltalk
Smalltalk
 
Lovely scrum
Lovely scrumLovely scrum
Lovely scrum
 

Lift, play, akka, rails part1

  • 1. В поисках идеала Очередная белая презентация
  • 2. Про что? ● Веб-фреймворки ○ Scala ■ Предыстория ■ Язык ■ Lift ■ Play! ■ Akka ■ Netty ○ Ruby ■ On Rails ■ On JVM
  • 4. Что они нам дали? ● REST ● MVC и MVVM ● ORM и ODM ● Migrations ● Templating ● Caching ● Ajax и Comet ● Testing ● Deployment ● Components ● Performance ● Scalability ● Community
  • 5. А ещё ● Производительность разработки ● Понятность функционирования приложения ● Обучаемость ● Поддерживаемость продукта ● Рынок разработчиков
  • 6.
  • 7. Тренды ● Browser Wars 3.0 ● Mobile First ● SPA ● Client frameworks ● Cloud Infrastructure ● NoSQL <-> SQL ● Comet ● REST API ○ Внешние API ● Scalability ● Performance ● Big Data ● HTML5
  • 8. Scala ● Martin Odersky ● 2003 год ● Erlang, Haskell, Java, Lisp, Smalltalk ● .scala
  • 9. Scala ● Статическая строгая типизация ● Смешанная парадигма (ООП+Функциональная) ● JVM и .NET ● Сложная система типов ○ inference ● Scalable ○ explicit selftypes ○ abstract type members and generics ○ nested methods and classes ○ mixin composition using traits ○ dependency injection
  • 10. Scala ● Всё является объектами ● def - начало определения метода ● Определение переменных начинается с ключевых слов var или val ■ val array: Array[String] = new Array(5) ● Переменные определяются как имя:тип ● Точки с запятой необязательны
  • 11. Scala - ООП class Upper { def upper(strings: String*): Seq[String] = { strings.map((s:String) => s.toUpperCase()) } } val up = new Upper Console.println(up.upper("A", "First", "Scala", "Program"))
  • 12. Scala - Functional // Функциональный литерал (s:String) => s.toUpperCase() // Пример применения object Upper { def upper(strings: String*) = strings.map(_.toUpperCase()) } println(Upper.upper("A", "First", "Scala", "Program")) // _ - это Placeholder-индикатор, можно представить как анонимную переменную, которая // принимает в качестве значения строки из map'a
  • 13. Scala - Functional def factorial(i: Int): Int = { def fact(i: Int, accumulator: Int): Int = { if (i <= 1) accumulator else fact(i - 1, i * accumulator) } fact(i, 1) } def countTo(n: Int):Unit = { def count(i: Int): Unit = { if (i <= n) { println(i) count(i + 1) } } count(1) } countTo(5)
  • 14. Scala - Type Inference import java.util.Map; import java.util.HashMap; ... Map<Integer, String> intToStringMap = new HashMap<Integer, String>(); import java.util.Map import java.util.HashMap ... val intToStringMap: Map[Integer, String] = new HashMap import java.util.Map import java.util.HashMap ... val intToStringMap2 = new HashMap[Integer, String]
  • 15. Scala - Type Inference Когда нужно явно указать тип 1. При объявлении переменной, если при этом ей не присваивается значение. (e.g., val name = "Programming Scala") 2. Для любого параметра метода. (e.g., def deposit(amount: Money)…) 3. Для возвращаемых значений метода в случае: a. Когда вы явно вызываете return. b. Когда метод рекурсивен. c. При перегрузке метода, в случае если один вызывает другой. d. В случае, когда возвращаемый тип является более общим, чем вам нужно, e.g., Any.
  • 16. Scala - Actors/package shapes { class Point(val x: Double, val y: Double) { override def toString() = "Point(" + x + "," + y + ")" } abstract class Shape() { def draw(): Unit } class Circle(val center: Point, val radius: Double) extends Shape { def draw() = println("Circle.draw: " + this) override def toString() = "Circle(" + center + "," + radius + ")" } class Rectangle(val lowerLeft: Point, val height: Double, val width: Double) extends Shape { def draw() = println("Rectangle.draw: " + this) override def toString() = "Rectangle(" + lowerLeft + "," + height + "," + width + ")" } class Triangle(val point1: Point, val point2: Point, val point3: Point) extends Shape { def draw() = println("Triangle.draw: " + this) override def toString() = "Triangle(" + point1 + "," + point2 + "," + point3 + ")" } }
  • 17. Scala - Actors package shapes { import scala.actors._ import scala.actors.Actor._ object ShapeDrawingActor extends Actor { def act() { loop { receive { case s: Shape => s.draw() case "exit" => println("exiting..."); exit case x: Any => println("Error: Unknown message! " + x) } } } } }
  • 18. Scala - Actors import shapes._ ShapeDrawingActor.start() ShapeDrawingActor ! new Circle(new Point(0.0,0.0), 1.0) ShapeDrawingActor ! new Rectangle(new Point(0.0,0.0), 2, 5) ShapeDrawingActor ! new Triangle(new Point(0.0,0.0), new Point(1.0,0.0), new Point(0.0,1.0)) ShapeDrawingActor ! 3.14159 ShapeDrawingActor ! "exit"
  • 19. Play! 2 ● Full-stack MVC фреймворк ● Асинхронный ● Событийно-ориентированный ● Stateless ● Type-safe ● Масштабируемый ● Open Source ● Поддерживает Scala и Java
  • 20. Play! 2 ● Компиляция в реальном времени ● Интерактивная консоль ● Отображение ошибок в браузере и в консоли ● Db Evolutions ~= Миграции ● Компиляция всего
  • 21. Play! - Web Architecture
  • 22. Play! - Getting started Способ 1: 1. Скачать и распаковать Play 2. Добавить местоположение в переменную окружения export PATH=$PATH:/relativePath/to/play 3. Скомандовать play new myFirstApp
  • 23. Play! - Getting started Способ 2 (предпочтительный): 1. Установить sbt (Scala Build tool) и добавить в project/plugins.sbt // The Typesafe repository resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/" // Use the Play sbt plugin for Play projects addSbtPlugin("play" % "sbt-plugin" % "2.1.0") import sbt._ import Keys._ import play.Project._ 2. В project/Build.scala добавить object ApplicationBuild extends Build { val appName = "My first application" val appVersion = "1.0" val appDependencies = Nil val main = play.Project( appName, appVersion, appDependencies ) }
  • 27. Play! and Databases ● Type-safe ORM ○ Slick (http://slick.typesafe.com/) ■ Стабильная версия ■ Начиная с Play! 2.1 ■ Хорошая документация ● ODM ○ ReactiveMongo (http://reactivemongo.org/) ○ Примеры приложений ■ Demo app: https://github. com/sgodbillon/reactivemongo-demo-app ■ Tailable cursor app: https://github. com/sgodbillon/reactivemongo-tailablecursor-demo
  • 28. Play! Templating ● Scalate (http://scalate.fusesource.org/) ○ Движок шаблонизатора ○ Поддерживает форматы шаблонов ■ Scaml (== Haml) ■ Jade (nodeJS Template engine) ○ Шаблоны хорошо переносятся между разными фреймворками ○ Независим от фреймворка ○ Хорошо документирован
  • 29. Play2 - Testing ● Specs ○ specs2 (http://etorreborre.github.io/specs2/) ● Функциональное тестирование ○ Свой движок (Coco) ○ Интеграция с Selenium WebDriver ■ https://github.com/FluentLenium/FluentLenium
  • 30. Play! - Clients libraries ● Поддерживает CoffeeScript ● Поддерживает LeSS ● Поддерживает Bootstrap
  • 31. Play! Akka ● Multicore, multiple nodes message passing ● Software Transactional Memory (STM) ● Non-blocking IO ● Remote actors ● Supervisor hierarchy
  • 32. Что дальше? ● Advanced Scala ○ Akka tricks ● Lift framework ● Play! framework examples, tips&tricks ● Ruby ○ Rails ○ Sinatra ● Итоги