Slide 1

Slide 1 text

KOTLIN Compartilhando código com Kotlin Multiplataforma

Slide 2

Slide 2 text

ADOTE

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

Plataformas 4 JVM JS NATIVE ANDROID

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

https://bit.ly/2ATKly0

Slide 7

Slide 7 text

Por que usar Kotlin no desenvolvimento para JVM? ● Expressividade ● Escalabilidade & Performance - Kotlin Coroutines ● Interoperabilidade com código já existente - migração gradual ● Tooling 7

Slide 8

Slide 8 text

https://bit.ly/2jV4utA

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

https://github.com/JetBrains/kotlin-wrappers

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

KotlinJS - jQuery fun main(args: Array) { jq("#message").html("Hello from Kotlin") } 14

Slide 15

Slide 15 text

KotlinJS - React class HelloComponent: RComponent() { override fun RBuilder.render() { div(classes = "content") { h1 { +"Hello!" } } } } fun RBuilder.hello() = child(HelloComponent::class) { } 15

Slide 16

Slide 16 text

KotlinJS - NodeJS fun main(args: Array) { 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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

Kotlin Native - C interop fun fetch() { val res = curl_easy_perform(curl) if (res != CURLE_OK) println("curl_easy_perform() failed") } fun CPointer.toKString(length: Int): String { val bytes = this.readBytes(length) return bytes.stringFromUtf8() } 21

Slide 22

Slide 22 text

Integração com IDE 22

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

MÓDULOS MULTIPLATAFORMA 24

Slide 25

Slide 25 text

Kotlin Multiplataforma ● Suporte introduzido na versão 1.2 ● JVM & JavaScript (Native "meio que" funciona) ● módulos common, platform e regular 25

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

Multiplatform Module - Common code package com.example.foo expect class Foo(bar: String) { fun frob() } fun main(args: Array) { Foo("Hello").frob() } 35

Slide 36

Slide 36 text

Multiplatform Module - JVM implementation package com.example.foo actual class Foo actual constructor(val bar: String) { actual fun frob() { println("Frobbing the $bar") } } 36

Slide 37

Slide 37 text

DI Multiplataforma 37

Slide 38

Slide 38 text

Mock Multiplataforma 38

Slide 39

Slide 39 text

KOTLIN GRADLE DSL Bonus - por que não usar em todo o projeto então?

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

e se... 43

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

No content

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

OBRIGADO! Questions and feedbacks? Rafael Toledo [email protected] speakerdeck.com/rafaeltoledo github.com/rafaeltoledo 49