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

Compartilhando Código com Kotlin Multiplataforma

2dc2a52d38ee8c184deeceaadf9ed6ba?s=47 Rafael Toledo
September 16, 2018

Compartilhando Código com Kotlin Multiplataforma

Apresentada no Kotlin Community Summit 2018

2dc2a52d38ee8c184deeceaadf9ed6ba?s=128

Rafael Toledo

September 16, 2018
Tweet

More Decks by Rafael Toledo

Other Decks in Programming

Transcript

  1. KOTLIN Compartilhando código com Kotlin Multiplataforma

  2. ADOTE

  3. https://pusher.com/state-of-kotlin

  4. Plataformas 4 JVM JS NATIVE ANDROID

  5. Por que usar Kotlin no desenvolvimento Android? • Compatibilidade -

    Java 6 • Performance • Interoperabilidade • Footprint: standard library & runtime ~100Kb • Tempo de Compilação não é mais um problema • Tooling evoluindo 5
  6. https://bit.ly/2ATKly0

  7. Por que usar Kotlin no desenvolvimento para JVM? • Expressividade

    • Escalabilidade & Performance - Kotlin Coroutines • Interoperabilidade com código já existente - migração gradual • Tooling 7
  8. https://bit.ly/2jV4utA

  9. JavaFX Framework for Kotlin https://github.com/edvin/tornadofx

  10. Ktor for building servers and clients https://ktor.io

  11. Por que usar Kotlin no desenvolvimento JavaScript? • JavaScript Optimized

    - DCE (Dead Code Elimination) • JavaScript legível e depurável • Compatibilidade com código JavaScript pré-existente • Mesmas features da Standard Library da JVM - incluindo Coroutines 11
  12. https://github.com/JetBrains/kotlin-wrappers

  13. Kotlin para JavaScript - e a tipagem? • É possível

    interagir com qualquer tipo de código JavaScript • Strong-typed APIs / TypeScript -> https://github.com/kotlin/ts2kt • Dynamic types para outros cenários 13
  14. KotlinJS - jQuery fun main(args: Array<String>) { jq("#message").html("Hello from Kotlin")

    } 14
  15. KotlinJS - React class HelloComponent: RComponent<RProps, RState>() { override fun

    RBuilder.render() { div(classes = "content") { h1 { +"Hello!" } } } } fun RBuilder.hello() = child(HelloComponent::class) { } 15
  16. KotlinJS - NodeJS fun main(args: Array<String>) { val express =

    require("express") val app = express() app.get("/", { req, res -> res.type("text/plain") res.send("i am a beautiful butterfly") }) app.listen(3000, { println("Listening on port 3000") }) } 16
  17. Why to use Kotlin for native development? • Código Nativo

    • Backend baseado no LLVM • Interoperabilidade com código nativo e bibliotecas - binding gerado a partir de arquivos .h • MacOS / iOS - Objective C e Swift • Atualmente na versão 0.9 - em desenvolvimento - 1.3 17
  18. Kotlin Native supported targets • Windows (x86_64) • Linux (x86_64,

    arm32, MIPS e MIPS little endian) • MacOS (x86_64) • iOS (arm32, arm64, x64) • Android (arm32 e arm64) • STM32 • WebAssembly (wasm32) 18
  19. Kotlin Native - C interop components.main { targets = ['macos_x64',

    'linux_x64'] dependencies { cinterop('libcurl-interop') { defFile 'src/main/c_interop/libcurl.def' target('linux_x64') { includeDirs.headerFilterOnly '/usr/include' } target('macos_x64') { includeDirs.headerFilterOnly '/opt/local/include', '/usr/local/include' } } } 19
  20. Kotlin Native - C interop headers = curl/curl.h headerFilter =

    curl/* linkerOpts.osx = -L/opt/local/lib -L/usr/local/opt/curl/lib -lcurl linkerOpts.linux = -L/usr/lib64 -L/usr/lib/x86_64-linux-gnu -lcurl 20
  21. Kotlin Native - C interop fun fetch() { val res

    = curl_easy_perform(curl) if (res != CURLE_OK) println("curl_easy_perform() failed") } fun CPointer<ByteVar>.toKString(length: Int): String { val bytes = this.readBytes(length) return bytes.stringFromUtf8() } 21
  22. Integração com IDE 22

  23. Reference links https://kotlinlang.org/docs/reference/android-overview.html https://kotlinlang.org/docs/reference/server-overview.html https://kotlinlang.org/docs/reference/js-overview.html https://kotlinlang.org/docs/reference/native-overview.html 23

  24. MÓDULOS MULTIPLATAFORMA 24

  25. Kotlin Multiplataforma • Suporte introduzido na versão 1.2 • JVM

    & JavaScript (Native "meio que" funciona) • módulos common, platform e regular 25
  26. Módulos Multiplataforma common: Contém código que não é específico a

    nenhuma plataforma, assim como a declaração de APIs que necessitam de implementação específica platform: Contém a implementação das APIs definidas em um módulo common, além de outros códigos específicos da plataforma regular: Módulo comum que tem como target uma plataforma específica 26
  27. Multiplatform Module - Gradle buildscript { ext.kotlin_version = '1.2.70' repositories

    { mavenCentral() } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } apply plugin: 'kotlin-platform-common' repositories { mavenCentral() } dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib-common:$kotlin_version" testCompile "org.jetbrains.kotlin:kotlin-test-common:$kotlin_version" } 27
  28. Multiplatform Module - Gradle buildscript { ext.kotlin_version = '1.2.70' repositories

    { mavenCentral() } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } apply plugin: 'kotlin-platform-common' repositories { mavenCentral() } dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib-common:$kotlin_version" testCompile "org.jetbrains.kotlin:kotlin-test-common:$kotlin_version" } 28
  29. Multiplatform Module - JVM target ... apply plugin: 'kotlin-platform-jvm' repositories

    { mavenCentral() } dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" expectedBy project(":common") testCompile "junit:junit:4.12" testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version" testCompile "org.jetbrains.kotlin:kotlin-test:$kotlin_version" } 29
  30. Multiplatform Module - JVM target ... apply plugin: 'kotlin-platform-jvm' repositories

    { mavenCentral() } dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" expectedBy project(":common") testCompile "junit:junit:4.12" testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version" testCompile "org.jetbrains.kotlin:kotlin-test:$kotlin_version" } 30
  31. Multiplatform Module - JavaScript target ... apply plugin: 'kotlin-platform-js' repositories

    { mavenCentral() } dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib-js:$kotlin_version" expectedBy project(":common") testCompile "org.jetbrains.kotlin:kotlin-test-js:$kotlin_version" } 31
  32. Multiplatform Module - JavaScript target ... apply plugin: 'kotlin-platform-js' repositories

    { mavenCentral() } dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib-js:$kotlin_version" expectedBy project(":common") testCompile "org.jetbrains.kotlin:kotlin-test-js:$kotlin_version" } 32
  33. Multiplatform Module - Native target ... buildscript { repositories {

    maven { url 'https://jetbrains.bintray.com/kotlin-native-dependencies' } } dependencies { classpath 'org.jetbrains.kotlin:kotlin-native-gradle-plugin:0.8.2' } } apply plugin: 'kotlin-platform-native' dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" expectedBy project(":common") } ... 33
  34. Multiplatform Module - Native target ... apply plugin: 'kotlin-platform-native' dependencies

    { compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" expectedBy project(":common") } sourcesets.main.component { baseName.set('MyCommonModule') target 'ios_arm64', 'ios_x64' outputKinds = [ FRAMEWORK ] } ... 34
  35. Multiplatform Module - Common code package com.example.foo expect class Foo(bar:

    String) { fun frob() } fun main(args: Array<String>) { Foo("Hello").frob() } 35
  36. Multiplatform Module - JVM implementation package com.example.foo actual class Foo

    actual constructor(val bar: String) { actual fun frob() { println("Frobbing the $bar") } } 36
  37. DI Multiplataforma 37

  38. Mock Multiplataforma 38

  39. KOTLIN GRADLE DSL Bonus - por que não usar em

    todo o projeto então?
  40. Por que usar a Kotlin Gradle DSL? • Aumento na

    velocidade de análise e compilação dos build scripts, em comparação com Groovy • IDE friendly, melhor autocomplete • Unificação da linguagem de desenvolvimento • 1.0 RC 6 incluído no Gradle 4.10.1, estável no Gradle 5.0 (próxima versão) 40
  41. Gradle - Groovy (default) // build.gradle allprojects { buildscript {

    ext.kotlin_version = '1.2.70' repositories { mavenCentral() } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } repositories { mavenLocal() } } 41
  42. Gradle - Kotlin DSL // build.gradle.kts allprojects { buildscript {

    val kotlin_version by extra { "1.2.70" } repositories { mavenCentral() } dependencies { classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version") } } repositories { mavenLocal() } } 42
  43. e se... 43

  44. a gente tivesse um projeto definitivamente full stack em Kotlin?

    44
  45. None
  46. 46 https://github.com/JetBrains/kotlinconf-app Ktor / ReactJS / Android / iOS

  47. 47 https://github.com/MarcinMoskala/KotlinAcademyApp Ktor / ReactJS / Android / iOS /

    JavaFX
  48. Links BLOG OFICIAL https://blog.jetbrains.com/kotlin KOTLIN KOANS https://kotlinlang.org/docs/tutorials/koans.html KOTLIN IN ACTION

    https://www.manning.com/books/kotlin-in-action 48
  49. OBRIGADO! Questions and feedbacks? Rafael Toledo rdtoledo@thoughtworks.com speakerdeck.com/rafaeltoledo github.com/rafaeltoledo 49