SlideShare a Scribd company logo
Groovy и Grails 
быстро и обо всём
Groovy, http://groovy.codehaus.org/ 
● Работает в JVM 
● Статическая и динамическая типизация 
● Совместим с Java и всеми библиотеками 
● Динамический язык 
● Может использоваться как скриптовый 
● Низкий порог вхождения 
● Синтаксический сахар :-)
Две программы 
println “Hello World” import java.io.*; 
public class HelloWorld { 
public static void 
main(String[] args) { 
System.out.println("Hello 
World"); 
} 
}
import java.io.*; 
import java.util.*; 
public class HelloWorld { 
public static List<Integer> kvadrat(List<Integer> x) { 
List<Integer> y = new ArrayList<>(x.size()); 
for (Integer n : x) { 
y.add( (int)Math.round(Math.pow(n, 2)) ); 
} 
return y; 
} 
public static void main(String[] args) { 
List<Integer> x = new ArrayList<>(); 
x.add(1); x.add(2); x.add(3); x.add(4); x.add(5); 
List<Integer> y = kvadrat(x); 
for (Integer n : y) { 
System.out.println(n); 
} 
} 
}
public static List<Integer> kvadrat(List<Integer> x) { 
List<Integer> y = new ArrayList<>(x.size()); 
for (Integer n : x) { 
y.add((int) Math.round(Math.pow(n, 2))); 
} 
return y; 
} 
List<Integer> x = new ArrayList<>(); 
x.add(1); x.add(2); x.add(3); x.add(4); x.add(5); 
List<Integer> y = kvadrat(x); 
for (Integer n : y) { 
System.out.println(n); 
}
// Инициализируем x в одну строчку, используем power 
public static List<Integer> kvadrat(List<Integer> x) { 
List<Integer> y = new ArrayList<>(x.size()); 
for (Integer n : x) { 
y.add(n.power(2)); 
} 
return y; 
} 
List<Integer> x = [1, 2, 3, 4, 5]; 
List<Integer> y = kvadrat(x); 
for (Integer n : y) { 
System.out.println(n); 
}
// Используем collect. Groovy отлично работает со списками 
public static List<Integer> kvadrat(List<Integer> x) { 
List<Integer> y = x.collect({ n -> n.power(2) }); 
return y; 
} 
List<Integer> x = [1, 2, 3, 4, 5]; 
List<Integer> y = kvadrat(x); 
for (Integer n : y) { 
System.out.println(n); 
}
// Избавимся от лишних переменных. В Java мы не могли 
// без них обойтись, а в Groovy - запросто 
public static List<Integer> kvadrat(List<Integer> x) { 
return x.collect({ n -> n.power(2) }); 
} 
List<Integer> y = kvadrat([1, 2, 3, 4, 5]); 
for (Integer n : y) { 
System.out.println(n); 
}
// Грувификация: убрали типы, точки с запятыми, return. 
// Перешли на .each 
def kvadrat(x) { x.collect { n -> n.power(2) } } 
def y = kvadrat([1, 2, 3, 4, 5]) 
y.each { n -> 
System.out.println(n) 
}
// Теперь и переменная y лишняя :) 
def kvadrat(x) { x.collect { n -> n.power(2) } } 
kvadrat([1, 2, 3, 4, 5]).each { n -> 
System.out.println(n) 
}
// Переменная n тоже, используем служебную it 
def kvadrat(x) { x.collect { it.power(2) } } 
kvadrat([1, 2, 3, 4, 5]).each { println it }
// Метод kvadrat в общем-то тоже необязателен :) 
[1, 2, 3, 4, 5].collect { it.power(2) }.each { println it }
Две программы 
[1, 2, 3, 4, 5].collect { 
it.power(2) }.each { 
println it 
} 
import java.io.*; 
import java.util.*; 
public class HelloWorld { 
public static List<Integer> kvadrat(List<Integer> x) { 
List<Integer> y = new ArrayList<>(x.size()); 
for (Integer n : x) { 
y.add( (int)Math.round(Math.pow(n, 2)) ); 
} 
return y; 
} 
public static void main(String[] args) { 
List<Integer> x = new ArrayList<>(); 
x.add(1); x.add(2); x.add(3); x.add(4); x.add(5); 
List<Integer> y = kvadrat(x); 
for (Integer n : y) { 
System.out.println(n); 
} 
} 
}
Немного метапрограммирования 
final a = [1, 2, 3, 4, 5], b = [2, 3, 4, 5, 6] 
List.metaClass.kvadrat = { delegate.collect { it.power(2) } } 
println "${a.kvadrat()} ${b.kvadrat()}" 
import javax.servlet.http.HttpServletRequest 
HttpServletRequest.metaClass.getRealIp = { 
delegate.getHeader('X-Real-Ip') ?: delegate.remoteAddr }
Миксины 
class Eat { def eat() { println "I ate" } } 
class Drink { def drink() { println "I drinked" } } 
class Animal {}; class Mammal extends Animal {} 
@Mixin(Eat) class Human extends Mammal {} 
final me = new Human() 
me.eat() 
Human.mixin(Drink) 
me.drink()
Прокси 
class Human { 
def eat() {} 
def drink() {} 
} 
final x = [ eat: { println "I ate." }, drink: { println "I drinked." } ] as Human 
x.eat() 
println "${x.class}: ${x instanceof Human}" 
I ate. 
class Human1_groovyProxy: true
I/O 
println new File('/etc/passwd').text 
println new URL('http://baron.su/').text 
import groovy.json.* 
def builder = new JsonBuilder() 
builder.human ( name: 'Vasya', height: 180 ) 
new File('/tmp/out.json').withWriter { w -> 
w.println builder.toString() 
} 
{"human":{"name":"Vasya","height":180}}
POGO 
class Human { 
def name, sex, height, weight 
String toString() { "$name ($sex): $height cm $weight kg" } 
} 
println new Human(name: 'Vasya', sex: 'every day', height: 180, weight: 80) 
Vasya (every day): 180 cm 80 kg
GORM 
class Person { 
String name 
int age 
static constraints = { 
name blank: false 
} 
} 
new Person(name: ‘Ruslan’, age: 31).save(flush:true) 
final ruslan = Person.findOrCreateByNameAndAge(‘Ruslan’, 31).save()
GORM 
● Удобная надстройка над Hibernate 
● Pessimistic & Optimistic locking 
● Мощная система валидации данных 
● Все возможности Hibernate доступны 
● Convention over Configuration
Grails 
● Convention over Configuration 
● Самый распространённый для web 
● Постоянно развивается 
● Большое сообщество разработчиков 
● Поддержка плагинов
Grails. Модель 
package dummy 
class Password { 
String username 
String password 
String url 
static constraints = { 
} 
}
Grails. Контроллер 
package dummy 
class PasswordController { 
static scaffold = Password 
def index() { } 
}
Grails. Bootstrap 
import dummy.Password 
class BootStrap { 
def init = { servletContext -> 
new Password(username: 'admin', password: 'password', url: 
'http://berserktcg.ru/').save(flush: true) 
} 
def destroy = { 
} 
}
Scaffolding
Вопросы из зала? :)

More Related Content

What's hot

Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"
LogeekNightUkraine
 
Stream API: рекомендации лучших собаководов
Stream API: рекомендации лучших собаководовStream API: рекомендации лучших собаководов
Stream API: рекомендации лучших собаководов
tvaleev
 
2.4 Использование указателей
2.4 Использование указателей2.4 Использование указателей
2.4 Использование указателей
DEVTYPE
 
Kotlin - следующий язык после Java
Kotlin - следующий язык после JavaKotlin - следующий язык после Java
Kotlin - следующий язык после Java
Kirill Rozov
 
2014-11-01 03 Николай Линкер. Open your clojure
2014-11-01 03 Николай Линкер. Open your clojure2014-11-01 03 Николай Линкер. Open your clojure
2014-11-01 03 Николай Линкер. Open your clojure
Омские ИТ-субботники
 
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...
pgdayrussia
 
Александр Щепановский «Почему каждому языку нужен свой _»
Александр Щепановский «Почему каждому языку нужен свой _»Александр Щепановский «Почему каждому языку нужен свой _»
Александр Щепановский «Почему каждому языку нужен свой _»
DevDay
 
«Опыт использования каналов в корутинах в боевом проекте» Григорий Федоров
 «Опыт использования каналов в корутинах в боевом проекте»  Григорий Федоров «Опыт использования каналов в корутинах в боевом проекте»  Григорий Федоров
«Опыт использования каналов в корутинах в боевом проекте» Григорий Федоров
Mail.ru Group
 
[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java
[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java
[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java
Provectus
 
CPU Performance in Java.
CPU Performance in Java.CPU Performance in Java.
CPU Performance in Java.
Dzmitry Hil
 
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Ontico
 
Разработка крупного Standalone проекта на юнити: улучшаем производительность
Разработка крупного Standalone проекта на юнити: улучшаем производительностьРазработка крупного Standalone проекта на юнити: улучшаем производительность
Разработка крупного Standalone проекта на юнити: улучшаем производительность
Вадим Воробьев
 
Python&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.by
Python Meetup
 
Erlang и n2o. Web-разработка без JavaScript
Erlang и n2o. Web-разработка без JavaScriptErlang и n2o. Web-разработка без JavaScript
Erlang и n2o. Web-разработка без JavaScript
Eugene Tataurov
 
Java осень 2013 лекция 2
Java осень 2013 лекция 2Java осень 2013 лекция 2
Java осень 2013 лекция 2Technopark
 
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
JetBrains Russia
 
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)Mikhail Kurnosov
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущее
delimitry
 

What's hot (20)

Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"
 
Stream API: рекомендации лучших собаководов
Stream API: рекомендации лучших собаководовStream API: рекомендации лучших собаководов
Stream API: рекомендации лучших собаководов
 
2.4 Использование указателей
2.4 Использование указателей2.4 Использование указателей
2.4 Использование указателей
 
Kotlin - следующий язык после Java
Kotlin - следующий язык после JavaKotlin - следующий язык после Java
Kotlin - следующий язык после Java
 
2014-11-01 03 Николай Линкер. Open your clojure
2014-11-01 03 Николай Линкер. Open your clojure2014-11-01 03 Николай Линкер. Open your clojure
2014-11-01 03 Николай Линкер. Open your clojure
 
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...
 
Александр Щепановский «Почему каждому языку нужен свой _»
Александр Щепановский «Почему каждому языку нужен свой _»Александр Щепановский «Почему каждому языку нужен свой _»
Александр Щепановский «Почему каждому языку нужен свой _»
 
«Опыт использования каналов в корутинах в боевом проекте» Григорий Федоров
 «Опыт использования каналов в корутинах в боевом проекте»  Григорий Федоров «Опыт использования каналов в корутинах в боевом проекте»  Григорий Федоров
«Опыт использования каналов в корутинах в боевом проекте» Григорий Федоров
 
[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java
[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java
[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java
 
CPU Performance in Java.
CPU Performance in Java.CPU Performance in Java.
CPU Performance in Java.
 
South migration
South migrationSouth migration
South migration
 
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
 
msumobi2. Лекция 2
msumobi2. Лекция 2msumobi2. Лекция 2
msumobi2. Лекция 2
 
Разработка крупного Standalone проекта на юнити: улучшаем производительность
Разработка крупного Standalone проекта на юнити: улучшаем производительностьРазработка крупного Standalone проекта на юнити: улучшаем производительность
Разработка крупного Standalone проекта на юнити: улучшаем производительность
 
Python&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.by
 
Erlang и n2o. Web-разработка без JavaScript
Erlang и n2o. Web-разработка без JavaScriptErlang и n2o. Web-разработка без JavaScript
Erlang и n2o. Web-разработка без JavaScript
 
Java осень 2013 лекция 2
Java осень 2013 лекция 2Java осень 2013 лекция 2
Java осень 2013 лекция 2
 
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
 
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущее
 

Viewers also liked

Twitter 101
Twitter 101Twitter 101
Twitter 101
CUBE
 
eAccess 12: Ian Litterick, closing plenary
eAccess 12: Ian Litterick, closing plenaryeAccess 12: Ian Litterick, closing plenary
eAccess 12: Ian Litterick, closing plenary
Headstar
 
Keynote: how to save millions by moving online #BPCW11
Keynote: how to save millions by moving online #BPCW11Keynote: how to save millions by moving online #BPCW11
Keynote: how to save millions by moving online #BPCW11
Headstar
 
Social Media 101
Social Media 101Social Media 101
Social Media 101
CUBE
 
M&L webinar: Meeting the challenges of providing campus-wide video services
M&L webinar: Meeting the challenges of providing campus-wide video servicesM&L webinar: Meeting the challenges of providing campus-wide video services
M&L webinar: Meeting the challenges of providing campus-wide video services
Media & Learning Conference
 
M&L Talking Heads: Mind over Media – Exploring the links between media litera...
M&L Talking Heads: Mind over Media – Exploring the links between media litera...M&L Talking Heads: Mind over Media – Exploring the links between media litera...
M&L Talking Heads: Mind over Media – Exploring the links between media litera...
Media & Learning Conference
 

Viewers also liked (6)

Twitter 101
Twitter 101Twitter 101
Twitter 101
 
eAccess 12: Ian Litterick, closing plenary
eAccess 12: Ian Litterick, closing plenaryeAccess 12: Ian Litterick, closing plenary
eAccess 12: Ian Litterick, closing plenary
 
Keynote: how to save millions by moving online #BPCW11
Keynote: how to save millions by moving online #BPCW11Keynote: how to save millions by moving online #BPCW11
Keynote: how to save millions by moving online #BPCW11
 
Social Media 101
Social Media 101Social Media 101
Social Media 101
 
M&L webinar: Meeting the challenges of providing campus-wide video services
M&L webinar: Meeting the challenges of providing campus-wide video servicesM&L webinar: Meeting the challenges of providing campus-wide video services
M&L webinar: Meeting the challenges of providing campus-wide video services
 
M&L Talking Heads: Mind over Media – Exploring the links between media litera...
M&L Talking Heads: Mind over Media – Exploring the links between media litera...M&L Talking Heads: Mind over Media – Exploring the links between media litera...
M&L Talking Heads: Mind over Media – Exploring the links between media litera...
 

Similar to Groovy и Grails. Быстро и обо всём

Интерфейсы
ИнтерфейсыИнтерфейсы
ИнтерфейсыREX-MDK
 
Scala on android
Scala on androidScala on android
Scala on android
Valeriya Atamanova
 
[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)
Evgeny Kaziak
 
Programming Java - Lecture 02 - Objects - Lavrentyev Fedor
Programming Java - Lecture 02 - Objects - Lavrentyev FedorProgramming Java - Lecture 02 - Objects - Lavrentyev Fedor
Programming Java - Lecture 02 - Objects - Lavrentyev Fedor
Fedor Lavrentyev
 
Как программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногуКак программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногуAndreyGeonya
 
8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)
Smolensk Computer Science Club
 
Charming python sc2-8
Charming python sc2-8Charming python sc2-8
Charming python sc2-8
Vladislav Ananev
 
Lec 3
Lec 3Lec 3
Scala for android
Scala for androidScala for android
Scala for android
Alexander Rusin
 
C# Deep Dive
C# Deep DiveC# Deep Dive
C# Deep Dive
LuxoftTraining
 
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
HappyDev
 
Язык программирования C#
Язык программирования C#Язык программирования C#
Язык программирования C#
Dmitri Soshnikov
 
2014 iForum - Grails in Startup
2014 iForum - Grails in Startup2014 iForum - Grails in Startup
2014 iForum - Grails in StartupBohdan Danyliuk
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)
Alex Filatov
 
Java осень 2014 занятие 3
Java осень 2014 занятие 3Java осень 2014 занятие 3
Java осень 2014 занятие 3
Technopark
 
Xtend
XtendXtend
RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)
Noveo
 
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CШкола-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CГлеб Тарасов
 

Similar to Groovy и Grails. Быстро и обо всём (20)

Интерфейсы
ИнтерфейсыИнтерфейсы
Интерфейсы
 
Scala on android
Scala on androidScala on android
Scala on android
 
[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)
 
Programming Java - Lecture 02 - Objects - Lavrentyev Fedor
Programming Java - Lecture 02 - Objects - Lavrentyev FedorProgramming Java - Lecture 02 - Objects - Lavrentyev Fedor
Programming Java - Lecture 02 - Objects - Lavrentyev Fedor
 
Как программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногуКак программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногу
 
8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)
 
Charming python sc2-8
Charming python sc2-8Charming python sc2-8
Charming python sc2-8
 
Lec 3
Lec 3Lec 3
Lec 3
 
Scala for android
Scala for androidScala for android
Scala for android
 
C sharp deep dive
C sharp deep diveC sharp deep dive
C sharp deep dive
 
C# Deep Dive
C# Deep DiveC# Deep Dive
C# Deep Dive
 
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
 
Язык программирования C#
Язык программирования C#Язык программирования C#
Язык программирования C#
 
лекция 3
лекция 3лекция 3
лекция 3
 
2014 iForum - Grails in Startup
2014 iForum - Grails in Startup2014 iForum - Grails in Startup
2014 iForum - Grails in Startup
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)
 
Java осень 2014 занятие 3
Java осень 2014 занятие 3Java осень 2014 занятие 3
Java осень 2014 занятие 3
 
Xtend
XtendXtend
Xtend
 
RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)
 
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CШкола-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
 

Groovy и Grails. Быстро и обо всём

  • 1. Groovy и Grails быстро и обо всём
  • 2.
  • 3. Groovy, http://groovy.codehaus.org/ ● Работает в JVM ● Статическая и динамическая типизация ● Совместим с Java и всеми библиотеками ● Динамический язык ● Может использоваться как скриптовый ● Низкий порог вхождения ● Синтаксический сахар :-)
  • 4. Две программы println “Hello World” import java.io.*; public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } }
  • 5. import java.io.*; import java.util.*; public class HelloWorld { public static List<Integer> kvadrat(List<Integer> x) { List<Integer> y = new ArrayList<>(x.size()); for (Integer n : x) { y.add( (int)Math.round(Math.pow(n, 2)) ); } return y; } public static void main(String[] args) { List<Integer> x = new ArrayList<>(); x.add(1); x.add(2); x.add(3); x.add(4); x.add(5); List<Integer> y = kvadrat(x); for (Integer n : y) { System.out.println(n); } } }
  • 6. public static List<Integer> kvadrat(List<Integer> x) { List<Integer> y = new ArrayList<>(x.size()); for (Integer n : x) { y.add((int) Math.round(Math.pow(n, 2))); } return y; } List<Integer> x = new ArrayList<>(); x.add(1); x.add(2); x.add(3); x.add(4); x.add(5); List<Integer> y = kvadrat(x); for (Integer n : y) { System.out.println(n); }
  • 7. // Инициализируем x в одну строчку, используем power public static List<Integer> kvadrat(List<Integer> x) { List<Integer> y = new ArrayList<>(x.size()); for (Integer n : x) { y.add(n.power(2)); } return y; } List<Integer> x = [1, 2, 3, 4, 5]; List<Integer> y = kvadrat(x); for (Integer n : y) { System.out.println(n); }
  • 8. // Используем collect. Groovy отлично работает со списками public static List<Integer> kvadrat(List<Integer> x) { List<Integer> y = x.collect({ n -> n.power(2) }); return y; } List<Integer> x = [1, 2, 3, 4, 5]; List<Integer> y = kvadrat(x); for (Integer n : y) { System.out.println(n); }
  • 9. // Избавимся от лишних переменных. В Java мы не могли // без них обойтись, а в Groovy - запросто public static List<Integer> kvadrat(List<Integer> x) { return x.collect({ n -> n.power(2) }); } List<Integer> y = kvadrat([1, 2, 3, 4, 5]); for (Integer n : y) { System.out.println(n); }
  • 10. // Грувификация: убрали типы, точки с запятыми, return. // Перешли на .each def kvadrat(x) { x.collect { n -> n.power(2) } } def y = kvadrat([1, 2, 3, 4, 5]) y.each { n -> System.out.println(n) }
  • 11. // Теперь и переменная y лишняя :) def kvadrat(x) { x.collect { n -> n.power(2) } } kvadrat([1, 2, 3, 4, 5]).each { n -> System.out.println(n) }
  • 12. // Переменная n тоже, используем служебную it def kvadrat(x) { x.collect { it.power(2) } } kvadrat([1, 2, 3, 4, 5]).each { println it }
  • 13. // Метод kvadrat в общем-то тоже необязателен :) [1, 2, 3, 4, 5].collect { it.power(2) }.each { println it }
  • 14. Две программы [1, 2, 3, 4, 5].collect { it.power(2) }.each { println it } import java.io.*; import java.util.*; public class HelloWorld { public static List<Integer> kvadrat(List<Integer> x) { List<Integer> y = new ArrayList<>(x.size()); for (Integer n : x) { y.add( (int)Math.round(Math.pow(n, 2)) ); } return y; } public static void main(String[] args) { List<Integer> x = new ArrayList<>(); x.add(1); x.add(2); x.add(3); x.add(4); x.add(5); List<Integer> y = kvadrat(x); for (Integer n : y) { System.out.println(n); } } }
  • 15. Немного метапрограммирования final a = [1, 2, 3, 4, 5], b = [2, 3, 4, 5, 6] List.metaClass.kvadrat = { delegate.collect { it.power(2) } } println "${a.kvadrat()} ${b.kvadrat()}" import javax.servlet.http.HttpServletRequest HttpServletRequest.metaClass.getRealIp = { delegate.getHeader('X-Real-Ip') ?: delegate.remoteAddr }
  • 16. Миксины class Eat { def eat() { println "I ate" } } class Drink { def drink() { println "I drinked" } } class Animal {}; class Mammal extends Animal {} @Mixin(Eat) class Human extends Mammal {} final me = new Human() me.eat() Human.mixin(Drink) me.drink()
  • 17. Прокси class Human { def eat() {} def drink() {} } final x = [ eat: { println "I ate." }, drink: { println "I drinked." } ] as Human x.eat() println "${x.class}: ${x instanceof Human}" I ate. class Human1_groovyProxy: true
  • 18. I/O println new File('/etc/passwd').text println new URL('http://baron.su/').text import groovy.json.* def builder = new JsonBuilder() builder.human ( name: 'Vasya', height: 180 ) new File('/tmp/out.json').withWriter { w -> w.println builder.toString() } {"human":{"name":"Vasya","height":180}}
  • 19. POGO class Human { def name, sex, height, weight String toString() { "$name ($sex): $height cm $weight kg" } } println new Human(name: 'Vasya', sex: 'every day', height: 180, weight: 80) Vasya (every day): 180 cm 80 kg
  • 20. GORM class Person { String name int age static constraints = { name blank: false } } new Person(name: ‘Ruslan’, age: 31).save(flush:true) final ruslan = Person.findOrCreateByNameAndAge(‘Ruslan’, 31).save()
  • 21. GORM ● Удобная надстройка над Hibernate ● Pessimistic & Optimistic locking ● Мощная система валидации данных ● Все возможности Hibernate доступны ● Convention over Configuration
  • 22. Grails ● Convention over Configuration ● Самый распространённый для web ● Постоянно развивается ● Большое сообщество разработчиков ● Поддержка плагинов
  • 23. Grails. Модель package dummy class Password { String username String password String url static constraints = { } }
  • 24. Grails. Контроллер package dummy class PasswordController { static scaffold = Password def index() { } }
  • 25. Grails. Bootstrap import dummy.Password class BootStrap { def init = { servletContext -> new Password(username: 'admin', password: 'password', url: 'http://berserktcg.ru/').save(flush: true) } def destroy = { } }