Top Banner
В поисках идеала Очередная белая презентация
32

Lift, play, akka, rails part1

Jun 30, 2015

Download

Documents

Eduard Antsupov
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Lift, play, akka, rails part1

В поисках идеалаОчередная белая презентация

Page 2: Lift, play, akka, rails part1

Про что?

● Веб-фреймворки○ Scala

■ Предыстория■ Язык■ Lift■ Play!■ Akka■ Netty

○ Ruby■ On Rails■ On JVM

Page 3: Lift, play, akka, rails part1

История (не ищите здесь PHP)

Page 4: Lift, play, akka, rails part1

Что они нам дали?

● REST● MVC и MVVM● ORM и ODM● Migrations● Templating● Caching● Ajax и Comet● Testing● Deployment● Components● Performance● Scalability● Community

Page 5: Lift, play, akka, rails part1

А ещё

● Производительность разработки● Понятность функционирования

приложения● Обучаемость● Поддерживаемость продукта● Рынок разработчиков

Page 6: Lift, play, akka, rails part1
Page 7: Lift, play, akka, rails part1

Тренды

● Browser Wars 3.0● Mobile First● SPA● Client frameworks● Cloud Infrastructure● NoSQL <-> SQL● Comet● REST API

○ Внешние API● Scalability● Performance● Big Data● HTML5

Page 9: Lift, play, akka, rails part1

Scala● Статическая строгая типизация

● Смешанная парадигма (ООП+Функциональная)

● JVM и .NET

● Сложная система типов

○ inference

● Scalable

○ explicit selftypes

○ abstract type members and generics

○ nested methods and classes

○ mixin composition using traits

○ dependency injection

Page 10: Lift, play, akka, rails part1

Scala

● Всё является объектами

● def - начало определения метода

● Определение переменных начинается с ключевых

слов var или val

■ val array: Array[String] = new Array(5)

● Переменные определяются как имя:тип

● Точки с запятой необязательны

Page 11: Lift, play, akka, rails part1

Scala - ООПclass Upper { def upper(strings: String*): Seq[String] = { strings.map((s:String) => s.toUpperCase()) }}

val up = new UpperConsole.println(up.upper("A", "First", "Scala", "Program"))

Page 12: Lift, play, akka, rails part1

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

Page 13: Lift, play, akka, rails part1

Scala - Functionaldef 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)

Page 14: Lift, play, akka, rails part1

Scala - Type Inferenceimport java.util.Map;import java.util.HashMap;...Map<Integer, String> intToStringMap = new HashMap<Integer, String>();

import java.util.Mapimport java.util.HashMap...val intToStringMap: Map[Integer, String] = new HashMap

import java.util.Mapimport java.util.HashMap...val intToStringMap2 = new HashMap[Integer, String]

Page 15: Lift, play, akka, rails part1

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.

Page 16: Lift, play, akka, rails part1

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 + ")" }}

Page 17: Lift, play, akka, rails part1

Scala - Actorspackage 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) } } } }}

Page 18: Lift, play, akka, rails part1

Scala - Actorsimport 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"

Page 19: Lift, play, akka, rails part1

Play! 2

● Full-stack MVC фреймворк● Асинхронный● Событийно-ориентированный● Stateless● Type-safe● Масштабируемый● Open Source● Поддерживает Scala и Java

Page 20: Lift, play, akka, rails part1

Play! 2

● Компиляция в реальном времени

● Интерактивная консоль

● Отображение ошибок в браузере и в консоли

● Db Evolutions ~= Миграции

● Компиляция всего

Page 21: Lift, play, akka, rails part1

Play! - Web Architecture

Page 22: Lift, play, akka, rails part1

Play! - Getting startedСпособ 1:

1. Скачать и распаковать Play

2. Добавить местоположение в переменную окружения

export PATH=$PATH:/relativePath/to/play

3. Скомандовать

play new myFirstApp

Page 23: Lift, play, akka, rails part1

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 projectsaddSbtPlugin("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 ) }

3. Скомандовать sbt

Page 24: Lift, play, akka, rails part1

Play! - Application layout

Page 25: Lift, play, akka, rails part1

Play! - Конфигурация роутов

Page 26: Lift, play, akka, rails part1

Play! - Валидация форм

Page 27: Lift, play, akka, rails part1

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

Page 28: Lift, play, akka, rails part1

Play! Templating

● Scalate (http://scalate.fusesource.org/)○ Движок шаблонизатора

○ Поддерживает форматы шаблонов

■ Scaml (== Haml)

■ Jade (nodeJS Template engine)

○ Шаблоны хорошо переносятся между разными

фреймворками

○ Независим от фреймворка

○ Хорошо документирован

Page 29: Lift, play, akka, rails part1

Play2 - Testing

● Specs○ specs2 (http://etorreborre.github.io/specs2/)

● Функциональное тестирование○ Свой движок (Coco)

○ Интеграция с Selenium WebDriver

■ https://github.com/FluentLenium/FluentLenium

Page 30: Lift, play, akka, rails part1

Play! - Clients libraries

● Поддерживает CoffeeScript

● Поддерживает LeSS

● Поддерживает Bootstrap

Page 31: Lift, play, akka, rails part1

Play! Akka

● Multicore, multiple nodes message passing● Software Transactional Memory (STM)● Non-blocking IO● Remote actors● Supervisor hierarchy

Page 32: Lift, play, akka, rails part1

Что дальше?

● Advanced Scala○ Akka tricks

● Lift framework

● Play! framework examples, tips&tricks

● Ruby○ Rails

○ Sinatra

● Итоги