Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Scala EE: Myth or Reality?

1,607 views

Published on

A talk from ADD 2012 conference on Scala / Java EE

  • Be the first to comment

Scala EE: Myth or Reality?

  1. 1. Scala EE: миф или реальность? или Стоит ли мне использовать Scala? или Об истории одного проекта на Scala Марат Ахин Application Developer Days – 3 12-05-2012http://ice-phoenix.info/info
  2. 2. Scala EEScala Объектно-ориентированный и функциональный язык программирования Обладает очень выразительной системой типов Выполняется на Java Virtual Machine (JVM)Java EE Набор технологий для разработки серверных приложений Расширяет Java SE Позволяет сфокусироваться на бизнес-логике Марат Ахин (СПбГПУ) Scala EE 2012 2 / 47
  3. 3. Пилотный проект Марат Ахин (СПбГПУ) Scala EE 2012 3 / 47
  4. 4. Java EE Марат Ахин (СПбГПУ) Scala EE 2012 4 / 47
  5. 5. Что такое хорошо, что такое плохоИнтероперабельность между Scala и Java Способность вызывать Java из Scala и наоборот Прозрачная работа с объектами Scala в Java и наоборотИспользование Scala вместо Java Большая выразительность Scala Разница в производительности между Scala и Java Марат Ахин (СПбГПУ) Scala EE 2012 5 / 47
  6. 6. Проблемы с производительностью Марат Ахин (СПбГПУ) Scala EE 2012 6 / 47
  7. 7. Проблемы с производительностью1 d e f main ( args : Array [ String ]) {2 v a r sum = 0.0;3 v a l array = (1 to 16000000) . map ( e = random ) >4 v a l start = System . currentTimeMillis ()5 f o r ( e <− array ) {6 sum = sum + e7 }8 v a l end = System . currentTimeMillis ()9 } Аналогичный код на Java выполняется за 30 мс1 За сколько выполняется код на Scala? 1 на сферической тестовой машине в вакууме Марат Ахин (СПбГПУ) Scala EE 2012 7 / 47
  8. 8. Проблемы с производительностью Все дело в том, что...1 d e f main ( args : Array [ String ]) {2 // ...3 array . foreach (4 new AbstractFunction1 () {5 d e f apply ( e : Double ) = { t h i s . sum += e ; }6 }7 );8 // ...9 } Для вложенных циклов ситуация обстоит еще хуже Если код на Scala выглядит как быстрый код на Java, это не значит, что он является таковым Марат Ахин (СПбГПУ) Scala EE 2012 8 / 47
  9. 9. Проблемы с коллекциямиHashMap Read / Write Performance java.util.HashMap: 1x / 1x scala.collection.immutable.HashMap: 2.5x / 4x scala.collection.mutable.HashMap: 1.05x / 1.05xTreeMap Read / Write Performance java.util.TreeMap: 1x / 1x scala.collection.immutable.TreeMap: 1.5x / 2x Марат Ахин (СПбГПУ) Scala EE 2012 9 / 47
  10. 10. Проблемы с коллекциями Почему immutable.HashMap так важен? Scala по умолчанию использует immutable коллекции Многие операции неявно приводят к созданию immutable.HashMap1 d e f initCache ( rs : List [ ActionStatus ]) {2 cache = rs3 . map ( e = ( e . getName , e ) ) >4 . toMap [ String , ServerStatus ]5 } Понятный код на Scala не всегда приводит к понятным результатам Марат Ахин (СПбГПУ) Scala EE 2012 10 / 47
  11. 11. Скорость компиляции Марат Ахин (СПбГПУ) Scala EE 2012 11 / 47
  12. 12. Скорость компиляцииjava : core-common : 2 sjava : core-database : 2 sjava : core-business : 2 sjava : core-integration : 1 sjava : ws-one : 1 sjava : ws-two : 1 sjava : ws-three : 1 s+++++++++++++++++++++++++++++++java : total : 10 sTotal Java code size: ≈ 60 KSLOC Марат Ахин (СПбГПУ) Scala EE 2012 12 / 47
  13. 13. Скорость компиляцииscala : core-common : 16 sscala : core-database : 13 sscala : core-business : 13 sscala : core-integration : 6 sscala : ws-one : 8 sscala : ws-two : 10 sscala : ws-three : 6 s+++++++++++++++++++++++++++++++scala : total : 72 sTotal Scala code size: ≈ 8 KSLOC Марат Ахин (СПбГПУ) Scala EE 2012 13 / 47
  14. 14. Скорость компиляцииПочему? Система типов Scala Вывод типов Неявные преобразования типов Множество расширений по сравнению с Java За богатые выразительные возможности приходится расплачиваться временем компиляции Марат Ахин (СПбГПУ) Scala EE 2012 14 / 47
  15. 15. Интероперабельность Марат Ахин (СПбГПУ) Scala EE 2012 15 / 47
  16. 16. Интероперабельность Способность прозрачным образом работать с объектами и вызывать методы одного языка из другого Марат Ахин (СПбГПУ) Scala EE 2012 16 / 47
  17. 17. Интероперабельность Scala -> Java Все объекты Java являются полноценными объектами Scala Все методы Java могут быть вызваны в Scala Все библиотеки Java доступны в Scala1 v a r ServiceUrl =2 new URL ( " http :// web - service . net / ws / foo " )34 d e f HttpAuthToken =5 DatatypeConverter . printBase64Binary (6 ( User + " : " + Password ) . getBytes ) Марат Ахин (СПбГПУ) Scala EE 2012 17 / 47
  18. 18. Интероперабельность Марат Ахин (СПбГПУ) Scala EE 2012 18 / 47
  19. 19. Интероперабельность Марат Ахин (СПбГПУ) Scala EE 2012 19 / 47
  20. 20. ИнтероперабельностьJava -> Scala Все объекты Scala являются полноценными объектами Java Все методы Scala могут быть вызваны в Java Все библиотеки Scala доступны в JavaНо есть одна проблема... Scala компилируется в очень специфический Java код Марат Ахин (СПбГПУ) Scala EE 2012 20 / 47
  21. 21. Специфический код1 o b j e c t ConfigManager e x t e n d s Configuration {2 v a r DateFormatter =3 new SimpleDateFormat ( " yyyy - MM - dd HH : mm : ss " )4 // ...5 }1 p u b l i c v o i d doSomething () {2 SimpleDateFormat sdf =3 ConfigManager$ . MODULE$ . DateFormatter () ;4 // ...5 } И это один из самых простых случаев... Марат Ахин (СПбГПУ) Scala EE 2012 21 / 47
  22. 22. Очень специфический код1 o b j e c t ConfigManager e x t e n d s Configuration {2 // ...3 v a r LookupMap =4 Map . empty [ String , Object ] + ( " ID01 " -> ...)5 // ...6 }1 p u b l i c v o i d doNetherthing () {2 Map <~ > map = ConfigManager$ . MODULE$ . LookupMap () ;3 map = map . $plus (...) ;4 // ...5 } Марат Ахин (СПбГПУ) Scala EE 2012 22 / 47
  23. 23. Совсем уж специфический код1 o b j e c t ConfigManager e x t e n d s Configuration {2 v a l Auth = new Configuration {3 v a l ErrorCodes = new Configuration {4 v a r FatalError = 0 x015 // ...6 }7 }8 }1 p u b l i c v o i d doNetherthing () {2 i n t fatalErrorCode =3 C o n figManager$ $ a n o n $ 1 $ $ a n o n $ 9 . FatalError () ;4 // ...5 } Марат Ахин (СПбГПУ) Scala EE 2012 23 / 47
  24. 24. И снова о компиляцииСтандартная схема компиляции javac *.java -> scalac *.scala Все помнят проблемы со временем компиляции Scala?Расширенная схема компиляции scalac * -> javac *.java -> scalac *.scala А теперь? Марат Ахин (СПбГПУ) Scala EE 2012 24 / 47
  25. 25. Scala код и библиотеки Java Специфический Scala->Java код представляет собой проблемы для многих Java библиотек1 c l a s s CommonData e x t e n d s I18nable w i t h Logging {2 // ...3 }1 // From grizzled . slf4j2 t r a i t Logging {3 p r o t e c t e d d e f logger : Logger = ...4 // ...5 } JAXB + CommonData = Does not work Марат Ахин (СПбГПУ) Scala EE 2012 25 / 47
  26. 26. Scala код и библиотеки Java EJB + Wrapped Scala collection = Does not work JAX-WS + Scala traits = Does not work JPA + Scala collections = Does not work ... Чтобы Scala могла работать вместе с Java, иногда приходится писать Java-подобный Scala код Марат Ахин (СПбГПУ) Scala EE 2012 26 / 47
  27. 27. Надежды нет? Марат Ахин (СПбГПУ) Scala EE 2012 27 / 47
  28. 28. Надежды нет?Единственное преимущество в использовании Scala вместо Java Марат Ахин (СПбГПУ) Scala EE 2012 28 / 47
  29. 29. Надежды нет?Scala позволяет писать более лаконичный и выразительный код Сопоставление с образцом Вывод типов Функции высших порядков Структурные типы Марат Ахин (СПбГПУ) Scala EE 2012 29 / 47
  30. 30. Pattern matching Марат Ахин (СПбГПУ) Scala EE 2012 30 / 47
  31. 31. Pattern matching Switch на стероидах 1 d e f initNodeMapings () { 2 // ... 3 nodeKind match { 4 c a s e BLOCK | IMPORT => 5 ( m + ( nodeKind -> i ) , i + 2) 6 c a s e MODIFIERS = > 7 ( m + ( nodeKind -> i ) , i + Modifiers . size ) 8 c a s e PRIMITIVE_TYPE => 9 ( m + ( nodeKind -> i ) , i + TypeKinds . size )10 case _ = >11 ( m + ( nodeKind -> i ) , i + 1)12 }13 // ...14 } Марат Ахин (СПбГПУ) Scala EE 2012 31 / 47
  32. 32. Pattern matching 1 d e f process ( node : Node ) = { 2 node match { 3 c a s e blockNode : BlockTree = { > 4 // Process BlockTree node 5 } 6 c a s e importNode : ImportTree = { > 7 // Process ImportTree node 8 } 9 // ...10 case _ = { >11 // Process all other nodes12 }13 }14 } Марат Ахин (СПбГПУ) Scala EE 2012 32 / 47
  33. 33. Pattern matching1 o v e r r i d e d e f reduce ( p1 : SpliceMap ,2 p2 : SpliceMap ) : SpliceMap = {3 ( p1 , p2 ) match {4 c a s e ( n u l l , n u l l ) = r e t u r n defaultSpliceMap >5 c a s e (_ , n u l l ) = r e t u r n p1 >6 c a s e ( n u l l , _ ) = r e t u r n p2 >7 c a s e _ = p1 . reduce ( p2 ) >8 }9 } Case classes Pattern matching in XML ... unapply Марат Ахин (СПбГПУ) Scala EE 2012 33 / 47
  34. 34. Вывод типов Марат Ахин (СПбГПУ) Scala EE 2012 34 / 47
  35. 35. Вывод типов В Scala используется Colored Local Type Inference Можно опускать указание типов в выражениях Можно опускать указание типа возвращаемого значения метода21 v a l action = new Action ()2 v a l map = Map . empty [ Int , Action ]3 d e f innerDocument = factory . createDocument () 2 для нерекурсивных методов Марат Ахин (СПбГПУ) Scala EE 2012 35 / 47
  36. 36. Вывод типов Nota Bene! Необходимо указывать типы аргументов метода Необходимо указывать тип выражения тогда, когда вывод типов не справляется1 d e f getPositions ( tree : Tree ) = {2 v a l start = srcPos . getStartPosition ( cut , tree )3 v a l end = srcPos . getEndPosition ( cut , tree )4 (new Position ( start ) , new Position ( end ) )5 }67 @EJB8 v a r event : EventProcess orBeanLocal = _ Марат Ахин (СПбГПУ) Scala EE 2012 36 / 47
  37. 37. Вывод типов1 // ...2 <T > Collection <T > mergeAll ( Collection <T > entities )3 throws CoreException ;4 // ...1 // ...2 d e f mergeAll [ T ]( entities : Collection [ T ]) : JCollection [ T ]= {3 v a l result = ...4 // ...5 result // scala . collection . immutable . Iterable [ T ]6 }7 // ... Марат Ахин (СПбГПУ) Scala EE 2012 37 / 47
  38. 38. Функции высших порядков Марат Ахин (СПбГПУ) Scala EE 2012 38 / 47
  39. 39. Функции высших порядков Функции высших порядков могут принимать в качестве аргументов другие функции могут возвращать в качестве результата другие функции могут являться значением1 d e f apply [V , R ]( f : V = R , v : V ) : R = f ( v ) >23 4 == apply ( ( i : Int ) = i * i , 2 ) >1 d e f apply [V , R ]( f : _ >: V = _ <: R , v : V ) : R > Марат Ахин (СПбГПУ) Scala EE 2012 39 / 47
  40. 40. Функции высших порядков 1 d e f fromActions ( 2 actions : List [ Action ] , 3 converters : List [( Action ) = CommonGroup ] > 4 ) = { 5 (new CommonData /: actions ) ( 6 ( data , action ) => 7 data add converters . map ( _ ( action ) ) 8 ) 9 }1011 v a l convs = List ( summary _ , details _ ) Функции высших порядков позволяют экономить и не плодить лишние сущности Марат Ахин (СПбГПУ) Scala EE 2012 40 / 47
  41. 41. Структурная типизация Марат Ахин (СПбГПУ) Scala EE 2012 41 / 47
  42. 42. Структурная типизация Отношения между типами задаются неявно, через их структуру 1 c l a s s Square ( side : Double ) { 2 d e f area = side * side 3 d e f perimeter = side * 4 4 } 5 6 c l a s s Circle ( radius : Double ) { 7 d e f area = PI * radius * radius 8 d e f perimeter = 2 * PI * radius 9 }1011 t y p e Figure = {12 d e f area : Double13 d e f perimeter : Double14 } Марат Ахин (СПбГПУ) Scala EE 2012 42 / 47
  43. 43. Структурная типизация Задача: сгенерировать UUID для сущностей из БД1 d e f generate ( o : AnyRef , id : JInteger ) = {2 new java . util . UUID (3 o . getClass . getCanonicalName . hashCode ,4 i f ( id == n u l l ) -1 e l s e id . longValue5 )6 } Вариант №1: дополнительный интерфейс1 t r a i t Idable {2 d e f getId : JInteger3 }45 d e f generateFromId ( o : Idable ) = {6 generate (o , o . getId )7 } Марат Ахин (СПбГПУ) Scala EE 2012 43 / 47
  44. 44. Структурная типизация Вариант №2: описать соответствующий структурный тип1 d e f generateFromId [ A <: AnyRef { d e f getId () : JInteger }]( o : A ) = {2 generate (o , o . getId )3 } Преимущества Лаконичность Выразительность Недостатки Дублирование кода Сложность реализации Ограничения в работе со структурными типами Марат Ахин (СПбГПУ) Scala EE 2012 44 / 47
  45. 45. И все же... Марат Ахин (СПбГПУ) Scala EE 2012 45 / 47
  46. 46. И все же...Миф или реальность? Реальность (причем чем дальше, тем реальнее)Стоит ли мне использовать Scala?Да, если Вы готовы потратить время на ее изучение не боитесь преодолевать трудности понимаете, что полностью избавиться от Java не получится Марат Ахин (СПбГПУ) Scala EE 2012 46 / 47
  47. 47. Какие будут вопросики?1 d e f rate ( who : Person ) = {2 ( who . currentMood match {3 c a s e Bad = -1.0 >4 c a s e IDunno = random >5 c a s e Good = 1.0 >6 }) * normalizeCoeff7 }89 apply ( rate _ , self ) Марат Ахин (СПбГПУ) Scala EE 2012 47 / 47

×