Slide 1

Slide 1 text

5෼ͰΘ͔Δ Kotlin Contracts 2019/10/01 potatotips #65 twitter.com/kumamo_tone

Slide 2

Slide 2 text

• iOS/AndroidΤϯδχΞˏϠϑʔ • ษڧձӡӦ • Bonfire iOSɺWWDC Extended ͳͲ • ϠϑʔLODGEͰͷpotatotips͸4ճ໨ ۽ຊ ࿨ਖ਼ (@kumamo_tone)

Slide 3

Slide 3 text

2019.08 Kotlin 1.3.50 2018.10 Kotlin 1.3 2019.? Kotlin 1.4 όʔδϣϯͷਪҠ

Slide 4

Slide 4 text

2019.08 Kotlin 1.3.50 2018.10 Kotlin 1.3 2019.? Kotlin 1.4 όʔδϣϯͷਪҠ ৽ػೳ$POUSBDUT͕ొ৔

Slide 5

Slide 5 text

2019.08 Kotlin 1.3.50 2018.10 Kotlin 1.3 2019.? Kotlin 1.4 όʔδϣϯͷਪҠ ·ͩ&YQFSJNFOUBM͕ͩɺ 4UEMJCͰ΋ͨ͘͞Μ࢖ΘΕ͍ͯΔ

Slide 6

Slide 6 text

๩͍͠ਓͷͨΊͷ 5෼ͰΘ͔Δ Kotlin Contracts

Slide 7

Slide 7 text

• ίϯύΠϥʹ໌ࣔతʹؔ਺ͷ;Δ·͍Λڭ͑Δ΋ͷ • ίϯύΠϥͷ੍໿Λ؇ΊΔ͜ͱ͕Ͱ͖Δ Contracts ͱ͸

Slide 8

Slide 8 text

• ίϯύΠϥʹ໌ࣔతʹؔ਺ͷ;Δ·͍Λڭ͑Δ΋ͷ • ίϯύΠϥͷ੍໿Λ؇ΊΔ͜ͱ͕Ͱ͖Δ Contracts ͱ͸ ίϯύΠϥͷ੍໿ʁʁʁ

Slide 9

Slide 9 text

εϚʔτΩϟετ fun getString(s: String?): String { return if (s == null || s.isEmpty()) { "ۭͩΑ" } else { s } }

Slide 10

Slide 10 text

εϚʔτΩϟετ fun getString(s: String?): String { return if (s == null || s.isEmpty()) { "ۭͩΑ" } else { s } } s ͸ίϯύΠϥʹΑͬͯ String? ͔Β String ʹ Ωϟετ͞Ε͍ͯΔ

Slide 11

Slide 11 text

εϚʔτΩϟετʹͳΒͳ͍ྫ fun String?.isNullOrEmpty(): Boolean { return this == null || this.isEmpty() } fun getString(s: String?): String { return if (s.isNullOrEmpty()) { "ۭͩΑ" } else { s } } ֦ுؔ਺ʹͯ͠Έͨ

Slide 12

Slide 12 text

εϚʔτΩϟετʹͳΒͳ͍ྫ fun String?.isNullOrEmpty(): Boolean { return this == null || this.isEmpty() } fun getString(s: String?): String { return if (s.isNullOrEmpty()) { "ۭͩΑ" } else { s } } Type mismatch. Required: String Found: String? ίϯύΠϧΤϥʔ

Slide 13

Slide 13 text

εϚʔτΩϟετʹͳΒͳ͍ྫ fun String?.isNullOrEmpty(): Boolean { return this == null || this.isEmpty() } fun getString(s: String?): String { return if (s.isNullOrEmpty()) { "ۭͩΑ" } else { s!! } }

Slide 14

Slide 14 text

εϚʔτΩϟετʹͳΒͳ͍ྫ fun String?.isNullOrEmpty(): Boolean { return this == null || this.isEmpty() } fun getString(s: String?): String { return if (s.isNullOrEmpty()) { "ۭͩΑ" } else { s!! } }

Slide 15

Slide 15 text

@kotlin.internal.InlineOnly public inline fun CharSequence?.isNullOrEmpty(): Boolean { contract { returns(false) implies (this@isNullOrEmpty != null) } return this == null || this.length == 0 }

Slide 16

Slide 16 text

@kotlin.internal.InlineOnly public inline fun CharSequence?.isNullOrEmpty(): Boolean { contract { returns(false) implies (this@isNullOrEmpty != null) } return this == null || this.length == 0 } $POUSBDUʰʰܖ໿ʱʱ

Slide 17

Slide 17 text

ʰ͜ͷؔ਺͕GBMTFΛฦ͢ͱ͖ɺ ͜ͷ$IBS4FRVFODF͸OVMMͰ͸ ͳ͍͜ͱΛอূ͢Δʂʱ @kotlin.internal.InlineOnly public inline fun CharSequence?.isNullOrEmpty(): Boolean { contract { returns(false) implies (this@isNullOrEmpty != null) } return this == null || this.length == 0 }

Slide 18

Slide 18 text

@kotlin.internal.InlineOnly public inline fun CharSequence?.isNullOrEmpty(): Boolean { contract { returns(false) implies (this@isNullOrEmpty != null) } return this == null || this.length == 0 } ʰ͜ͷؔ਺͕GBMTFΛฦ͢ͱ͖ɺ ͜ͷ$IBS4FRVFODF͸OVMMͰ͸ ͳ͍͜ͱΛอূ͢Δʂʱ

Slide 19

Slide 19 text

@kotlin.internal.InlineOnly public inline fun CharSequence?.isNullOrEmpty(): Boolean { contract { returns(false) implies (this@isNullOrEmpty != null) } return this == null || this.length == 0 } Θ͔ͬͨΑʙ ίϯύΠϥ

Slide 20

Slide 20 text

fun getString(s: String?): String { return if (s.isNullOrEmpty()) { "ۭͩΑ" } else { s } } T͸OVMM͕อূ͞ΕͯΔͷͰ εϚʔτΩϟετ ͓͍ͯͨ͠Αʙ ίϯύΠϥ TPTNBSUʜʜ

Slide 21

Slide 21 text

SVO XJUI BQQMZ BMTP είʔϓؔ਺ ࢛ఱԦ StdlibͰ͔ͭΘΕ͍ͯΔ΄͔ͷྫ

Slide 22

Slide 22 text

val answer: Int run { answer = 42 } print(answer) run (Kotlin 1.2) ɺଖΕ͸ ੜ໋ɺӉ஦ɺͦͯ͠ສ෺ʹ͍ͭͯͷ ڀۃͷٙ໰ͷ౴͑ʜ ΫΫΫʜ

Slide 23

Slide 23 text

run (Kotlin 1.2) ͳΜʜͩͱʜ ʢେৎ෉ͩͱࢥ͏Μ͚ͩͲͳʜʣ ෳ਺ճݺ͹ΕͨΒ ͋Ϳͳ͍Αʙ ίϯύΠϥ $PNQJMFSFSSPS $BQUVSFEWBMVFTJOJUJBMJ[BUJPO JTGPSCJEEFOEVFUPQPTTJCMFSFBTTJHONFOU val answer: Int run { answer = 42 } print(answer)

Slide 24

Slide 24 text

@kotlin.internal.InlineOnly public inline fun T.run(block: T.() -> R) = block() @kotlin.internal.InlineOnly public inline fun T.run(block: T.() -> R): R { contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) } return block() } run (Kotlin 1.3)

Slide 25

Slide 25 text

@kotlin.internal.InlineOnly public inline fun T.run(block: T.() -> R): R { contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) } return block() } $POUSBDUʰʰܖ໿ʱʱ

Slide 26

Slide 26 text

@kotlin.internal.InlineOnly public inline fun T.run(block: T.() -> R): R { contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) } return block() } ʰ͜ͷϒϩοΫ͸ʜ ʰͨͬͨ౓ͷΈඞ࣮ͣߦ͞ΕΔʂʂʱʱ

Slide 27

Slide 27 text

@kotlin.internal.InlineOnly public inline fun T.run(block: T.() -> R): R { contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) } return block() } Θ͔ͬͨΑʙ ίϯύΠϥ

Slide 28

Slide 28 text

Ұ౓͔͠ݺ͹Εͳ͍ͳΒ ॳظԽͯ͠΋҆શ͔ͩΒɺ ڐՄ͓͍ͯͨ͠Αʙ ίϯύΠϥ TPTNBSUʜʜ val answer: Int run { answer = 42 } print(answer)

Slide 29

Slide 29 text

ݴ༿ʹ͠ͳ͍ͱɺ఻ΘΒͳ͍͜ͱ΋͋Δʢʁʁʁʣ http://gahag.net/001427-businessman-handshake/

Slide 30

Slide 30 text

• Contractsͱ͸ • Kotlin 1.3 Ͱ௥Ճ͞ΕͨػೳʢExperimentalʣ • isNullOrEmpty/run/with/apply/alsoͳͲStdlibͰଟ਺࢖ΘΕ͍ͯΔ • ίϯύΠϥʹ໌ࣔతʹؔ਺ͷ;Δ·͍Λڭ͑Δ͜ͱͰɺ
 ίϯύΠϥͷ੍໿Λ؇ΊΔ͜ͱ͕Ͱ͖Δ ·ͱΊ

Slide 31

Slide 31 text

• What’s New in Kotlin 1.3 • https://kotlinlang.org/docs/reference/whatsnew13.html • What's new in Kotlin? • https://speakerdeck.com/svtk/whats-new-in-kotlin • վΊֶͯͿContracts • https://speakerdeck.com/tommykw/gai-metexue-hucontracts References