Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Clojure é um Java melhor que Java - Codecon 2021

Clojure é um Java melhor que Java - Codecon 2021

Palestra sobre interop java x clojure

Ana Luiza Portello

April 23, 2021
Tweet

More Decks by Ana Luiza Portello

Other Decks in Programming

Transcript

  1. CLOJURE É UM
    JAVA MELHOR
    QUE JAVA

    View Slide

  2. Olá!
    Meu nome é Ana Bastos
    Sou engenheira de
    software(Nubank) e
    cientista da
    computação(PUC-SP).
    2
    anabastos
    @naluhh
    @anapbastos

    View Slide

  3. DISCLAIMER

    View Slide

  4. View Slide

  5. JAVA COMPILA
    BYTE
    CODE
    INTERPRETA
    JVM

    View Slide

  6. “We were after the C++ programmers.
    We managed to drag a lot of them
    about halfway to Lisp.”
    Guy Steele, co-author of the Java language specification

    View Slide

  7. REJECT COMPLEXITY
    RETURN TO (((())))

    View Slide

  8. Clojure é uma
    camadinha em cima
    do Java

    View Slide

  9. JAVA COMPILA
    BYTE
    CODE
    INTERPRETA
    JVM
    CLOJURE

    View Slide

  10. ● ECOSSISTEMA (Libs, Frameworks)
    EXTENSO
    ● TOOLING
    ● ESTABILIDADE
    ● COMUNIDADE

    View Slide

  11. SENTADO NO OMBRO
    DE GIGANTES

    View Slide

  12. FUNCIONAL
    DINAMICA
    TIPADA FORTEMENTE
    LISP

    View Slide

  13. FUNCIONAL 101

    View Slide

  14. FUNCOES PURAS

    View Slide

  15. X= 1
    NAO TEM COMO SER ALGO DIFERENTE DE 2
    f(x) = x + 1
    x x + 1
    f

    View Slide

  16. View Slide

  17. View Slide

  18. SIDE EFFECTS

    View Slide

  19. A partir do momento que você olhar pra
    um pedaço código não for o suficiente
    pra entender tudo você tem um
    side effect

    View Slide

  20. View Slide

  21. MUTAVEL

    View Slide

  22. INT: 1
    REF 21909
    COUNT
    COUNT++

    View Slide

  23. INT: 2
    REF 21909
    COUNT

    View Slide

  24. IMUTABILIDADE

    View Slide

  25. INT: 1
    REF 21909
    COUNT
    INC
    INT: 2
    REF 21909

    View Slide

  26. Clojure te encoraja a
    escrever funções
    puras com a
    imutabilidade
    porque suas
    estruturas são
    imutáveis

    View Slide

  27. NATIVE TYPES
    String “Ana”
    Int 42
    Dounle 2.0e64
    Ratio ¾
    Bool true, false
    Symbol concat, +
    Keyword :foo
    Null nil

    View Slide

  28. COLLECTIONS
    Lists (1 2 3 4)
    Vectors [1 2 3 4]
    Maps {:name “Ana”, :sobrenome “Bastos”}
    Sets #{1 2 3 4}.

    View Slide

  29. 󰞦
    🏎
    🏎
    🏎

    View Slide

  30. 󰞦
    🏎
    🏎
    🏎
    🚕
    🚙
    🤔

    View Slide

  31. CONTA
    CLIENTE
    TRANSACAO
    LIST
    PONTOS
    ENDERECO
    TRANSACAO
    TRANSACAO
    O CODIGO MISTURA NO MESMO LUGAR REGRAS
    DE NEGOCIO E REGRAS DE CONCORRENCIA.

    View Slide

  32. CONTA
    CLIENTE
    TRANSACAO
    LIST
    PONTOS
    ENDERECO
    TRANSACAO
    TRANSACAO
    ATOM

    View Slide

  33. CONTA
    CLIENTE
    TRANSACAO
    LIST
    PONTOS
    ENDERECO
    TRANSACAO
    TRANSACAO
    TRANSACAO

    View Slide

  34. https://danlebrero.com/2019/03/06/java-with-a-clojure-mindset/

    View Slide

  35. View Slide

  36. View Slide

  37. https://danlebrero.com/2019/03/06/java-with-a-clojure-mindset/
    ● ESTADO CONSISTENTE
    ● FUNCOES PURAS

    View Slide

  38. https://danlebrero.com/2019/03/06/java-with-a-clojure-mindset/
    ● INVARIANTES
    ● REASONING
    ● EASY SHARING

    View Slide

  39. BELEZA DE UM LISP

    View Slide

  40. View Slide

  41. FÁCIL?

    View Slide

  42. View Slide

  43. MAIS RAPIDO SER
    PRODUTIVO EM ALGO
    SIMPLES / FAMILIARES

    View Slide

  44. SIMPLES?

    View Slide

  45. View Slide

  46. View Slide

  47. View Slide

  48. Poucas variações fazem com que a
    interpretação fique mais simples e
    portanto a curva de aprendizagem tbm

    View Slide

  49. View Slide

  50. View Slide

  51. (fn arg…)

    View Slide

  52. (fn arg…)

    View Slide

  53. (+ 1 9 2)
    // Operador
    (println "CodeCon")
    // Funcao
    (require 'lib)
    // require
    (def x 10)

    View Slide

  54. (if valid? this that)
    (when valid? this)

    View Slide

  55. (def listinha [1 2 3])
    (conj listinha? 4)
    => [1 2 3 4]
    listinha => [1 2 3]

    View Slide

  56. (defn dobrar [x] (* x 2))
    (dobrar 4) => 8

    View Slide

  57. (defn dobrar [x] (* x 2))
    (let [y 10] (...))

    View Slide

  58. (defn dobrar [x] (* x 2))
    (let [x 10] (+ x 1))
    => 11

    View Slide

  59. (defn dobrar [x] (* x 2))
    (let [y 10] (dobrar y))
    => 20

    View Slide

  60. (defn dobrar [x] (* x 2))
    (let [y 10] (dobrar (+ 3 y)))
    => 26

    View Slide

  61. View Slide

  62. View Slide

  63. (println "CodeCon")
    Symbol String
    List

    View Slide

  64. "CodeCon"
    Obj String

    View Slide

  65. (println "CodeCon")

    View Slide

  66. (defn dobrar
    [x]
    (* x 2))
    Symbol FunctionName
    Lista com
    os args
    Corpo

    View Slide

  67. (printl “Oizi”)
    Symbol String

    View Slide

  68. Lisp tem a sintaxe das suas
    proprias estruturas de dados
    Chamamos isso de
    homoiconicidade

    View Slide

  69. Se você programa diretamente
    com as estruturas de dados,
    você fala a mesma linguagem
    que o compiler.

    View Slide

  70. A maior parte das linguagens
    tem uma sintaxe e gramatica
    especifica e VOCÊ sofreu pra
    aprender ela

    View Slide

  71. View Slide

  72. PARES

    View Slide

  73. View Slide

  74. View Slide

  75. CONSISTENCIA

    View Slide

  76. Lisp tem a
    mesma sintaxe
    desde 1958

    View Slide

  77. Clojure pode
    chamar tudo
    do java
    diretamente.

    View Slide

  78. (verbo & args)
    s-expression

    View Slide

  79. INVOCACAO METODO DE UMA
    INSTANCIA
    String s = "fred";
    System.out
    .println(s.toUpperCase());
    -> "FRED"
    (.toUpperCase "fred")
    -> "FRED"
    (.instanceMember instance args*)

    View Slide

  80. INVOCACAO METODO DE UMA
    INSTANCIA
    o.push(5); (.push o 5)
    (.instanceMember instance args*)

    View Slide

  81. INVOCACAO METODO DE UMA
    CLASSE
    String.class.getName()
    -> "java.lang.String"
    (.getName String)
    -> "java.lang.String"
    (.instanceMember Classname args*)

    View Slide

  82. CHAMANDO METODOS ESTATICOS DE
    UMA CLASSE
    System.getProperty("java
    .vm.version");
    -> "1.6.0_07-b06-57"
    (System/getProperty
    "java.vm.version")
    -> "1.6.0_07-b06-57"
    (Classname/staticMethod args*)

    View Slide

  83. ACESSANDO CAMPOS DE UMA INSTANCIA
    DE CLASSE
    Point p = new Point(4,6);
    p.x;
    -> 4
    (.-x (java.awt.Point. 4 6))
    -> 4
    (.-instanceField instance)

    View Slide

  84. Po mas e os parenteses? kkkkkkk

    View Slide

  85. View Slide

  86. PORQUE NAO
    COMPILA??

    View Slide

  87. SEM PONTO E VIRGULA!

    View Slide

  88. ESQUECEU DO RETURN

    View Slide

  89. ESQUECEU DO RETURN

    View Slide

  90. CONTAR OS
    PARENTESES

    View Slide

  91. https://danlebrero.com/2019/03/06/java-with-a-clojure-mindset/

    View Slide

  92. a.b().c().d();
    Classes podem ser passadas como
    argumentos para essa função?
    Eu não posso adaptar classes de outra
    biblioteca, preciso sei la, de um
    decorator

    View Slide

  93. View Slide

  94. ACESSANDO CAMPOS DE UMA INSTANCIA
    DE CLASSE
    Person
    .getAddress()
    .getZipcode()
    -> 01139010
    (.. person getAddress getZipcode)
    -> 01139010
    (.. instance-expr member+)
    (.. Classname-symbol member+)

    View Slide

  95. DOTO / Configuration Pattern
    Thread t = new
    Thread(runnable);
    t.setName("My Thread");
    t.setPriority(100);
    t.setUncaughtExceptionHandler (handler);
    t.start();
    (doto (Thread. runnable)
    (.setName "My Thread")
    (.setPriority 100)
    (.setUncaughtExceptionHandler handler)
    (.start))
    (.-instanceField instance)

    View Slide

  96. View Slide

  97. O site TodoBackend tem implementações de uma API de
    Todo-list production ready
    ● Clojure: 168 lines of Clojure (incluindo build
    configuration)
    ● Java 7 + Spring MVC: 555 lines of XML, 228 Java lines
    of code, 56 lines of Groovy
    ● Java 8 + Spring 4 Boot: 200 lines of Java, 37 lines of
    Groovy
    EXCLUINDO CODIGOS DE BIBLIOTECAS E FRAMEWORKS

    View Slide

  98. “Clojure shrinks our code base to about
    one-fifth the size it would be if we had
    written in Java”
    — Anthony Marcar, architect, WalmartLabs

    View Slide

  99. ● Overhead de proteção das suas
    estruturas de dados.
    ● Funcional tende a ser mais
    declarativo
    ● Evita boilerplates com a
    existencia de MACROS

    View Slide

  100. View Slide

  101. Null no java
    é um valor

    View Slide

  102. Clojure Java Interop A Better Java than Java - Stuart Halloway

    View Slide

  103. NIL PUNNING

    View Slide

  104. View Slide

  105. DYNAMIC vs
    STATIC TYPING

    View Slide

  106. List customers = new ArrayList();

    View Slide

  107. NOVA INSTANCIA
    new Object
    (new Object)
    (Object.)

    View Slide

  108. NOVA INSTANCIA
    new Object
    (new Object)
    (Object.)

    View Slide

  109. View Slide

  110. NAMESPACES AO INVES
    DE CLASSES

    View Slide

  111. View Slide

  112. View Slide

  113. ACESSANDO CAMPOS DE UMA DE CLASSE
    Math.PI
    -> 3.141592653589793
    Math/PI
    -> 3.141592653589793
    Classname/staticField

    View Slide

  114. View Slide

  115. View Slide

  116. FUNCOES AO INVES DE
    CLASSES

    View Slide

  117. O QUE ISSO ME DÁ?

    View Slide

  118. View Slide

  119. View Slide

  120. Cada nova classe ou estrutura
    vem com ZERO funcionalidade e
    é completamente isolado de
    outros códigos que já existem.
    O que aconteceria se eu usasse um Map cru?

    View Slide

  121. “It is better to have 100 functions operate
    on one data structure than to have 10
    functions operate on 10 data structures.”
    - Alan J. Perlis
    ORIENTADO A OBJETOS != ORIENTADO A DADOS

    View Slide

  122. ● BUSINESS LOGIC
    ● INFRASTRUCTURE
    CODE
    ● CONFIGURATION
    ● METADATA

    View Slide

  123. A ideia do clojure é sobre você lidar com
    listas de estruturas e de mapas de forma
    inteligente e não reinventar a roda

    View Slide

  124. Clojure feito para dar
    poder a pessoa que
    está na JVM

    View Slide

  125. LESS IS MORE
    https://clojure.org/api/cheatsheet

    View Slide

  126. View Slide

  127. SPEC /
    SCHEMAS

    View Slide

  128. Purpose Description
    Living documentation Use spec to include specifications in Function documentation (fdef)
    Data Validation Ensure the data entering and leaving the system or its key functions are of the
    correct form.
    Test Data Generation Provide extensive test data coverage with minimal code maintenance
    Generative testing of
    functions
    Test functions using their spec defined contract (fdef)
    Generative scenario testing Specific correct usage paths for known states
    Development time checking Instrument functions to ensure correctness
    Derive code from
    specifications
    Specify a system of record for data structures, internal and external to the system.
    https://practicalli.github.io/clojure/clojure-spec/

    View Slide

  129. DYNAMIC
    BENEFITS

    View Slide

  130. REPL

    View Slide

  131. DESENVOLVIMENTO
    ITERATIVO

    View Slide

  132. View Slide

  133. JAVA WITH
    STEROIDS FOFOS

    View Slide

  134. PERFORMANCE
    http://www.diva-portal.org/smash/get/diva2:1424342/FULLTEXT01.pdf

    View Slide

  135. FULLSTACK COM
    CLOJURESCRIPT

    View Slide

  136. COMUNIDADE

    View Slide

  137. View Slide

  138. Compilado de fontes boas pra aprender clojure
    https://gist.github.com/yogthos/be323be0361c589570a6da4ccc85f58f
    Exemplos interop
    https://gist.github.com/daveliepmann/86996c8b9842d78b0509ca24ad4a9
    2e9
    Lein polyglot
    https://cljdoc.org/d/leiningen/leiningen/2.9.5/doc/polyglot-clojure-java-pro
    jects-with-leiningen
    Clojure Design Patterns
    http://mishadoff.com/blog/clojure-design-patterns
    Clojure Made Simple - 2014
    https://www.youtube.com/watch?v=VSdnJDO-xdg&ab_channel=OracleDev
    elopers
    Clojure for Java Programmers Part 1 - Rich Hickey
    https://youtu.be/P76Vbsk_3J0

    View Slide

  139. View Slide

  140. View Slide

  141. View Slide

  142. https://lambda-study-group.github.io/

    View Slide

  143. Obrigada!
    anabastos
    @naluhh
    @anapbastos

    View Slide