Slide 1

Slide 1 text

,PUMJOසग़දݱ !MWMB

Slide 2

Slide 2 text

lvla lvla0805 Ѫᖒ๖ .PZVSV"J[BXB   -FBEFOHJOFFSPGQBJST%JWFVSFLB *OD  FVSFLB,PUMJO&WBOHFMJTU  +BWB,PUMJO3Y+BWB

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

 QBJST  $PVQMFT  NBUDIHSPVQ *"$  OPXIJSJOH

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

NFFUT

Slide 7

Slide 7 text

WBM

Slide 8

Slide 8 text

‣ SFBEPOMZ ‣ جຊWBMΛར༻͍ͯ͠Δɻ ‣ ňͦΕWBSͰ͋Δඞཁ͋Δͷ ʼn ‣ ΈΜͳ+BWBॻ࣌͘ʹpOBMΛ͚ͭΔΑ͏ʹͳͬͨ WBM val readOnliy = 10 readOnliy = 20 // error

Slide 9

Slide 9 text

/VMMBCMF

Slide 10

Slide 10 text

‣ /VMMΛڐ༰͢Δܕͱɺ/VMMΛڋ൱͢Δܕ͕໌֬ʹΘ͚ΒΕ͍ͯΔ ‣ OPU/VMMʹ͸OVMM͸୅ೖͰ͖ͳ͍͠ɺOVMMBCMFΛ୅ೖ͢Δ͜ͱ΋ग़དྷͳ ͍ ‣ ৗʹ/VMMΛҙࣝͯ͠ίʔσΟϯά͢Δ͜ͱʹͳΔ /VMMBCMF val nullable: String? = null var notNull: String = null // error notNull: String = nullable // error

Slide 11

Slide 11 text

4BGF$BMM

Slide 12

Slide 12 text

‣ /VMMBCMF͕/VMMͷ৔߹ɺOVMM͕ฦ٫͞ΕΔɻ ‣ /VMMBCMF͕/VMMͰͳ͍৔߹ɺؔ਺͕࣮ߦ͞ΕΔϓϩύςΟͷ஋͕ฦ٫ ͞ΕΔɻ 4BGF$BMM nullablePerson?.toString() nullablePerson?.age

Slide 13

Slide 13 text

%FMFHBUFE1SPQFSUJFT

Slide 14

Slide 14 text

‣ ϓϩύςΟͷॳظԽΛҕৡͰ͖Δ ‣ ॳظԽΛ஗ԆͰ͖Δ ‣ ϥΠϑαΠΫϧʹґଘ͢Δ΋ͷͰ΋WBMͰॳظԽͰ͖Δ %FMFHBUFE1SPQFSUJFT val view by bindView(R.id.view) val string by lazy { getString(R.string.foo) }

Slide 15

Slide 15 text

&YUFOTJPO'VODUJPO

Slide 16

Slide 16 text

‣ ܧঝ͢Δࣄͳ͘ɺطଘΫϥεʹؔ਺Λ௥ՃͰ͖Δɻ &YUFOTJPO'VODUJPO fun Activity.toWeb(uri: Uri) { startActivity( Intent(Intent.ACTION_VIEW, uri) ) } fun Subscription.addTo(subscriptions: CompositeSubscription) { subscriptions(this) }

Slide 17

Slide 17 text

4JOHMF&YQSFTTJPO'VODUJPO

Slide 18

Slide 18 text

‣ ؔ਺ͷ࣮૷͕୯Ұࣜͷ৔߹ɺฦΓ஋ͷએݴɺϒϩοΫɺSFUVSOΛলུ Ͱ͖Δɻ 4JOHMF&YQSFTTJPO'VODUJPO @Provide fun provideApplicationContext() = applicationContext

Slide 19

Slide 19 text

)JHIFS0SEFS'VODUJPO

Slide 20

Slide 20 text

‣ ؔ਺ΛҾ਺ʹͱͬͨΓ ‣ ؔ਺Λฦ٫͢Δؔ਺ ‣ +BWB͸ؔ਺͕ϑΝʔετΫϥεΦϒδΣΫτ͡Όͳ͍͔Β͜Ε͕Ͱ͖ ͳ͍ )JHIFS0SEFS'VODUJPO fun foo( function: (Int)->Unit ) { … } fun bar(): (Int)->String { … }

Slide 21

Slide 21 text

‣ 7JFXΛҾ਺ʹͱΓ6OJU 㲈7PJE Λฦ٫͢Δؔ਺ͱಉ౳Ͱ͸ 4". public interface OnClickListener { void onClick(View var1); }

Slide 22

Slide 22 text

‣ ؔ਺ͭͷΠϯλʔϑΣʔεΛҾ਺ʹऔΔؔ਺ʹ͸ɺؔ਺Λ౉ͤ·͢ ‣ هड़ྔΊͬͪΌݮΔʜ 4". view.setOnClickListener({ view -> view.visibility = View.GONE }) view.setOnClickListener { view -> view.visibility = View.GONE } view.setOnClickListener { it.visibility = View.GONE }

Slide 23

Slide 23 text

MFU

Slide 24

Slide 24 text

‣ ؔ਺Λ౉͢ͱɺͦͷؔ਺Λ࣮ߦͯ͘͠ΕΔɻ ‣ 4BGF$BMMͰMFUΛ࣮ߦ͍ͯ͠ΔͷͰɺOVMMͰͳ͍৔߹ʹͷΈ࣮ߦ͞Ε Δɻ MFU nullable?.let { it.doSomething }

Slide 25

Slide 25 text

BQQMZ

Slide 26

Slide 26 text

‣ Ϩγʔό 'PP'SBHNFOU ͷϓϩύςΟ΍ؔ਺Λར༻͢Δؔ਺Λ౉͢ ‣ ͦΕΒ͕ద༻͞ΕͨϨγʔό͕ฦ٫͞ΕΔɻ BQQMZ FooFragment().apply { arguments = Bundle().apply { pustString("key", "value") } }

Slide 27

Slide 27 text

‣ 4JOHMF&YQSFTTJPO'VODUJPOͱ૊Έ߹ΘͤΔͱ͖ͬ͢Γ BQQMZ fun newInstance() = FooFragment().apply { arguments = Bundle().apply { pustString("key", "value") } }

Slide 28

Slide 28 text

EFDMBSJOHQSPQFSUJFTBOE JOJUJBMJ[JOHUIFNGSPNQSJNBSZ DPOTUSVDUPS

Slide 29

Slide 29 text

‣ ϓϩύςΟͷએݴͱॳظԽΛɺϓϥΠϚϦίϯετϥΫλͰߦ͑Δ ‣ ϗϯτָʜ EFDMBSJOHQSPQFSUJFTBOEJOJUJBMJ[JOHUIFNGSPNQSJNBSZDPOTUSVDUPS class Person(val firstName: String, val lastName: String, var age: Int) { // ... }

Slide 30

Slide 30 text

%BUB$MBTT

Slide 31

Slide 31 text

‣ FRVBMT IBTI$PEF UP4USJOH DPQZ ΛίϯύΠϧ࣌ʹੜ੒ͯ͠ ͘ΕΔ ‣ Ξοϓσʔτ͞Εͳ͍FRVBMT ͱ͞Α͏ͳΒͰ͖Δɻ %BUB$MBTT data class Person(val firstName: String, val lastName: String, var age: Int)

Slide 32

Slide 32 text

OUBSPLOJU

Slide 33

Slide 33 text

‣ ֦ுؔ਺Λ࢖ͬͯBTTFSU5IBUΛ͍͍ײ͡ʹͯ͘͠ΕΔ ‣ ΋͏͜Ε͕ͳ͍ͱςετ͸ॻ͚ͳ͍ʜ LOJU @Test fun test() { (1 + 2).should be 3 // assertThat(1 + 2, `is`(3)) }

Slide 34

Slide 34 text

TZTZBHJLNPDLJUP

Slide 35

Slide 35 text

‣ ֦ுؔ਺Λ࢖ͬͯNPDLJUPΛ͍͍ײ͡ʹͯ͘͠ΕΔɻ ‣ ͜Ε΋ͳ͍ͱςετͰ͖ͳ͍ʜ LNPDLJUP var item: Item = mock() item.length().invoked.thenReturn(10) item.length().should be 10 item.verify().length()

Slide 36

Slide 36 text

5IBOLZPV