Page 1
1
POR QUE SUA PRÓXIMA APLICAÇÃO WEB DEVE SER EM CLOJURE?
Eduardo Aquiles Radanovitsck - @eduaquiles
Page 2
2
Minha jornada até agora...
Page 3
3
QUEM SOU EU?Desenvolvedor & consultor na TW desde 2010
Java, C#, Clojure, JavaScript
EUA, Ecuador, Escócia
Page 4
4
No TDC Floripa... Convencer pelo menos um de vocês a usar Clojure no próximo projeto
...e que Clojure conquiste o mundo (amanhã à noite)
Page 5
5
AGENDA Sintaxe REPL Testes Dados ou objetos do domínio Funções Imutabilidade JVM WEB
Page 6
println “Hello, TDC!”)(
Page 7
7
SINTAXE
Lista de símbolos onde o primeiro é invocado
passando o resto como argumento
Page 9
(* 2 3 4) => 24
((fn [n] (* 2 n)) 2) => 4
(map inc [1 2 3]) => (2 3 4)
Page 11
11
REPLRead-eval-print loop
(interpretador)
Experimentação com a linguagem
Page 13
» lein repl
user=> (def foo 2)#'user/foo
Page 14
» lein repl
user=> (foo)ClassCastException java.lang.Long cannot be cast to clojure.lang.IFn user/eval1265
Page 15
» lein repl
user=> foo2
Page 16
» lein repl
user=> (def foo 2)#'user/foo
user=> (foo)ClassCastException java.lang.Long cannot be cast to clojure.lang.IFn user/eval1265
user=> foo2
Page 17
17
TESTES
Testes são tão intrínsicos na linguagem que estão
na biblioteca padrão
Page 18
(require '[clojure.test :refer :all])
(deftest sum (is (= 5 (+ 2 3))))
(run-tests)
Testing user
Ran 1 tests containing 1 assertions.0 failures, 0 errors.{:test 1, :pass 1, :fail 0, :error 0, :type :summary}
Page 20
20
DADOS / OBJETOS DO DOMÍNIO
entidades lógicas
Page 21
;apresentador{:nome “Eduardo”}
;outro exemplo de apresentador{:nome “Eduardo Aquiles” :idade 28}
;cotação do dólar[3.49 3.57 3.54]
Page 22
22
Dados usam estruturas da linguagem e são
explícitos para tornar fácil a argumentação em
cima deles
Page 23
23
FUNÇÕES
Operações ou computações em cima
de dados
Valores entram, valor sai
Page 24
(defn modulo [valor](if (> 0 valor)
(* -1 valor)valor
))
(deftest test-modulo(is (= 2 (modulo -2)))(is (= 2 (modulo 2))))
{:test 1, :pass 2, :fail 0, :error 0, :type :summary}
Page 26
26
IMUTABILIDADE
Ou… como remover uma classe inteira de defeitos
do seu sistema
Page 27
(def my-vec [1 2 3])
(conj my-vec 4) => [1 2 3 4]
my-vec => [1 2 3]
Page 28
28
Estruturas de dados persistentes
Favorece concorrência
Page 29
29
Defeitos envolvendo mutabilidade são
complexos e custosos para se corrigir
Page 30
30
Linguagem permite mutabilidade, mas torna
ato explícito
Page 31
31
JVM
VM como plataforma
Page 32
32
GC
tipos
Interop (java >>> C)
Page 33
(java.lang.Math/pow 2 3) => 8.0
Page 35
35
Sintaxe – bastante simples: listas para todos os lados REPL – experimentação e rápido feedback Testes – não preciso escolher um framework Dados – uso a melhor estrutura de dados que a própria linguagem já
oferece Funções – simplicidade Imutabilidade – menos bugs, mais concorrência JVM – acesso à classes do Java e bibliotecas
Page 36
36
E O QUE ISSO AJUDA COM UMA APLICAÇÃO WEB?
Page 37
37
JVM altamente otimizada, diversas ferramentas para monitoramento,
além de servidores HTTP disponíveis
Page 38
38
Imutabilidade por padrão significa que
interação entre requisições será menor
ou zero
Page 39
39
armazenamento →transformação →
apresentação
Fluxo se encaixa no modelo funcional
Page 40
40
Maioria das vezes estamos movendo dados
de uma lado para o outro – realmente
preciso criar um tipo?
Page 41
41
(slide obrigatório sobre ClojureScript)
Page 43
43
OBRIGADO!bit.ly/pq-clojure
Eduardo Aquiles Radanovitsck@eduaquiles
eduardoaquiles.ar@gmail.comeduardoaquiles@thoughtworks.com