$30 off During Our Annual Pro Sale. View Details »

Kotlinの言語機能をフル活用したAndroidアプリの開発

 Kotlinの言語機能をフル活用したAndroidアプリの開発

Hatena Engineer Seminar #9 で発表した内容です

Takuji Nishibayashi

October 30, 2017
Tweet

More Decks by Takuji Nishibayashi

Other Decks in Technology

Transcript

  1. KotlinͷݴޠػೳΛ
    ϑϧ׆༻ͨ͠
    AndroidΞϓϦͷ։ൃ
    id:takuji31
    Hatena Engineer Seminar #9

    View Slide

  2. ஫ҙࣄ߲
    • AndroidΞϓϦ։ൃͷલఏ஌ࣝͱͳΔΑ͏ͳ
    ෦෼ͷղઆ͸͠·ͤΜ
    • ͜ͷεϥΠυʹॻ͔Ε͍ͯΔKotlinͷίʔυ΍
    ࢓༷͸όʔδϣϯ1.1.51࣌఺ͷ΋ͷͰ͢

    View Slide

  3. ࣗݾ঺հ
    • ੢ྛ ୓ࢤ (ʹ͠͹΍͠ ͨ͘͡)
    • (hatena | twitter | github) takuji31
    • גࣜձࣾ͸ͯͳ ΞϓϦέʔγϣϯΤϯδχΞ
    • ϒοΫϚʔΫΞϓϦνʔϜॴଐ

    View Slide

  4. ࣗݾ঺հ
    • Android։ൃ 2010೥2݄ʙ
    • Kotlin 2014೥12݄ʙ
    • iOS΍Webͷ։ൃ΋ᅂΉ

    View Slide

  5. ׆ಈ
    • Koreference
    • KotlinͰSharedPreferencesͷϞσϧΛ࡞Δ
    ϥΠϒϥϦʔ
    • github.com/takuji31/Koreference
    • Kansai.kt ӡӦ

    View Slide

  6. ϓϥΠϕʔτ
    • Χϝϥ(not Ϩϯζ)পॅਓ
    • ϚΠϘ΢ϥʔ (AVG175)
    • ͏͗͞
    • ΞΠίϯ͸͏ͪͷࢠͰ͢

    View Slide

  7. ͱ͜ΖͰ

    View Slide

  8. Έͳ͞ΜAndroidΞϓϦ
    ։ൃͯ͠·͔͢ʁ

    View Slide

  9. Kotlinॻ͍ͯ·͔͢ʁ

    View Slide

  10. Kotlinͷݴޠػೳ׆༻
    ͍ͯ͠·͔͢ʁ

    View Slide

  11. Null҆શ͚ͩͰຬ଍͍ͯ͠·
    ͤΜ͔ʁ

    View Slide

  12. ࠓ೔͸͸ͯͳϒοΫϚʔΫ
    AndroidΞϓϦͰͷKotlin
    ׆༻ࣄྫΛ঺հ͠·͢

    View Slide

  13. AGENDA
    • Kotlinಋೖ·ͰͷಓͷΓ
    • KotlinͷݴޠػೳΛ׆༻͢Δ
    • data class
    • Extension method / property
    • Delegated property

    View Slide

  14. Kotlin
    ಋೖ·ͰͷಓͷΓ

    View Slide

  15. ͸ͯͳͰͷ৽ٕज़
    (ݴޠ΍ϛυϧ΢ΣΞ)
    ಋೖ

    View Slide

  16. ಋೖ·Ͱ
    • ΤϯδχΞ͕ىҊ
    • ΤϯδχΞνʔϑձͰಋೖͷੋඇΛٞ࿦
    • CTO͕ঝೝ

    View Slide

  17. Kotlinͷ৔߹
    • I/O Keynote͕ऴΘͬͨ௚ޙͷேɺKotlinಋೖ
    ىҊ (5/18)
    • ΤϯδχΞνʔϑձ
    • ঝೝ (5/19)
    • ͜͜·Ͱ͓Αͦ1೔൒

    View Slide

  18. Kotlin+͸ͯͳϒοΫϚʔΫͷ৔߹
    • (ि໌͚ͯ) 22೔͸νʔϜͷσΟϨΫλʔ͕

    ෆࡏͩͬͨͷͰ1ճٳΈ
    • 23೔ேʹσΟϨΫλʔͱձ࿩ͯ͠ಋೖܾఆ
    • ଈ೔ಋೖ

    View Slide

  19. View Slide

  20. View Slide

  21. Kotlinͷ
    ݴޠػೳΛ
    ׆༻͢Δ

    View Slide

  22. data class

    View Slide

  23. ԿΒ͔ͷσʔλΛอ࣋͢Δͨ
    ΊͷΫϥε

    View Slide

  24. Model΍DTOΛ࡞ΔͨΊͷ
    ศརػೳຬࡌ

    View Slide

  25. ྫ) طଘͷmodelΛKotlinʹ
    ม׵͍ͨ͠

    View Slide

  26. ม׵͸Convert Java file to
    Kotlin fileͰ

    View Slide

  27. ୯७ͳม׵͚ͩͰΑ͍ͷ͔ʁ

    View Slide

  28. ୯७ͳม׵͚ͩͰΑ͍ͷ͔ʁ
    • Nullableͳͷ͔NonNullͳͷ͔ࢦఆ͍ͨ͠
    • equals/hashCode/toStringΛ࣮૷͍ͨ͠

    View Slide

  29. ྫʣϢʔβʔͷmodelΛఆٛ
    • id
    • ໊લ
    • ੏
    • ໊
    • ϓϩϑΟʔϧ
    • ొ࿥ঢ়ଶ

    View Slide

  30. Javaͷmodel(Ұ෦)
    public class JavaUser {
    private final long id;
    private String firstName;
    private String lastName;
    private String profile;
    private boolean registered;
    public JavaUser(long id, String firstName, String lastName, String profile, boolean registered) {
    this.id = id;
    this.firstName = firstName;
    this.lastName = lastName;
    this.profile = profile;
    this.registered = registered;
    }
    public long getId() {
    return id;
    }
    public String getFirstName() {
    return firstName;
    }
    public void setFirstName(String firstName) {
    this.firstName = firstName;
    }
    public String getLastName() {
    return lastName;
    }
    public void setLastName(String lastName) {
    this.lastName = lastName;
    }
    public String getProfile() {
    return profile;
    }
    public void setProfile(String profile) {
    this.profile = profile;
    }
    public boolean isRegistered() {
    return registered;
    }
    public void setRegistered(boolean registered) {
    this.registered = registered;
    }
    public String getFullName() {
    return firstName + " " + lastName;
    }
    }

    View Slide

  31. ಡΊͳ͍

    View Slide

  32. Kotlinͷmodel
    data class JavaUser(
    val id: Long,
    var firstName: String,
    var lastName: String,
    var profile: String?,
    var isRegistered: Boolean = false
    ) {
    val fullName: String
    get() = firstName + " " + lastName
    }
    ಄ʹEBUB
    Λ͚ͭΔ
    શͯͷ CBDLJOHpFME

    ϓϩύςΟʔΛ
    DPOTUSVDUPSͰఆٛ

    View Slide

  33. equals/hashCode/toString
    →ࣗಈੜ੒

    View Slide

  34. boilerplate codeΛ
    ࡟ݮ͖ͯͬ͢͠Γ

    View Slide

  35. Extension

    View Slide

  36. ֦ுؔ਺/֦ுϓϩύςΟʔ

    View Slide

  37. طଘͷΫϥεʹ
    ؔ਺΍ϓϩύςΟʔΛੜ΍͢
    (Α͏ʹݟͤΔ)࢓૊Έ

    View Slide

  38. FragmentΛ֦ுϓϩύςΟʔͰ
    ֦ு͢Δ
    val Fragment.baseActivity: BaseActivity?

    get() = activity as BaseActivity?

    val Fragment.actionBar: ActionBar?

    get() = baseActivity?.supportActionBar
    ֦ு͍ͨ͠ܕ
    Λॻ͘
    ͦͷଞ͸௨ৗͷ
    ϓϩύςΟʔͱಉ͡

    View Slide

  39. RealmͷProviderΛ֦ுؔ਺Ͱ
    ֦ு͢Δ
    fun Provider.getAutoCloseObservable():
    Observable {
    val realm = get()
    realm.use {
    return Observable.create { emitter ->
    val instance = get()
    emitter.setCancellable {
    instance.close()
    }
    emitter.onNext(instance)
    }
    }
    }
    ֦ு͍ͨ͠ܕ
    Λॻ͘
    ͦͷଞ͸௨ৗͷ
    ؔ਺ͱಉ͡
    (FOFSJDTͷ
    ܕύϥϝʔλʔ΋ࢦఆՄ

    ϓϩύςΟʔ΋ಉ༷

    View Slide

  40. طଘͷJavaΫϥε΋
    ֦ுͰ͖Δ

    View Slide

  41. (Javaଆ͔Β͸)
    ୈ1Ҿ਺ΛϨγʔόʔʹͨ͠
    staticϝιουʹݟ͑Δ

    View Slide

  42. → طଘΫϥεͷҰ෦Λ
    KotlinԽͰ͖Δ

    View Slide

  43. ػೳͷଟ͍ը໘Λ
    KotlinԽ

    View Slide

  44. KotlinԽͷखॱ
    • ֦ுؔ਺Λఆٛ͢ΔϑΝΠϧΛ࡞Δ
    • JavaϑΝΠϧͷϝιουΛ֦ுؔ਺ʹͯ͠Kotlinଆʹఆ
    ٛ
    • Javaͷݩϝιου͔Β֦ுؔ਺Λݺͼग़͢
    • ͋Δఔ౓ݩϑΝΠϧ͕૫ͤͨΒKotlinʹม׵
    • ֦ுؔ਺ͷத਎Λݩϝιουʹ໭͍ͯ͘͠

    View Slide

  45. pros
    • 1ͭͣͭdiff͕খ͘͞ͳΔͷͰϨϏϡʔ͠΍͢
    ͍
    • Ұ෦͚ͩKotlinԽ͢Δ͜ͱ͕Ͱ͖ͯؾܰʹ΍Ε
    Δ

    View Slide

  46. cons
    • gitͷྺ࢙͕ফ໓
    • ϑΝΠϧ͕෼͔ΕͯίʔυΛ௥͏ͷ͕গ͠େ
    มʹ

    View Slide

  47. ֦ு͗͢͠Δͱ
    Θ͚͕Θ͔Βͳ͘ͳΔ

    View Slide

  48. ͝ར༻͸ܭըతʹ

    View Slide

  49. Delegated
    property

    View Slide

  50. ҕৡϓϩύςΟʔ

    View Slide

  51. propertyͷॲཧΛ
    ผͷΦϒδΣΫτʹ
    ҕৡͰ͖Δ

    View Slide

  52. Data Binding Libraryͷ
    BaseObservableͷ
    มߋ௨஌ΛࣗಈԽ

    View Slide

  53. Delegated propertyͷఆٛ
    open class BaseObservableProperty(
    vararg val propertyId: Int,
    var value: T
    ) : ReadWriteProperty {
    override fun getValue(
    thisRef: BaseObservable,
    property: KProperty<*>): T {
    return value
    }
    override fun setValue(
    thisRef: BaseObservable,
    property: KProperty<*>, value: T) {
    this.value = value
    propertyId.forEach(thisRef::notifyPropertyChanged)
    }
    }
    3FBE8SJUF1SPQFSUZ
    ΠϯλʔϑΣΠεΛ࣮૷
    HFU7BMVFTFU7BMVFΛ
    ఆٛ
    UIJTͷࢀরͱQSPQFSUZͷ
    ৘ใ͕౉͞ΕΔ

    View Slide

  54. Delegated propertyͷఆٛ
    class NonNullBaseObservableProperty(vararg propertyId: Int, value: T) :
    BaseObservableProperty(propertyId = *propertyId, value = value)
    fun BaseObservable.property(vararg propertyId: Int, value: T? = null) =
    BaseObservableProperty(propertyId = *propertyId, value = value)
    fun BaseObservable.nonNullProperty(vararg propertyId: Int, value: T) =
    NonNullBaseObservableProperty(propertyId = *propertyId, value = value)
    ܕ͕/PO/VMMͳ΋ͷ༻ͷఆٛ
    ֦ுؔ਺ʹ͓ͯ͘͠ͱ
    ࢖͏࣌ʹศར

    View Slide

  55. ར༻͢Δ
    class ViewModel: BaseObservable() {
    @get:Bindable
    var users: List by nonNullProperty(BR.users, value = emptyList())
    fun requestUsers(): Disposable {
    return getUser
    .execute()
    .subscribeBy(
    onSuccess = { user ->
    this.users = users
    },
    )
    }
    }
    CZͷޙʹΦϒδΣΫτΛ౉͢
    TFU͢Δ͜ͱͰࣗಈతʹ
    OPUJGZ1SPQFSUZ$IBOHFE͕
    ݺ͹ΕΔ

    View Slide

  56. ศརͦ͏͚ͩͲ
    Ͳ͏͍͏༻్Ͱ࢖͑Δ͔
    Θ͔Βͳ͍ʁ

    View Slide

  57. SharedPreferencesͷૢ࡞

    View Slide

  58. ͜ΕΛ࢖͍·͠ΐ͏ˠ
    https://github.com/
    takuji31/Koreference

    View Slide

  59. ͸ͯͳϒοΫϚʔΫͰ΋
    ࢖͍ͬͯ·͢

    View Slide

  60. σϑΥϧτͷ΋ͷ΋
    ༻ҙ͞Ε͍ͯ·͢

    View Slide

  61. σϑΥϧτͷ
    Delegated property(Ұ෦)
    • Delegates.notNull
    • not-null͕ͩॳظԽ࣌ʹॳظԽͰ͖ͳ͍ϓϩύςΟʔ
    • nullͷ··ΞΫηεͨ͠Βྫ֎
    • lazy
    • ஗ԆॳظԽ
    • ࠷ॳͷΞΫηε࣌ʹҾ਺Ͱ౉ͨ͠ϒϩοΫͷ໭Γ஋Λฦͯ͠
    Ωϟογϡ͢Δ

    View Slide

  62. Kotlin͸ϞμϯͳݴޠͳͷͰ
    ॻ͘ίʔυ΋Ϟμϯʹ
    ͍͖ͯ͠·͠ΐ͏ :kotlin:

    View Slide

  63. Enjoy Kotlin Life

    View Slide