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

Sharing [Kotlin code across platforms] is caring!

Sharing [Kotlin code across platforms] is caring!

Sharing code across platforms is one of the most annoying "unsolved problems" when developing a product: an eternal struggle between re-writing everything multiple times and jumping through plenty of hoops to be able to re-use some core business logic. This session is going to illustrate how Kotlin is being used to solve this problem at Clue in order to share code between Android, iOS and the backend, including all the challenges, lessons and tricks learned along the way.

Presented at KotlinConf 2017

Eugenio Marletti

November 03, 2017
Tweet

More Decks by Eugenio Marletti

Other Decks in Technology

Transcript

  1. @workingkills
    Eugenio Marletti
    Sharing
    [Kotlin code across platforms]
    is caring!
    KotlinConf

    View Slide

  2. “app”
    “ ”
    “ ”
    “ ”
    “ ”

    View Slide

  3. “app”
    iOS
    Android
    frontend
    backend
    tools
    “ ”
    “ ”
    “ ”
    “ ”

    View Slide

  4. sharing

    View Slide

  5. code
    sharing

    View Slide

  6. code
    sharing

    View Slide

  7. business logic
    sharing

    View Slide

  8. bugs
    sharing

    View Slide

  9. bugs
    sharing

    View Slide

  10. fixes
    sharing

    View Slide

  11. effort
    sharing

    View Slide

  12. C++
    J2ObjC / GWT
    JavaScript

    View Slide

  13. View Slide

  14. THE ALGORITHM™

    View Slide

  15. THE ALGORITHM™
    C++
    ObjC++
    JavaScript
    TypeScript

    View Slide

  16. C++
    ObjC++
    JavaScript
    TypeScript
    iOS !" JavaScriptCore
    Android !" WebView

    View Slide

  17. C++
    ObjC++
    JavaScript
    TypeScript
    iOS !" JavaScriptCore
    Android !" W
    ͊̊̏̃͑̽̃̕
    ̘͖̯

    ̨͇̯
    ̶ȩ̧̟̝͔
    ͔͎̗̬̼̓̒̄̍̓͐̒̎̕
    b̡̫̰͙͚͋͋̓́̇͟V
    ͐̇͞ ̓̿̔̿̓ ͒̚
    ͟ ̨̭̳̱͕
    ̵i
    ͒̅̉͊̌̇
    ̡͓̰̲̳͟ ̥̯
    ̯̦ę͕͔͉̜̗͔͎
    ̔̍̀̏̌̕
    ͢ ͟
    w
    ̛͊͆̍͑
    ̴̯̯̻̪̦

    View Slide

  18. ?
    C++
    ObjC++
    JavaScript
    TypeScript
    iOS !" JavaScriptCore
    Android !"

    View Slide

  19. THE ALGORITHM™
    C++
    ObjC++
    JavaScript
    TypeScript
    Kotlin @fbecart
    Florent Bécart

    View Slide

  20. multi-platform

    View Slide

  21. header impl
    (before 1.2)
    -Xmulti-platform

    View Slide

  22. header impl
    (before 1.2)
    -Xmulti-platform

    View Slide

  23. expect actual
    (from 1.2)
    -Xmulti-platform

    View Slide

  24. ANDROID
    WebView
    iOS
    JavaScriptCore
    BACKEND
    JS
    legacy.js

    View Slide

  25. legacy-test.js
    ANDROID
    WebView
    iOS
    JavaScriptCore
    BACKEND
    JS
    legacy.js
    shared-test.kt
    shared.kt

    View Slide

  26. legacy-test.js
    ANDROID
    WebView
    iOS
    JavaScriptCore
    BACKEND
    JS
    legacy.js
    shared-test.kt
    shared.kt

    View Slide

  27. legacy-test.js
    ANDROID
    WebView
    iOS
    JavaScriptCore
    BACKEND
    JS
    legacy.js
    shared-test.kt
    shared.kt

    View Slide

  28. legacy-test.js
    ANDROID
    WebView
    iOS
    JavaScriptCore
    BACKEND
    JS
    legacy.js
    shared.kt
    shared-test.kt

    View Slide

  29. legacy-test.js
    ANDROID
    WebView
    iOS
    JavaScriptCore
    BACKEND
    JS
    shared.kt
    shared-test.kt
    JVM

    View Slide

  30. /**
    * A day number, offset from 01/01/2012
    !"
    export type Day = number

    View Slide

  31. /**
    * A day number, offset from 01/01/2012
    !"
    typealias Day = Int

    View Slide

  32. class Value {
    constructor(value: Double) {
    this.value = value
    }
    val value: Double
    override fun toString(): String {
    return this.value.toString()
    }
    companion object {
    fun add(v1: Value, v2: Value): Value {
    return Value(v1.value + v2.value)
    }
    fun isZero(valueWithVariance: Value): Boolean {
    return .0 !!% valueWithVariance.value
    }
    fun subtract(v1: Value?, v2: Value?): Value {
    var value = .0
    if (v1 !' null !& v2 !' null) { value = v1.value - v2.value }
    return Value(value)
    }
    }
    }
    export class Value {
    constructor(value) {
    this.value = value
    }
    readonly value: number
    toString() {
    return String(this.value)
    }
    static add = (v1: Value, v2: Value): Value !$ {
    return new Value(v1.value + v2.value)
    }
    static isZero = (valueWithVariance: Value): boolean !$ {
    return 0 !!% valueWithVariance.value
    }
    static subtract = (v1: Value, v2: Value): Value !$ {
    let value = 0
    if (v1 !& v2) { value = v1.value - v2.value }
    return new Value(value)
    }
    }

    View Slide

  33. < insert more talking here >

    View Slide

  34. Eugenio
    Marletti
    @workingkills
    BIT.LY/SHARING-KOTLIN-IS-CARING

    View Slide