Slide 1

Slide 1 text

KotlinͰDI ୈ6ճKotlinษڧձ ˏ Sansan 2017 6/29 Kamedon

Slide 2

Slide 2 text

ࣗݾ঺հ

Slide 3

Slide 3 text

ϓϩϑΟʔϧ • Χϝυϯ • Kotlin޷͖Ͱ͢ • ΫϥεϝιουͰΞϯυϩΠυ ͷΞϓϦ։ൃ΍ͬͯ·͢ • ϘʔυήʔϜ͕޷͖Ͱ͢

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

Dependency Injection

Slide 7

Slide 7 text

೔ຊޠ:Wikipediaͩͱ… lґଘੑͷ஫ೖʢ͍ͦΜ͍ͤͷͪΎ͏ʹΎ ͏ɺӳ%FQFOEFODZJOKFDUJPOʣͱ͸ɺ ίϯϙʔωϯτؒͷґଘؔ܎ΛϓϩάϥϜ ͷιʔείʔυ͔Βഉআ͠ɺ֎෦ͷઃఆϑΝ ΠϧͳͲͰ஫ೖͰ͖ΔΑ͏ʹ͢Διϑτ΢Σ ΞύλʔϯͰ͋Δɻz 8JLJQFEJBґଘੑͷ஫ೖ

Slide 8

Slide 8 text

೔ຊޠ:Wikipediaͩͱ… lґଘੑͷ஫ೖʢ͍ͦΜ͍ͤͷͪΎ͏ʹΎ ͏ɺӳ%FQFOEFODZJOKFDUJPOʣͱ͸ɺ ίϯϙʔωϯτؒͷґଘؔ܎ΛϓϩάϥϜ ͷιʔείʔυ͔Βഉআ͠ɺ֎෦ͷઃఆϑΝ ΠϧͳͲͰ஫ೖͰ͖ΔΑ͏ʹ͢Διϑτ΢Σ ΞύλʔϯͰ͋Δɻz 8JLJQFEJBґଘੑͷ஫ೖ ґଘੑͷ஫ೖʁ

Slide 9

Slide 9 text

ӳޠ൛:Wikipediaͩͱ… l*OTPGUXBSFFOHJOFFSJOH EFQFOEFODZ JOKFDUJPOJTBUFDIOJRVFXIFSFCZPOF PCKFDUTVQQMJFTUIFEFQFOEFODJFTPG BOPUIFSPCKFDU"EFQFOEFODZJTBO PCKFDUUIBUDBOCFVTFE BTFSWJDF z 8JLJQFEJB%FQFOEFODZJOKFDUJPO

Slide 10

Slide 10 text

ӳޠ൛:Wikipediaͩͱ… l*OTPGUXBSFFOHJOFFSJOH EFQFOEFODZ JOKFDUJPOJTBUFDIOJRVFXIFSFCZPOF PCKFDUTVQQMJFTUIFEFQFOEFODJFTPG BOPUIFSPCKFDU"EFQFOEFODZJTBO PCKFDUUIBUDBOCFVTFE BTFSWJDF z 8JLJQFEJB%FQFOEFODZJOKFDUJPO dependency͸ΦϒδΣΫτ ΦϒδΣΫτͷ஫ೖ

Slide 11

Slide 11 text

Πϝʔδ͠Α͏ DIͬΆ͍ͷ͸Ͳͬͪʁ ۩ࡐɺຯΛௐ੔ɺม͑΍͍͢ͷ͸

Slide 12

Slide 12 text

Πϝʔδ͠Α͏ DIͬΆ͍ͷ͸Ͳͬͪʁ ۩ࡐɺຯΛௐ੔ɺม͑΍͍͢ͷ͸

Slide 13

Slide 13 text

ιʔείʔυͩͱ class FriedRice val friedRice = FriedRice() class BowlOFRice(val rice: Rice, val topping: Topping) interface Topping interface Rice class JapaneseRice : Rice class BeefTopping : Topping //オブジェクトを入れる val beefBowl = BowlOFRice(JapaneseRice(), BeefTopping()) ※ઃܭ࣍ୈͰνϟʔϋϯ΋DIԽͰ͖·͢

Slide 14

Slide 14 text

DIͷࢫຯɿมߋʹڧ͍ • ஫ೖ͞ΕΔ΋ͷ͸ΦϒδΣΫτ͕ͩ
 ΠϯλʔϑΣʔεʢ࢓༷ʣʹґଘͨ͠΄͏͕ΑΓॊೈ • ڇက͡Όͳͯ͘ɺ;Γ͔͚ကͰ΋໰୊ͳ͠ • ܧঝͰͳ͘ɺ࢓༷ʹґଘ͍ͯ͠ΔͨΊՄೳ • ςετ(ຯݟ)ͷͱ͖ʹϥΠεΛϞοΫʹ͢Δ͜ͱ ͰɺຯݟՄೳ

Slide 15

Slide 15 text

DI Container (Dependency Injection Container)

Slide 16

Slide 16 text

DIͱDI Container • DI Container͸
 DIΛ࣮ݱ͢ΔͨΊͷศརπʔϧͰ͔͠ͳ͍ • ઌఔͷઆ໌Ͱ
 DaggerͳͲπʔϧ͕Ͱ͖ͯ·͔ͨ͠ʁ class BowlOFRice(val rice: Rice, val topping: Topping) //オブジェクトを入れる val beefBowl = BowlOFRice(JapaneseRice(), BeefTopping())

Slide 17

Slide 17 text

DI Containerͷࢫຯ • ࠷େͷϞνϕʔγϣϯɿΊΜͲ͏͍͘͞ • ͍͍ͪͪΦϒδΣΫτ࡞੒͢Δͷ͕໘౗ • ౎౓new͢Δඞཁ͕ͳ͘࢖͍·Θ͍ͨ͠ • ஫ೖ͢ΔΦϒδΣΫτΛมߋ͢Δ࣌ʹɺ
 ͢΂ͯม͑Δͷ໘౗ ґଘؔ܎Λهड़ͨ͠Β উखʹੜ੒ɺ஫ೖͯ͘͠ΕͨΒ͍͍ͷʹ

Slide 18

Slide 18 text

DI Containerͷࢫຯ • ࠷େͷϞνϕʔγϣϯɿΊΜͲ͏͍͘͞ • ͍͍ͪͪΦϒδΣΫτ࡞੒͢Δͷ͕໘౗ • Θ͟Θ͟new͢Δඞཁ͕ͳ͘࢖͍·Θ͍ͨ͠ • ஫ೖ͢ΔΦϒδΣΫτΛมߋ͢Δ࣌ʹɺ
 ͢΂ͯม͑Δͷ໘౗ ґଘؔ܎Λهड़ͨ͠Β উखʹੜ੒ɺ஫ೖͯ͘͠ΕͨΒ͍͍ͷʹ DI Container͞Μ͓ئ͍͠·͢

Slide 19

Slide 19 text

Πϝʔδ͠Α͏ ڇက DIίϯςφ ΅͘Β͸ڇကΛఆٛ

Slide 20

Slide 20 text

DI Container? Service Locator? ͕͢͞ʹຊ୊ʹೖΓ·͢ɻ

Slide 21

Slide 21 text

Android DI: Dagger2?

Slide 22

Slide 22 text

DIͷ֓೦ͷΘΓʹෳࡶ • ίϯϙʔωϯτɺαϒίϯϙʔωϯτɺϞδϡʔ ϧɺείʔϓΛద੾ʹఆٛ͢Δͷ͕େม • DIͷྖҬ͔ΒAndroidྖҬʹ౿ΈࠐΜͰ͖͍ͯΔ • Activity,Fragment͕ੜ੒͞Εͨޙ
 Ͱ͔ࠩ͠͠ࠐΊͳ͍΋ͷఆ͕ٛ໘౗ • kaptͱDagger2ͱͷ૬ੑ͕ѱ͍ • kvs-schemaͳͲͰ࡞ΒΕΔΫϥεΛProviderͰ ͖ͳ͍ɻʢHolderͳͲ࡞Ε͹Մೳʣ

Slide 23

Slide 23 text

KotlinͳΒҧ͏ํ๏͕͋Δ͔΋ • ྫ͑͹ɺDelegationɺDelegated PropertiesΛ ࢖͑͹΋ͬͱ͏·͘Ͱ͖Δ͔΋ class Delegate {
 operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
 return "$thisRef, thank you for delegating '${property.name}' to me!"
 }
 
 operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
 println("$value has been assigned to '${property.name} in $thisRef.'")
 }
 } 
 class Example {
 var p: String by Delegate()
 }

Slide 24

Slide 24 text

Kotlin + Android DI: Kodein

Slide 25

Slide 25 text

• Kotlin੡ • kaptΛ࢖Θͳ͍ͷͰɺϏϧυ஗͘ͳΒͳ͍ • KotlinͷػೳΛ͏·͘࢖͍ͬͯΔ • DelegationΛ࢖ͬͯɺ͏·͘஫ೖ͍ͯ͠Δ • ௚ײతͳจ๏ Kodein

Slide 26

Slide 26 text

Kodein͕Ͱ͖Δ͜ͱ • Lazily instantiate your dependencies when needed • Stop caring about dependency initialization order • Easily bind classes or interfaces to their instance or provider • Easily debug your dependency bindings and recursions SalomonBrys/KodeinͷREADME.mdΑΓ

Slide 27

Slide 27 text

Kodein͕Ͱ͖Δ͜ͱ • Lazily instantiate your dependencies when needed • Stop caring about dependency initialization order • Easily bind classes or interfaces to their instance or provider • Easily debug your dependency bindings and recursions SalomonBrys/KodeinͷREADME.mdΑΓ •ඞཁͳ࣌ʹΠϯελϯεԽ •providerʹ
 ΫϥεɺΠϯλʔϑΣʔεɺΠϯελϯεΛઃఆͰ͖Δ

Slide 28

Slide 28 text

Moduleఆٛ Kodein.Module { bind<型>(Qualifier) with singleton { … } bind<型>(Qualifier) with provider { … } bind<型>(Qualifier) with instance ( … ) } • Dagger2ͷModuleͱಉ͡ • KotlinͷػೳΛϑϧʹ࢖͍ͬͯͯจ๏ͰಡΈ΍͍͢ • infixɺϥϜμলུɺϨγʔόʔࢦఆϥϜμ

Slide 29

Slide 29 text

Moduleྫ object NetworkModule { val module = Kodein.Module { bind() with singleton { OkHttpClient.Builder().build() } bind() with singleton { GsonConverterFactory.create() } bind() with singleton { Retrofit.Builder() .baseUrl(BuildConfig.GITHUB_ENDOPOINT) .addConverterFactory(instance()) .client(instance()).build() } } }

Slide 30

Slide 30 text

Moduleྫ object NetworkModule { val module = Kodein.Module { bind() with singleton { OkHttpClient.Builder().build() } bind() with singleton { GsonConverterFactory.create() } bind() with singleton { Retrofit.Builder() .baseUrl(BuildConfig.GITHUB_ENDOPOINT) .addConverterFactory(instance()) .client(instance()).build() } } }

Slide 31

Slide 31 text

Kodeinͷఆٛ class App : Application(), KodeinAware { override val kodein: Kodein = Kodein { bind() with instance(this@App) import(NetworkModule.module) import(PresentationModule.module) } } • Dagger2ͷComponentͱಉ͡ • ࢖༻͢ΔϞδϡʔϧΛఆٛ͢Δ

Slide 32

Slide 32 text

Inject class MVPActivity : AppCompatActivity(), GithubView { val binding by lazy { DataBindingUtil.setContentView<…>(this, R.layout…) } val injector: KodeinInjector = KodeinInjector() val presenter: GithubPresenter by injector.instance() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) injector.inject(Kodein { extend(kodein) bind() with instance(this@MVPActivity) }) binding.searchBtn.setOnClickListener { presenter.search(binding.userEdit.text.toString()) } } }

Slide 33

Slide 33 text

Dagger2 ͱ Kodein ൺֱ

Slide 34

Slide 34 text

Dagger2 ͱ Kodein ,PEFJO %BHHFS ґଘؔ܎Λ LBQUͰੜ੒ ෆཁ ඞཁ BQUͰੜ੒͞Ε ͨ΋ͷJOKFDU ̋ ˚ )PMEFSΛ࡞ΔͳͲ ґଘؔ܎ͷ Τϥʔ ࣮ߦ࣌ ίϯύΠϧ࣌ είʔϓ ̋ ̋ /BNFE 2VBMJpFS ̋ ̋

Slide 35

Slide 35 text

ґଘؔ܎͕͓͔͍࣌͠ͷΤϥʔ • Daggerͷ৔߹͸ɺίϯύΠϧ࣌ʹΤϥʔ • aptͰੜ੒͢ΔͷͰɺґଘؔ܎͕͓͔͍͠৔߹ʹ͸ ίϯύΠϧͰ͖·ͤΜɻ • Kodeinͷ৔߹͸ɺ࣮ߦ࣌ʹΤϥʔ • MapΈ͍ͨͳ΋ͷʹɺΦϒδΣΫτΛಥͬࠐΜͰऔ Γग़ͯ͠Δ͚ͩͳͷͰɺinject͢Δͱ͖ʹͭͬ͜· Ε͍ͯΔͷ͔Ͳ͏͔͸ɺ࣮ߦ͞ΕΔ·ͰΘ͔Βͳ͍ ͨΊͰ͢ɻ

Slide 36

Slide 36 text

·ͱΊ • DIπʔϧ:Dagger2Ҏ֎ͷબ୒΋͋Δ͔΋ • DelegationΛ࢖ͬͯDIΛ࣮ݱͰ͖ͦ͏ • Kotlin͕Android։ൃݴޠͱͯ͠ೖͬͨ͜ͱͰఆ൪ϥ ΠϒϥϦͷมಈ͕͋Δ͔΋͠Εͳ͍… • Kodein͸Service Locatorͱͯ͠࢖͍΍͍͢ͷͰ஫ҙ

Slide 37

Slide 37 text

αϯϓϧ • KodeinSample • https://github.com/kamedon/ KodeinSample

Slide 38

Slide 38 text

͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠