Groovy presentation.

1,321 views

Published on

Groovy programing language presentation.

For more details see my blog.infinitylx.org.ua

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,321
On SlideShare
0
From Embeds
0
Number of Embeds
247
Actions
Shares
0
Downloads
13
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Groovy presentation.

  1. 1. Обзор Groovy Владислав Мережко
  2. 2. План презентации●JVM, JRE●Groovy syntax●closures (замыкания)●@notation●aliases●metaprogramming●DSL●GPath●Groovy builder●Integration into enfinity
  3. 3. Все точки над «і»Groovy — объектно-ориентированный языкпрограммирования разработанный дляплатформы Java как альтернатива языку Java свозможностями Python, Ruby и Smalltalk.Groovy завершил процесс стандартизации в JavaCommunity Process JSR 241.
  4. 4. Java Virtual Machine● Вы можете использовать любой код написанный на Java● Получаете все преимущества языка Java: ● стабильность JVM ● масштабирование ● многопоточность ● нулевой порог вхождения для Java программистов ● и многое другое
  5. 5. DSL● Язык полностью поддерживает концепцию Domain Specific Language (DSL)● С помощью Metaprogramming и динамической природы можно легко реализовать свой собственный язык
  6. 6. Примерbuy 500, "AAPL", 179.30buy(250, "AAPL", 179.30) //buy 500, "SUNW", 10.14sell 350, "AAPL", 179.30show_transactions "AAPL"print_portfolio_value
  7. 7. Примерportfolio = [:] //Holds all of the stock transactions/***A simple object to hold the data for each individual transaction*/class StockTransaction { def tickerSymbol def numberOfShares def sharePrice def type def transactionDate}
  8. 8. Примерdef buy(numberOfShares, symbol, sharePrice){ transaction(Buy, numberOfShares, symbol,sharePrice)}def sell(numberOfShares, symbol, sharePrice){ transaction(Sell, numberOfShares, symbol,sharePrice)}
  9. 9. Примерdef transaction(transactionType, numberOfShares, symbol, sharePrice){ def transaction = new StockTransaction(tickerSymbol:symbol, numberOfShares:numberOfShares, sharePrice:sharePrice, type:transactionType, transactionDate:new Date()) println "${transaction.type}ing ${transaction.numberOfShares} shares" + " of ${transaction.tickerSymbol} at ${transaction.sharePrice}" if(portfolio[transaction.tickerSymbol] == null){ if(transactionType == Buy) portfolio[transaction.tickerSymbol] = [transaction] else println "You cant sell a stock you dont own." } else{ portfolio[transaction.tickerSymbol] << transaction }}
  10. 10. Результат выполненияBuying 500 shares of AAPL at 179.30Buying 250 shares of AAPL at 179.30Buying 500 shares of SUNW at 10.14Selling 350 shares of AAPL at 179.30Sun Aug 17 19:15:05 EDT 2008: Buy 500 shares of AAPL at 179.30Sun Aug 17 19:15:05 EDT 2008: Buy 250 shares of AAPL at 179.30Sun Aug 17 19:15:05 EDT 2008: Sell 350 shares of AAPL at 179.30Your Total Portfolio Value is: 76790.00
  11. 11. Замыкание● Одна из важных особенностей Groovy● Очень много встроенных функций Groovy принимать замыкания как параметр● Замыкания анонимны● Замыкания имеют доступ к внешним переменным● Замыкания могуть принимать много переменных
  12. 12. Замыкания● Замыкание имеет вид { [аргументиЗамикания->] кодЗамикания }● Все замыкания унаследованы от “Closure”● Чтобы вызвать замыкание можно воспользоваться один из двух способов 1: closureVar.call(); 2: closureVar();
  13. 13. Пример square = { it * it } square(9)● 81 [ 1, 2, 3, 4 ].collect(square)● [1, 4, 9, 16 ] def printSum = { a, b -> print a+b } printSum( 5, 7 )● 12
  14. 14. Пример def myConst = 5 def incByConst = { num-> num + myConst} println incByConst(10)● 15 def clos = { print it } clos( "hi there" )● hi there
  15. 15. @ннотации● Аннотации в Groovy позволяют реализовать множественное наследование (@mixin)● Делегировать вызови методов к свойству класса (@delegate)● Расширять любые классы, даже final (@category)● Создавать сиглтоны (@singleton)● Создавать неизменяемые объекты (@immutable)● Создавать ленивые свойства классов (@lazy)
  16. 16. Пример @Singleton class T {}● Аналог на Java public class T { public static final T instance = new T(); private T() {} }
  17. 17. Пример @Immutable final class Coordinates { Double latitude, longitude } def c1 = new Coordinates(latitude: 48.824068, longitude: 2.531733) def c2 = new Coordinates(48.824068, 2.531733)● assert c1 == c2
  18. 18. Примерclass Person { @Lazy pets = [Cat, Dog, Bird]}def p = new Person()assert !(p.dump().contains(Cat))assert p.pets.size() == 3assert p.dump().contains(Cat)
  19. 19. Примерimport java.text.SimpleDateFormatclass Event { @Delegate Date when String title, url}def df = new SimpleDateFormat("yyyy/MM/dd")
  20. 20. Примерdef gr8conf = new Event(title: "GR8 Conference", url: "http://www.gr8conf.org", when: df.parse("2009/05/18"))def javaOne = new Event(title: "JavaOne", url: "http://java.sun.com/javaone/", when: df.parse("2009/06/02"))assert gr8conf.before(javaOne.when)
  21. 21. Пример@Category(Vehicle) class FlyingAbility { def fly() { "Im the ${name} and I fly!" }}@Category(Vehicle) class DivingAbility { def dive() { "Im the ${name} and I dive!" }}interface Vehicle { String getName()}
  22. 22. Пример@Mixin([DivingAbility, FlyingAbility])class JamesBondVehicle implements Vehicle { String getName() { "James Bonds vehicle" }}assert new JamesBondVehicle().fly() == "Im the James Bonds vehicle and I fly!"assert new JamesBondVehicle().dive() == "Im the James Bonds vehicle and I dive!"
  23. 23. Metaprogramming● Возможность языка динамически манипулировать другими программами, включая себя● Динамически добавлять методы● AST (Abstract Syntax Tree) преобразование
  24. 24. Metaprogramming AST бывает двух видов● Глобальное – применяется во время компиляции ко всем исходным текстам во время компиляции● Локальное — применяются к отдельным элементам обозначенным специальными аннотациями
  25. 25. Пример import java.text.NumberFormat BigDecimal.metaClass.inEuros = { def EXCHANGE_RATE = 0.53 // (6/16/2011) NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.US) nf.setCurrency(Currency.getInstance("EUR")) nf.format(delegate * EXCHANGE_RATE) }● println 2500.00.inEuros()
  26. 26. Пример println "Introduction".padRight(15, ".") println "Introduction".reverse() //output● Introduction...● noitcudortnI
  27. 27. ПримерString.metaClass.shout = {-> return delegate.toUpperCase()}String.metaClass.toUpperCase = {-> return delegate.toLowerCase()}println "Hello MetaProgramming".shout()//outputhello metaprogramming
  28. 28. Aliases and Duck typing Тут все просто● def p = System.out.&println;● p{"Hello"}● Duck - typing – возможность утверждать что объект имеет определенный тип не на основе наличия в сигнатуре интерфейса, который он имплементирует, а по наличию реализованных методов (оператор AS).● По сути и это есть более правильный термин для описания типизации в Groovy, чем просто «динамическая типизация»
  29. 29. GPath● GPath аналог XPath, только для любых структур.● Также есть поддержка Xml
  30. 30. Примерclass Person{ String firstName String lastName int age}def personList = [ new Person(firstName: "dhaval", lastName: "nagar", age: 25), new Person(firstName: "nachiket", lastName: "patel", age: 24),]
  31. 31. Пример● Можно воспользоваться встроенным функционалом println personList.collect{it.firstName} // will print ["dhaval", "nachiket"]● А можно GPath println personList.firstName println personList.firstName.grep(~/d.*/) // will print ["dhaval"]
  32. 32. Пример def mylinks = """ <links> <link id="1" url="www.google.com"/> <link id="2" url="www.apple.co.in"/> </links> """● Для нахождения ссылок с окончанием "com" и "co.in": println links.link.@url.grep(~/.*com/) println links.link.@url.grep(~/.*co[.]in/)
  33. 33. Groovy builder● Builder в Groovy позволяет очень легко и быстро создавать сложные иерархические структуры например Xml● В Groovy уже есть поддержка для Xml (HTML), SWING виджетов, Ant tasks
  34. 34. Пример● Для генерации такой Xml структуры <person> <name first="Megan" last="Smith"> <age>32</age> <gender>female</gender> </name> <friends> <friend>Julie</friend> <friend>Joe</friend> <friend>Hannah</friend> </friends> </person>
  35. 35. Примерclass XMLBuilder{ static void main(String[] args) { def writer = new StringWriter() def builder = new groovy.xml.MarkupBuilder(writer) def friendnames = [ "Julie", "Joey", "Hannah"] builder.person() { name(first:"Megan", last:"Smith") { age("32") gender("female") } friends() { for (e in friendnames) { friend(e) } }} println writer.toString()}}
  36. 36. Integration into Enfinity

×