SlideShare a Scribd company logo
1 of 47
Download to read offline
Scala EE: миф или реальность?
                              или
                Стоит ли мне использовать Scala?
                              или
               Об истории одного проекта на Scala


                               Марат Ахин

                       Application Developer Days – 3


                               12-05-2012



http://ice-phoenix.info/info
Scala EE

Scala
   Объектно-ориентированный и функциональный язык
   программирования
   Обладает очень выразительной системой типов
   Выполняется на Java Virtual Machine (JVM)

Java EE
   Набор технологий для разработки серверных приложений
   Расширяет Java SE
   Позволяет сфокусироваться на бизнес-логике




           Марат Ахин (СПбГПУ)        Scala EE    2012    2 / 47
Пилотный проект




       Марат Ахин (СПбГПУ)   Scala EE   2012   3 / 47
Java EE




          Марат Ахин (СПбГПУ)   Scala EE   2012   4 / 47
Что такое хорошо, что такое плохо

Интероперабельность между Scala и Java
   Способность вызывать Java из Scala и наоборот
   Прозрачная работа с объектами Scala в Java и наоборот

Использование Scala вместо Java
   Большая выразительность Scala
   Разница в производительности между Scala и Java




         Марат Ахин (СПбГПУ)            Scala EE     2012   5 / 47
Проблемы с производительностью




       Марат Ахин (СПбГПУ)   Scala EE   2012   6 / 47
Проблемы с производительностью
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 + e
7      }
8       v a l end = System . currentTimeMillis ()
9   }


               Аналогичный код на Java выполняется за 30 мс1

                     За сколько выполняется код на Scala?

      1
          на сферической тестовой машине в вакууме
                  Марат Ахин (СПбГПУ)                Scala EE   2012   7 / 47
Проблемы с производительностью
    Все дело в том, что...
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
Проблемы с коллекциями

HashMap Read / Write Performance
   java.util.HashMap: 1x / 1x
   scala.collection.immutable.HashMap: 2.5x / 4x
   scala.collection.mutable.HashMap: 1.05x / 1.05x

TreeMap Read / Write Performance
   java.util.TreeMap: 1x / 1x
   scala.collection.immutable.TreeMap: 1.5x / 2x




          Марат Ахин (СПбГПУ)               Scala EE   2012   9 / 47
Проблемы с коллекциями

    Почему immutable.HashMap так важен?
        Scala по умолчанию использует immutable коллекции
        Многие операции неявно приводят к созданию
        immutable.HashMap

1   d e f initCache ( rs : List [ ActionStatus ]) {
2      cache = rs
3               . map ( e = ( e . getName , e ) )
                           >
4               . toMap [ String , ServerStatus ]
5   }

        Понятный код на Scala не всегда приводит к понятным
                            результатам

              Марат Ахин (СПбГПУ)           Scala EE   2012   10 / 47
Скорость компиляции




       Марат Ахин (СПбГПУ)   Scala EE   2012   11 / 47
Скорость компиляции

java : core-common       : 2 s
java : core-database     : 2 s
java : core-business     : 2 s
java : core-integration : 1 s
java : ws-one            : 1 s
java : ws-two            : 1 s
java : ws-three          : 1 s
+++++++++++++++++++++++++++++++
java : total             : 10 s

Total Java code size: ≈ 60 KSLOC



         Марат Ахин (СПбГПУ)       Scala EE   2012   12 / 47
Скорость компиляции

scala : core-common      : 16 s
scala : core-database    : 13 s
scala : core-business    : 13 s
scala : core-integration : 6 s
scala : ws-one           : 8 s
scala : ws-two           : 10 s
scala : ws-three         : 6 s
+++++++++++++++++++++++++++++++
scala : total            : 72 s

Total Scala code size: ≈ 8 KSLOC



         Марат Ахин (СПбГПУ)       Scala EE   2012   13 / 47
Скорость компиляции

Почему?
   Система типов Scala
       Вывод типов
       Неявные преобразования типов
       Множество расширений по сравнению с Java

    За богатые выразительные возможности приходится
           расплачиваться временем компиляции




          Марат Ахин (СПбГПУ)           Scala EE   2012   14 / 47
Интероперабельность




       Марат Ахин (СПбГПУ)   Scala EE   2012   15 / 47
Интероперабельность

  Способность прозрачным образом работать с объектами и
         вызывать методы одного языка из другого




         Марат Ахин (СПбГПУ)          Scala EE    2012    16 / 47
Интероперабельность

    Scala -> Java
        Все объекты Java являются полноценными объектами Scala
        Все методы Java могут быть вызваны в Scala
        Все библиотеки Java доступны в Scala

1   v a r ServiceUrl =
2      new URL ( " http :// web - service . net / ws / foo " )
3

4   d e f HttpAuthToken =
5      DatatypeConverter . printBase64Binary (
6         ( User + " : " + Password ) . getBytes )




                Марат Ахин (СПбГПУ)               Scala EE       2012   17 / 47
Интероперабельность




       Марат Ахин (СПбГПУ)   Scala EE   2012   18 / 47
Интероперабельность




       Марат Ахин (СПбГПУ)   Scala EE   2012   19 / 47
Интероперабельность

Java -> Scala
   Все объекты Scala являются полноценными объектами Java
   Все методы Scala могут быть вызваны в Java
   Все библиотеки Scala доступны в Java

Но есть одна проблема...
    Scala компилируется в очень специфический Java код




         Марат Ахин (СПбГПУ)           Scala EE    2012   20 / 47
Специфический код
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
Очень специфический код
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
Совсем уж специфический код
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 x01
5              // ...
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
И снова о компиляции

Стандартная схема компиляции
             javac *.java -> scalac *.scala

    Все помнят проблемы со временем компиляции Scala?

Расширенная схема компиляции
      scalac * -> javac *.java -> scalac *.scala

                               А теперь?




         Марат Ахин (СПбГПУ)               Scala EE   2012   24 / 47
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 . slf4j
2   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
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
Надежды нет?




       Марат Ахин (СПбГПУ)   Scala EE   2012   27 / 47
Надежды нет?

Единственное преимущество в использовании Scala вместо Java




         Марат Ахин (СПбГПУ)            Scala EE   2012   28 / 47
Надежды нет?


Scala позволяет писать более лаконичный и выразительный код

   Сопоставление с образцом
   Вывод типов
   Функции высших порядков
   Структурные типы




         Марат Ахин (СПбГПУ)            Scala EE   2012   29 / 47
Pattern matching




        Марат Ахин (СПбГПУ)   Scala EE   2012   30 / 47
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
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 nodes
12         }
13      }
14   }


               Марат Ахин (СПбГПУ)         Scala EE   2012   32 / 47
Pattern matching
1   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
Вывод типов




       Марат Ахин (СПбГПУ)   Scala EE   2012   34 / 47
Вывод типов

    В Scala используется Colored Local Type Inference
        Можно опускать указание типов в выражениях
        Можно опускать указание типа возвращаемого значения
        метода2

1   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
Вывод типов

    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   }
6

7   @EJB
8   v a r event : EventProcess orBeanLocal = _


              Марат Ахин (СПбГПУ)           Scala EE    2012    36 / 47
Вывод типов
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
Функции высших порядков




       Марат Ахин (СПбГПУ)   Scala EE   2012   38 / 47
Функции высших порядков

    Функции высших порядков
       могут принимать в качестве аргументов другие функции
       могут возвращать в качестве результата другие функции
       могут являться значением

1   d e f apply [V , R ]( f : V = R , v : V ) : R = f ( v )
                                 >
2

3   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
Функции высших порядков
 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   }
10

11   v a l convs = List ( summary _ , details _ )

      Функции высших порядков позволяют экономить и не плодить
                         лишние сущности

               Марат Ахин (СПбГПУ)           Scala EE      2012   40 / 47
Структурная типизация




       Марат Ахин (СПбГПУ)   Scala EE   2012   41 / 47
Структурная типизация

     Отношения между типами задаются неявно, через их структуру
 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   }
10

11   t y p e Figure = {
12          d e f area : Double
13          d e f perimeter : Double
14   }
                Марат Ахин (СПбГПУ)          Scala EE   2012   42 / 47
Структурная типизация
    Задача: сгенерировать 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 . longValue
5         )
6   }
    Вариант №1: дополнительный интерфейс
1   t r a i t Idable {
2           d e f getId : JInteger
3   }
4

5   d e f generateFromId ( o : Idable ) = {
6         generate (o , o . getId )
7   }
               Марат Ахин (СПбГПУ)            Scala EE    2012   43 / 47
Структурная типизация
    Вариант №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
И все же...




         Марат Ахин (СПбГПУ)   Scala EE   2012   45 / 47
И все же...

Миф или реальность?
        Реальность (причем чем дальше, тем реальнее)

Стоит ли мне использовать Scala?
Да, если Вы
    готовы потратить время на ее изучение
    не боитесь преодолевать трудности
    понимаете, что полностью избавиться от Java не получится




          Марат Ахин (СПбГПУ)            Scala EE   2012   46 / 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      }) * normalizeCoeff
7   }
8

9   apply ( rate _ , self )




              Марат Ахин (СПбГПУ)     Scala EE   2012   47 / 47

More Related Content

What's hot

C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.Igor Shkulipa
 
05 - Java. Collections Framework и Generics
05 - Java. Collections Framework и Generics05 - Java. Collections Framework и Generics
05 - Java. Collections Framework и GenericsRoman Brovko
 
Unsafe: to be or to be removed?
Unsafe: to be or to be removed?Unsafe: to be or to be removed?
Unsafe: to be or to be removed?Alexey Fyodorov
 
08 - Java. Java-классы: взгляд изнутри
08 - Java. Java-классы: взгляд изнутри08 - Java. Java-классы: взгляд изнутри
08 - Java. Java-классы: взгляд изнутриRoman Brovko
 
11 - Java. Многопоточность в Java: средства стандартной библиотеки
11 - Java. Многопоточность в Java:  средства стандартной библиотеки11 - Java. Многопоточность в Java:  средства стандартной библиотеки
11 - Java. Многопоточность в Java: средства стандартной библиотекиRoman Brovko
 
C# Desktop. Занятие 07.
C# Desktop. Занятие 07.C# Desktop. Занятие 07.
C# Desktop. Занятие 07.Igor Shkulipa
 
C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.Igor Shkulipa
 
C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.Igor Shkulipa
 
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)aragozin
 
Legacy: как победить в гонке (Joker)
Legacy: как победить в гонке (Joker)Legacy: как победить в гонке (Joker)
Legacy: как победить в гонке (Joker)Victor_Cr
 
Память в Java. Garbage Collector
Память в Java. Garbage CollectorПамять в Java. Garbage Collector
Память в Java. Garbage CollectorOlexandra Dmytrenko
 
12 - Java. Разработка сетевых приложений на Java
12 - Java. Разработка сетевых приложений на Java12 - Java. Разработка сетевых приложений на Java
12 - Java. Разработка сетевых приложений на JavaRoman Brovko
 
06 - Java. Ввод/вывод, доступ к файловой системе
06 - Java. Ввод/вывод, доступ к файловой системе06 - Java. Ввод/вывод, доступ к файловой системе
06 - Java. Ввод/вывод, доступ к файловой системеRoman Brovko
 

What's hot (14)

C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.
 
05 - Java. Collections Framework и Generics
05 - Java. Collections Framework и Generics05 - Java. Collections Framework и Generics
05 - Java. Collections Framework и Generics
 
Unsafe: to be or to be removed?
Unsafe: to be or to be removed?Unsafe: to be or to be removed?
Unsafe: to be or to be removed?
 
08 - Java. Java-классы: взгляд изнутри
08 - Java. Java-классы: взгляд изнутри08 - Java. Java-классы: взгляд изнутри
08 - Java. Java-классы: взгляд изнутри
 
11 - Java. Многопоточность в Java: средства стандартной библиотеки
11 - Java. Многопоточность в Java:  средства стандартной библиотеки11 - Java. Многопоточность в Java:  средства стандартной библиотеки
11 - Java. Многопоточность в Java: средства стандартной библиотеки
 
C# Desktop. Занятие 07.
C# Desktop. Занятие 07.C# Desktop. Занятие 07.
C# Desktop. Занятие 07.
 
C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.
 
New Android NDK & JNI
New Android NDK & JNINew Android NDK & JNI
New Android NDK & JNI
 
C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.
 
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
 
Legacy: как победить в гонке (Joker)
Legacy: как победить в гонке (Joker)Legacy: как победить в гонке (Joker)
Legacy: как победить в гонке (Joker)
 
Память в Java. Garbage Collector
Память в Java. Garbage CollectorПамять в Java. Garbage Collector
Память в Java. Garbage Collector
 
12 - Java. Разработка сетевых приложений на Java
12 - Java. Разработка сетевых приложений на Java12 - Java. Разработка сетевых приложений на Java
12 - Java. Разработка сетевых приложений на Java
 
06 - Java. Ввод/вывод, доступ к файловой системе
06 - Java. Ввод/вывод, доступ к файловой системе06 - Java. Ввод/вывод, доступ к файловой системе
06 - Java. Ввод/вывод, доступ к файловой системе
 

Viewers also liked

Pruebas acceso ciclos
Pruebas acceso ciclosPruebas acceso ciclos
Pruebas acceso ciclosetxebazter
 
Bloque de cierre
Bloque de cierreBloque de cierre
Bloque de cierrealonsoh
 
Ii encuentros orientacion
Ii encuentros orientacionIi encuentros orientacion
Ii encuentros orientacionetxebazter
 
Banca y movilidad, cuestión de velocidad
Banca y movilidad, cuestión de velocidadBanca y movilidad, cuestión de velocidad
Banca y movilidad, cuestión de velocidadPol Navarro
 
Expo Corregida
Expo CorregidaExpo Corregida
Expo CorregidaXxhevsxX
 
Isummit red social de aprendizaje
Isummit red social de aprendizajeIsummit red social de aprendizaje
Isummit red social de aprendizajeKarla Ordoñez
 
Lo que los estudiantes deben saber
Lo que los estudiantes deben saberLo que los estudiantes deben saber
Lo que los estudiantes deben saberJeannette Cañuta
 
Seminario 1 consuelo balanda
Seminario 1 consuelo balandaSeminario 1 consuelo balanda
Seminario 1 consuelo balandaConsuelo Balanda
 
Aceleración de tcp ip - javier condori flores
Aceleración de tcp  ip - javier condori floresAceleración de tcp  ip - javier condori flores
Aceleración de tcp ip - javier condori floresJavier Condori Flores
 
El diseñador en la Sociedad del Conocimiento. Texto
El diseñador en la Sociedad del Conocimiento. TextoEl diseñador en la Sociedad del Conocimiento. Texto
El diseñador en la Sociedad del Conocimiento. TextoTeresa Jular
 
Informe de Gestión Coordinación Nal Eliana Santos Echavarría octubre 2013
Informe de Gestión Coordinación Nal Eliana Santos Echavarría octubre 2013Informe de Gestión Coordinación Nal Eliana Santos Echavarría octubre 2013
Informe de Gestión Coordinación Nal Eliana Santos Echavarría octubre 2013Eliana Santos
 
E turismo comunicando de forma relevante octubre 2010
E turismo comunicando de forma relevante octubre 2010E turismo comunicando de forma relevante octubre 2010
E turismo comunicando de forma relevante octubre 2010Joantxo Llantada
 
Manual procedimiento orientacion 2011
Manual procedimiento orientacion 2011Manual procedimiento orientacion 2011
Manual procedimiento orientacion 2011Luis Subiabre Salviat
 

Viewers also liked (20)

Pruebas acceso ciclos
Pruebas acceso ciclosPruebas acceso ciclos
Pruebas acceso ciclos
 
Hamelingo hezitzailea
Hamelingo hezitzaileaHamelingo hezitzailea
Hamelingo hezitzailea
 
Bloque de cierre
Bloque de cierreBloque de cierre
Bloque de cierre
 
Ii encuentros orientacion
Ii encuentros orientacionIi encuentros orientacion
Ii encuentros orientacion
 
Isummit loxa 2010
Isummit loxa 2010Isummit loxa 2010
Isummit loxa 2010
 
Banca y movilidad, cuestión de velocidad
Banca y movilidad, cuestión de velocidadBanca y movilidad, cuestión de velocidad
Banca y movilidad, cuestión de velocidad
 
Sonora
SonoraSonora
Sonora
 
Expo Corregida
Expo CorregidaExpo Corregida
Expo Corregida
 
Isummit red social de aprendizaje
Isummit red social de aprendizajeIsummit red social de aprendizaje
Isummit red social de aprendizaje
 
Lo que los estudiantes deben saber
Lo que los estudiantes deben saberLo que los estudiantes deben saber
Lo que los estudiantes deben saber
 
Alianzas
AlianzasAlianzas
Alianzas
 
Mrp cassa
Mrp cassaMrp cassa
Mrp cassa
 
Modulo 7
Modulo 7Modulo 7
Modulo 7
 
Seminario 1 consuelo balanda
Seminario 1 consuelo balandaSeminario 1 consuelo balanda
Seminario 1 consuelo balanda
 
Aceleración de tcp ip - javier condori flores
Aceleración de tcp  ip - javier condori floresAceleración de tcp  ip - javier condori flores
Aceleración de tcp ip - javier condori flores
 
El diseñador en la Sociedad del Conocimiento. Texto
El diseñador en la Sociedad del Conocimiento. TextoEl diseñador en la Sociedad del Conocimiento. Texto
El diseñador en la Sociedad del Conocimiento. Texto
 
Informe de Gestión Coordinación Nal Eliana Santos Echavarría octubre 2013
Informe de Gestión Coordinación Nal Eliana Santos Echavarría octubre 2013Informe de Gestión Coordinación Nal Eliana Santos Echavarría octubre 2013
Informe de Gestión Coordinación Nal Eliana Santos Echavarría octubre 2013
 
Van der weyden
Van der weydenVan der weyden
Van der weyden
 
E turismo comunicando de forma relevante octubre 2010
E turismo comunicando de forma relevante octubre 2010E turismo comunicando de forma relevante octubre 2010
E turismo comunicando de forma relevante octubre 2010
 
Manual procedimiento orientacion 2011
Manual procedimiento orientacion 2011Manual procedimiento orientacion 2011
Manual procedimiento orientacion 2011
 

Similar to Scala EE: Myth or Reality?

Scala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentScala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentAnton Kirillov
 
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Magneta AI
 
Dart - светлая сторона силы?
Dart - светлая сторона силы?Dart - светлая сторона силы?
Dart - светлая сторона силы?Mikhail Davydov
 
Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12Alex Tutubalin
 
Доклад на Highload-2012
Доклад на Highload-2012Доклад на Highload-2012
Доклад на Highload-2012Alex Tutubalin
 
ECMAscript harmony
ECMAscript harmonyECMAscript harmony
ECMAscript harmonyFDConf
 
Lift, play, akka, rails part1
Lift, play, akka, rails part1Lift, play, akka, rails part1
Lift, play, akka, rails part1Eduard Antsupov
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)Alex Filatov
 
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...Stfalcon Meetups
 
Java 9 модули
Java 9 модулиJava 9 модули
Java 9 модулиZheka Kozlov
 
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)Ontico
 
Язык программирования PascalABC.NET 2015. Новые возможности
Язык программирования PascalABC.NET 2015. Новые возможностиЯзык программирования PascalABC.NET 2015. Новые возможности
Язык программирования PascalABC.NET 2015. Новые возможностиМихалкович Станислав
 
JavaScript & modern scala backend
JavaScript & modern scala backendJavaScript & modern scala backend
JavaScript & modern scala backendGeeksLab Odessa
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPMikhail Kurnosov
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй этоRoman Dvornov
 
Электронные рельсы в облаках. Oracle Public Cloud для разработчиков
Электронные рельсы в облаках. Oracle Public Cloud для разработчиковЭлектронные рельсы в облаках. Oracle Public Cloud для разработчиков
Электронные рельсы в облаках. Oracle Public Cloud для разработчиковДенис Евдокимов
 

Similar to Scala EE: Myth or Reality? (20)

Scala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentScala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application Development
 
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
 
Dart - светлая сторона силы?
Dart - светлая сторона силы?Dart - светлая сторона силы?
Dart - светлая сторона силы?
 
Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12
 
Scala for android
Scala for androidScala for android
Scala for android
 
Доклад на Highload-2012
Доклад на Highload-2012Доклад на Highload-2012
Доклад на Highload-2012
 
ECMAscript harmony
ECMAscript harmonyECMAscript harmony
ECMAscript harmony
 
Lift, play, akka, rails part1
Lift, play, akka, rails part1Lift, play, akka, rails part1
Lift, play, akka, rails part1
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)
 
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
 
Java 9 модули
Java 9 модулиJava 9 модули
Java 9 модули
 
Java 9 - Back to the Future
Java 9 - Back to the FutureJava 9 - Back to the Future
Java 9 - Back to the Future
 
Scala On Rest
Scala On RestScala On Rest
Scala On Rest
 
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
 
Язык программирования PascalABC.NET 2015. Новые возможности
Язык программирования PascalABC.NET 2015. Новые возможностиЯзык программирования PascalABC.NET 2015. Новые возможности
Язык программирования PascalABC.NET 2015. Новые возможности
 
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
 
JavaScript & modern scala backend
JavaScript & modern scala backendJavaScript & modern scala backend
JavaScript & modern scala backend
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
Электронные рельсы в облаках. Oracle Public Cloud для разработчиков
Электронные рельсы в облаках. Oracle Public Cloud для разработчиковЭлектронные рельсы в облаках. Oracle Public Cloud для разработчиков
Электронные рельсы в облаках. Oracle Public Cloud для разработчиков
 

More from Marat Akhin

Тестирование ПО (2016)
Тестирование ПО (2016)Тестирование ПО (2016)
Тестирование ПО (2016)Marat Akhin
 
Чудеса производительности
Чудеса производительностиЧудеса производительности
Чудеса производительностиMarat Akhin
 
Mining Software Repositories: Using Humans to Better Software
Mining Software Repositories: Using Humans to Better SoftwareMining Software Repositories: Using Humans to Better Software
Mining Software Repositories: Using Humans to Better SoftwareMarat Akhin
 
Дебаггинг
ДебаггингДебаггинг
ДебаггингMarat Akhin
 
Регрессионное тестирование
Регрессионное тестированиеРегрессионное тестирование
Регрессионное тестированиеMarat Akhin
 
Случайное тестирование
Случайное тестированиеСлучайное тестирование
Случайное тестированиеMarat Akhin
 
Тестовый оракул: что, где, когда
Тестовый оракул: что, где, когдаТестовый оракул: что, где, когда
Тестовый оракул: что, где, когдаMarat Akhin
 
Полнота тестирования ПО
Полнота тестирования ПОПолнота тестирования ПО
Полнота тестирования ПОMarat Akhin
 
Проблема наблюдаемости
Проблема наблюдаемостиПроблема наблюдаемости
Проблема наблюдаемостиMarat Akhin
 
Проблема тестовых входных данных
Проблема тестовых входных данныхПроблема тестовых входных данных
Проблема тестовых входных данныхMarat Akhin
 
Тестирование программного обеспечения: что, зачем и почему?
Тестирование программного обеспечения: что, зачем и почему?Тестирование программного обеспечения: что, зачем и почему?
Тестирование программного обеспечения: что, зачем и почему?Marat Akhin
 

More from Marat Akhin (11)

Тестирование ПО (2016)
Тестирование ПО (2016)Тестирование ПО (2016)
Тестирование ПО (2016)
 
Чудеса производительности
Чудеса производительностиЧудеса производительности
Чудеса производительности
 
Mining Software Repositories: Using Humans to Better Software
Mining Software Repositories: Using Humans to Better SoftwareMining Software Repositories: Using Humans to Better Software
Mining Software Repositories: Using Humans to Better Software
 
Дебаггинг
ДебаггингДебаггинг
Дебаггинг
 
Регрессионное тестирование
Регрессионное тестированиеРегрессионное тестирование
Регрессионное тестирование
 
Случайное тестирование
Случайное тестированиеСлучайное тестирование
Случайное тестирование
 
Тестовый оракул: что, где, когда
Тестовый оракул: что, где, когдаТестовый оракул: что, где, когда
Тестовый оракул: что, где, когда
 
Полнота тестирования ПО
Полнота тестирования ПОПолнота тестирования ПО
Полнота тестирования ПО
 
Проблема наблюдаемости
Проблема наблюдаемостиПроблема наблюдаемости
Проблема наблюдаемости
 
Проблема тестовых входных данных
Проблема тестовых входных данныхПроблема тестовых входных данных
Проблема тестовых входных данных
 
Тестирование программного обеспечения: что, зачем и почему?
Тестирование программного обеспечения: что, зачем и почему?Тестирование программного обеспечения: что, зачем и почему?
Тестирование программного обеспечения: что, зачем и почему?
 

Scala EE: Myth or Reality?

  • 1. Scala EE: миф или реальность? или Стоит ли мне использовать Scala? или Об истории одного проекта на Scala Марат Ахин Application Developer Days – 3 12-05-2012 http://ice-phoenix.info/info
  • 2. Scala EE Scala Объектно-ориентированный и функциональный язык программирования Обладает очень выразительной системой типов Выполняется на Java Virtual Machine (JVM) Java EE Набор технологий для разработки серверных приложений Расширяет Java SE Позволяет сфокусироваться на бизнес-логике Марат Ахин (СПбГПУ) Scala EE 2012 2 / 47
  • 3. Пилотный проект Марат Ахин (СПбГПУ) Scala EE 2012 3 / 47
  • 4. Java EE Марат Ахин (СПбГПУ) Scala EE 2012 4 / 47
  • 5. Что такое хорошо, что такое плохо Интероперабельность между Scala и Java Способность вызывать Java из Scala и наоборот Прозрачная работа с объектами Scala в Java и наоборот Использование Scala вместо Java Большая выразительность Scala Разница в производительности между Scala и Java Марат Ахин (СПбГПУ) Scala EE 2012 5 / 47
  • 6. Проблемы с производительностью Марат Ахин (СПбГПУ) Scala EE 2012 6 / 47
  • 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 + e 7 } 8 v a l end = System . currentTimeMillis () 9 } Аналогичный код на Java выполняется за 30 мс1 За сколько выполняется код на Scala? 1 на сферической тестовой машине в вакууме Марат Ахин (СПбГПУ) Scala EE 2012 7 / 47
  • 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. Проблемы с коллекциями HashMap Read / Write Performance java.util.HashMap: 1x / 1x scala.collection.immutable.HashMap: 2.5x / 4x scala.collection.mutable.HashMap: 1.05x / 1.05x TreeMap Read / Write Performance java.util.TreeMap: 1x / 1x scala.collection.immutable.TreeMap: 1.5x / 2x Марат Ахин (СПбГПУ) Scala EE 2012 9 / 47
  • 10. Проблемы с коллекциями Почему immutable.HashMap так важен? Scala по умолчанию использует immutable коллекции Многие операции неявно приводят к созданию immutable.HashMap 1 d e f initCache ( rs : List [ ActionStatus ]) { 2 cache = rs 3 . map ( e = ( e . getName , e ) ) > 4 . toMap [ String , ServerStatus ] 5 } Понятный код на Scala не всегда приводит к понятным результатам Марат Ахин (СПбГПУ) Scala EE 2012 10 / 47
  • 11. Скорость компиляции Марат Ахин (СПбГПУ) Scala EE 2012 11 / 47
  • 12. Скорость компиляции java : core-common : 2 s java : core-database : 2 s java : core-business : 2 s java : core-integration : 1 s java : ws-one : 1 s java : ws-two : 1 s java : ws-three : 1 s +++++++++++++++++++++++++++++++ java : total : 10 s Total Java code size: ≈ 60 KSLOC Марат Ахин (СПбГПУ) Scala EE 2012 12 / 47
  • 13. Скорость компиляции scala : core-common : 16 s scala : core-database : 13 s scala : core-business : 13 s scala : core-integration : 6 s scala : ws-one : 8 s scala : ws-two : 10 s scala : ws-three : 6 s +++++++++++++++++++++++++++++++ scala : total : 72 s Total Scala code size: ≈ 8 KSLOC Марат Ахин (СПбГПУ) Scala EE 2012 13 / 47
  • 14. Скорость компиляции Почему? Система типов Scala Вывод типов Неявные преобразования типов Множество расширений по сравнению с Java За богатые выразительные возможности приходится расплачиваться временем компиляции Марат Ахин (СПбГПУ) Scala EE 2012 14 / 47
  • 15. Интероперабельность Марат Ахин (СПбГПУ) Scala EE 2012 15 / 47
  • 16. Интероперабельность Способность прозрачным образом работать с объектами и вызывать методы одного языка из другого Марат Ахин (СПбГПУ) Scala EE 2012 16 / 47
  • 17. Интероперабельность Scala -> Java Все объекты Java являются полноценными объектами Scala Все методы Java могут быть вызваны в Scala Все библиотеки Java доступны в Scala 1 v a r ServiceUrl = 2 new URL ( " http :// web - service . net / ws / foo " ) 3 4 d e f HttpAuthToken = 5 DatatypeConverter . printBase64Binary ( 6 ( User + " : " + Password ) . getBytes ) Марат Ахин (СПбГПУ) Scala EE 2012 17 / 47
  • 18. Интероперабельность Марат Ахин (СПбГПУ) Scala EE 2012 18 / 47
  • 19. Интероперабельность Марат Ахин (СПбГПУ) Scala EE 2012 19 / 47
  • 20. Интероперабельность Java -> Scala Все объекты Scala являются полноценными объектами Java Все методы Scala могут быть вызваны в Java Все библиотеки Scala доступны в Java Но есть одна проблема... Scala компилируется в очень специфический Java код Марат Ахин (СПбГПУ) Scala EE 2012 20 / 47
  • 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. Очень специфический код 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. Совсем уж специфический код 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 x01 5 // ... 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. И снова о компиляции Стандартная схема компиляции javac *.java -> scalac *.scala Все помнят проблемы со временем компиляции Scala? Расширенная схема компиляции scalac * -> javac *.java -> scalac *.scala А теперь? Марат Ахин (СПбГПУ) Scala EE 2012 24 / 47
  • 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 . slf4j 2 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. 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. Надежды нет? Марат Ахин (СПбГПУ) Scala EE 2012 27 / 47
  • 28. Надежды нет? Единственное преимущество в использовании Scala вместо Java Марат Ахин (СПбГПУ) Scala EE 2012 28 / 47
  • 29. Надежды нет? Scala позволяет писать более лаконичный и выразительный код Сопоставление с образцом Вывод типов Функции высших порядков Структурные типы Марат Ахин (СПбГПУ) Scala EE 2012 29 / 47
  • 30. Pattern matching Марат Ахин (СПбГПУ) Scala EE 2012 30 / 47
  • 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. 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 nodes 12 } 13 } 14 } Марат Ахин (СПбГПУ) Scala EE 2012 32 / 47
  • 33. Pattern matching 1 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. Вывод типов Марат Ахин (СПбГПУ) Scala EE 2012 34 / 47
  • 35. Вывод типов В Scala используется Colored Local Type Inference Можно опускать указание типов в выражениях Можно опускать указание типа возвращаемого значения метода2 1 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. Вывод типов 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 } 6 7 @EJB 8 v a r event : EventProcess orBeanLocal = _ Марат Ахин (СПбГПУ) Scala EE 2012 36 / 47
  • 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. Функции высших порядков Марат Ахин (СПбГПУ) Scala EE 2012 38 / 47
  • 39. Функции высших порядков Функции высших порядков могут принимать в качестве аргументов другие функции могут возвращать в качестве результата другие функции могут являться значением 1 d e f apply [V , R ]( f : V = R , v : V ) : R = f ( v ) > 2 3 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. Функции высших порядков 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 } 10 11 v a l convs = List ( summary _ , details _ ) Функции высших порядков позволяют экономить и не плодить лишние сущности Марат Ахин (СПбГПУ) Scala EE 2012 40 / 47
  • 41. Структурная типизация Марат Ахин (СПбГПУ) Scala EE 2012 41 / 47
  • 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 } 10 11 t y p e Figure = { 12 d e f area : Double 13 d e f perimeter : Double 14 } Марат Ахин (СПбГПУ) Scala EE 2012 42 / 47
  • 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 . longValue 5 ) 6 } Вариант №1: дополнительный интерфейс 1 t r a i t Idable { 2 d e f getId : JInteger 3 } 4 5 d e f generateFromId ( o : Idable ) = { 6 generate (o , o . getId ) 7 } Марат Ахин (СПбГПУ) Scala EE 2012 43 / 47
  • 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. И все же... Марат Ахин (СПбГПУ) Scala EE 2012 45 / 47
  • 46. И все же... Миф или реальность? Реальность (причем чем дальше, тем реальнее) Стоит ли мне использовать Scala? Да, если Вы готовы потратить время на ее изучение не боитесь преодолевать трудности понимаете, что полностью избавиться от Java не получится Марат Ахин (СПбГПУ) Scala EE 2012 46 / 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 }) * normalizeCoeff 7 } 8 9 apply ( rate _ , self ) Марат Ахин (СПбГПУ) Scala EE 2012 47 / 47