2014 iForum - Grails in Startup

406 views
339 views

Published on

Published in: Engineering
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
406
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
2
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

2014 iForum - Grails in Startup

  1. 1. Grails - как эффективно использовать Java в стартапе? Богдан Данилюк iForum | апрель 2014 | @bogdand
  2. 2. Кто я? ● C Grails начиная с 2008 года ● Преподаватель курса Groovy / Grails в проекте GeekHub ● В TransferWise со стадии MVP
  3. 3. О проекте TransferWise
  4. 4. TransferWise
  5. 5. Проблема Потребности бизнеса разные на разных этапах
  6. 6. Этапы развития проекта Proof of concept
  7. 7. Proof of concept
  8. 8. Этапы развития проекта MVP
  9. 9. Этапы развития проекта Эксперементирование и наращивание функциональности
  10. 10. Этапы развития проекта От скорости к качеству
  11. 11. Этапы развития проекта Отказоустойчивость и масштабируемость
  12. 12. Grails
  13. 13. Что такое Grails? Groovy / Java web framework который: ● Rapid ● Dynamic ● Robust
  14. 14. Быстрая разработка C Grails вы получаете функционирующее web приложение через 6 секунд :)
  15. 15. Grails Структура папок
  16. 16. Grails быстрая разработка
  17. 17. Быстрая разработка Groovy - динамический язык с опциональной типизацией обратно совместимый с Java
  18. 18. Groovy Обилие синтаксического сахара def foo = null def bar = foo?.something?.myMethod() assert bar == null assert 'a' == bar ?: 'a'​​ assert -1 == 3 <=> 4​ assert 3 == ​[1, 2, 3].find {it > 2}​
  19. 19. Groovy public class User { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public String greet(String guest) { return "Hello " + name + ", I am " + guest; } } User user = new User(); user.setName("Vasya"); System.out.println(user.greet("Petya"));
  20. 20. Groovy public class User { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public String greet(String guest) { return "Hello " + name + ", I am " + guest; } } User user = new User(); user.setName("Vasya"); System.out.println(user.greet("Petya")); Точки с запятыми
  21. 21. Groovy public class User { private String name public String getName() { return name } public void setName(String name) { this.name = name } public String greet(String guest) { return "Hello " + name + ", I am " + guest } } User user = new User() user.setName("Vasya") System.out.println(user.greet("Petya"))
  22. 22. Groovy public class User { private String name public String getName() { return name } public void setName(String name) { this.name = name } public String greet(String guest) { return "Hello " + name + ", I am " + guest } } User user = new User() user.setName("Vasya") System.out.println(user.greet("Petya")) Скобки
  23. 23. Groovy public class User { private String name public String getName() { return name } public void setName(String name) { this.name = name } public String greet(String guest) { return "Hello " + name + ", I am " + guest } } User user = new User() user.setName "Vasya" System.out.println user.greet("Petya")
  24. 24. Groovy public class User { private String name public String getName() { return name } public void setName(String name) { this.name = name } public String greet(String guest) { return "Hello " + name + ", I am " + guest } } User user = new User() user.setName "Vasya" System.out.println user.greet("Petya") return
  25. 25. Groovy public class User { private String name public String getName() { name } public void setName(String name) { this.name = name } public String greet(String guest) { "Hello " + name + ", I am " + guest } } User user = new User() user.setName "Vasya" System.out.println user.greet("Petya")
  26. 26. Groovy public class User { private String name public String getName() { name } public void setName(String name) { this.name = name } public String greet(String guest) { "Hello " + name + ", I am " + guest } } User user = new User() user.setName "Vasya" System.out.println user.greet("Petya") public
  27. 27. Groovy class User { private String name String getName() { name } void setName(String name) { this.name = name } String greet(String guest) { "Hello " + name + ", I am " + guest } } User user = new User() user.setName "Vasya" System.out.println user.greet("Petya")
  28. 28. Groovy class User { private String name String getName() { name } void setName(String name) { this.name = name } String greet(String guest) { "Hello " + name + ", I am " + guest } } User user = new User() user.setName "Vasya" System.out.println user.greet("Petya") Опциональная типизация
  29. 29. Groovy class User { private String name String getName() { name } void setName(String name) { this.name = name } String greet(String guest) { "Hello " + name + ", I am " + guest } } def user = new User() user.setName "Vasya" System.out.println user.greet("Petya")
  30. 30. Groovy class User { private String name String getName() { name } void setName(String name) { this.name = name } String greet(String guest) { "Hello " + name + ", I am " + guest } } def user = new User() user.setName "Vasya" System.out.println user.greet("Petya") println
  31. 31. Groovy class User { private String name String getName() { name } void setName(String name) { this.name = name } String greet(String guest) { "Hello " + name + ", I am " + guest } } def user = new User() user.setName "Vasya" println user.greet("Petya")
  32. 32. Groovy class User { private String name String getName() { name } void setName(String name) { this.name = name } String greet(String guest) { "Hello " + name + ", I am " + guest } } def user = new User() user.setName "Vasya" println user.greet("Petya") поле класса
  33. 33. Groovy class User { String name String greet(String guest) { "Hello " + name + ", I am " + guest } } def user = new User() user.setName "Vasya" println user.greet("Petya")
  34. 34. Groovy class User { String name String greet(String guest) { "Hello " + name + ", I am " + guest } } def user = new User() user.setName "Vasya" println user.greet("Petya") Использование сеттера
  35. 35. Groovy class User { String name String greet(String guest) { "Hello " + name + ", I am " + guest } } def user = new User() user.name = "Vasya" println user.greet("Petya")
  36. 36. Groovy class User { String name String greet(String guest) { "Hello " + name + ", I am " + guest } } def user = new User() user.name = "Vasya" println user.greet("Petya") Именованные аргументы
  37. 37. Groovy class User { String name String greet(String guest) { "Hello " + name + ", I am " + guest } } def user = new User(name: "Vasya") println user.greet("Petya")
  38. 38. Groovy class User { String name String greet(String guest) { "Hello " + name + ", I am " + guest } } def user = new User(name: "Vasya") println user.greet("Petya") GString
  39. 39. Groovy class User { String name String greet(String guest) { "Hello ${name}, I am ${guest}" } } def user = new User(name: "Vasya") println user.greet("Petya")
  40. 40. Groovy class User { String name String greet(String guest) { "Hello ${name}, I am ${guest}" } } def user = new User(name: "Vasya") println user.greet("Petya") Уберем пробелы
  41. 41. Groovy class User { String name String greet(String guest) { "Hello ${name}, I am ${guest}" } } def user = new User(name: "Vasya") println user.greet("Petya")
  42. 42. Groovy public class User { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public String greet(String guest) { return "Hello " + name + ", I am " + guest; } } User user = new User(); user.setName("Vasya"); System.out.println(user.greet("Petya"));
  43. 43. Groovy class User { String name String greet(String guest) { "Hello ${name}, I am ${guest}" } } def user = new User(name: "Vasya") println user.greet("Petya")
  44. 44. Groovy Замыкания def finder = {it > 2} assert 3 == [1, 2, 3].find(finder) def dynamicFinder = {limit -> { var -> var > limit } } assert 4 == [1, 2, 3, 4].find(dynamicFinder(3))
  45. 45. Groovy Идеален для создания DSL html { head { title 'Simple document' } body(id: 'main') { h1 'Building HTML the Groovy Way' p { strong 'Some bold text' } a href: 'more.html', 'Read more...' } }
  46. 46. Groovy Узнать больше о Groovy http://www.infoq.com/presentations/groovy-2-1-2gx
  47. 47. Быстрая разработка Принципы Grails ● DRY ● Convention over Configuration
  48. 48. Быстрая разработка GORM package org.example class Book { static constraints = { } }
  49. 49. Быстрая разработка package org.example class Book { String title static constraints = { title blank: false } }
  50. 50. Быстрая разработка Мощный скаффолдинг package org.example class BookController { def index() { } }
  51. 51. Быстрая разработка package org.example class BookController { def scaffold = Book def index() { } }
  52. 52. Быстрая разработка
  53. 53. Быстрая разработка 1к+ плагинов
  54. 54. Быстрая разработка ● GORM ● Security ● OpenId / Facebook / LinkedIn ● Cache ● CMS ● Rich client Плагины
  55. 55. Grails качественная разработка
  56. 56. Качественная разработка Вектор архитектуры ● Реализован набор паттернов ● Явное разделение обязанностей ● Набор устоявшихся практик
  57. 57. Качественная разработка Построен на плечах титанов
  58. 58. Качественная разработка Тестирование в крови
  59. 59. Качественная разработка Хорошо проработанное Unit тестирование
  60. 60. Качественная разработка void testMockDomain() { def jdoe = new User(name:"John Doe", role:"user") def suziq = new User(name:"Suzi Q", role:"admin") def jsmith = new User(name:"Jane Smith", role:"user") mockDomain(User, [jdoe, suziq, jsmith]) def list = User.findAllByRole("admin") assertEquals 1, list.size() } Тестирование динамических методов домена
  61. 61. Качественная разработка Spock ● BDD / Specifications ● Data Driven Testing ● Mock / Stub / Spy ● Расширяемый плагинами
  62. 62. Качественная разработка Spock пример Data Driven Testing class MathSpec extends Specification { def "maximum of two numbers"() { expect: Math.max(a, b) == c where: a | b || c 1 | 3 || 3 7 | 4 || 4 0 | 0 || 0 } }
  63. 63. Качественная разработка Инструменты мониторнига ● JavaMelody Grails Plugin ● Health Control ● Application Info plugin ● Perf4J Integration Plugin ● NewRelic
  64. 64. Качественная разработка Инструменты контроля качества ● CodeNarc ● GMetrics ● SONAR ● Cobertura
  65. 65. Grails масштабируемость
  66. 66. Масштабируемость Горизонтальное масштабирование
  67. 67. Масштабируемоcть Admin web app Grails app Android iOS Web Frontend AngularJS Database 3rd party Services Grails app Consumer REST API Grails app Monitoring APIs Куда мы идем CDN
  68. 68. Масштабируемоcть Вариаанты подключения плагинов Из репозитория // grails-app/conf/BuildConfig.groovy plugins { build ":tomcat:7.0.52.1" } Из локальной папки // grails-app/conf/BuildConfig.groovy grails.plugin.location.blog = "../blog"
  69. 69. В чем подвох?
  70. 70. ● У мета фреймворка - мета баги ● Лучше бы знать что внутри ● Медленные интеграционные тесты ● Скорость старта Недостатки
  71. 71. Спасибо за внимание!
  72. 72. Вопросы

×