Slide 1

Slide 1 text

Javaष͘ͳ͍ ͔Θ͍͍খௗʹ͢Δ࿩ - ϝϧΧϦ JP ͷίʔυྫΛަ͑ - by @sintario Nov. 22, 2017 Mercari × Souzoh Android Talk @mercari

Slide 2

Slide 2 text

͜͜·ͰΨν੎ͷ࿩Ͱ ർΕ·ͨ͠ΑͶʁ

Slide 3

Slide 3 text

ͳͷͰٳܜલͷ
 ͍ܰ࿩ʹ͠·͢Ͷ

Slide 4

Slide 4 text

ࣗݾ঺հ • @sintario (Chronum Sintario) • ϝϧΧϦࣾྺ22೔Ίͷ৽ਓΤϯδχΞ • ീԦࢠࢢࡏॅʢژԦઢͱେߐށઢͰձ͑ΔΑʣ • ࠷ۙͷझຯ͸Ոఉͷෆཁ඼ΛϝϧΧϦͰചΓ͞͹͍ ͯച্ۚͰࣗ෼༻ͷ͓΋ͪΌΛങ͍ړΔ͜ͱʢ௚ۙ ͸੟ˑ͓ʹ͍͞Μͷ࣋ͬͯͳ͍רΛະ࢖༻৽඼300ԁ റΓͰूΊ͍ͯ·ͨ͠ʣ

Slide 5

Slide 5 text

Career Background • JustSystems •Java, XML •ATOK Mac, Tweet ATOK, Objective-C, C++ • Lunascape •Web browser iOS app • DeNA •iOS apps, Android apps •Groovy, νϥγϧ, KenCoM, ͞ΜΆδελ •Healthcare, KenCoM, Ruby on Rails, Swift, Kotlin

Slide 6

Slide 6 text

ӈͷਓᐌ͘ http://mercan.mercari.com/entry/2017/09/28/130000

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

̏̕೔ؒͷ༗څফԽΛܦͯϝϧΧϦ΁ ͦͷؒͣͬͱՈࣄख఻͍ ϝϧΧϦ࢖͍ࠐΜͰ·ͨ͠

Slide 9

Slide 9 text

Ͱɺٱ͠ͿΓʹ ίʔυॻ͍ͯΔΜ͕ͩ

Slide 10

Slide 10 text

Զͦ͏͍͑͹ ϨϏϡʔ͓͡͞ΜͩͬͨΘ

Slide 11

Slide 11 text

Kotlin Λ࢖ͬͯ ಡΊΔίʔυΛॻ͘࿩

Slide 12

Slide 12 text

ͳΜͰࠓ͞Βͦͷ࿩Αʁ

Slide 13

Slide 13 text

Android ͓͡͞Μͨͪʹ ݱ໾Ͱੜ͖࢒ͬͯཉ͍͠

Slide 14

Slide 14 text

W○ntedly ͱ͔ݟΔͱ ͜͏͍͏ͷ͍ͬͺ͍ࡌͬͯΔ͚Ͳ ʮฐࣾ͸ฏۉ೥ྸ20୅Ͱ͢ʯ ʮຖि༵ۚ೔͸ŰƅŖžŖͯ͠·͢ʯ ͱ͔ͳΜͱ͔

Slide 15

Slide 15 text

पΓʹ̏̌ޙ൒ա͗ͨ ΤϯδχΞԿਓ͍ΔΑʁ ελʔτΞοϓͷࣾ௕ͱ͔CTOͱ͔ʹͳΔͷ͔ͳʁ ͳΕΔͷ͔ͳʁ ໘઀Ͱ10೥ޙԿ͠·͔ͬͯ͢ݴΘΕͯ౴͑ΒΕΔʁ Ϛωʔδϝϯτ΄Μͱʹ΍Γ͍ͨʁ

Slide 16

Slide 16 text

͓ͬ͞Μ͕ ΤϯδχΞͱͯ͠ੜ͖࢒Δʹ͸ Α͘ރΕ͍ͯΔ͜ͱ͕େࣄ

Slide 17

Slide 17 text

Α͘ރΕ͍ͯΔͱ͸ • ແ೉ͳٕज़Ͱແ೉ʹ෺͕࡞ΕΔ • ଟগݹ͍஌ࣝΛ࢖͍·Θͯ͠एऀʹυϠΕΔ • ଟগ͸ษڧ΋·ͩͰ͖Δɺඈͼ͔ͭͳ͍͚Ͳ Ͱ͖Δ • ʢ࿝֐Β͘͠ͳ͍ײ͡Ͱ͋Δʣ

Slide 18

Slide 18 text

μϝͳރΕํ • ΋͏ͳΜʹ΋ษڧͰ͖ͳ͍Ͱ͢ •֮͑ͨݴޠͻͱͭͰҰੜ৯͍ͬͯ͘ʢJavaͷ ਓͱ͔ʣ •֮͑ͨΠσΟΦϜҎ֎͸޻෉΋Ͱ͖ͳ͘ͳΔ •ૣ͍ͱ΄Μͱʹ20୅ͱ͔Ͱ΋ؕͬͯ͠·͏

Slide 19

Slide 19 text

μϝͳރΕํ

Slide 20

Slide 20 text

ͦΜͳ Ѫ͢΂͖͓ͬ͞Μͨͪʹ Kotlin Λ঑Ί͍ͨ

Slide 21

Slide 21 text

Kotlin ͬͯ Կ͕͋Γ͕͍ͨͷʁ

Slide 22

Slide 22 text

͓ͬ͞Μʹͱͬͯخ͍͜͠ͱ ͳΜͳͷʁ Kotlin ͬͯ Կ͕͋Γ͕͍ͨͷʁ

Slide 23

Slide 23 text

ʢ৽ͨʹʣ ֮͑Δ͜ͱ͕গͳ͍

Slide 24

Slide 24 text

ʢ৽ͨʹʣ ֮͑Δ͜ͱ͕গͳ͍ ݴޠ͕͍͍ҙຯͰශ૬ ͚ͩͲͪΌΜͱݱ୅ޠ +BWBͱ͔3VCZͱ͔4XJGUॻ͍ͯͨਓͳΒ ࢀೖোน௿͍

Slide 25

Slide 25 text

ͿͬͪΌ͚ ͜Ε͚ͩ஌ͬͯΕ͹ ͍͍͓̺ͩͨ

Slide 26

Slide 26 text

ͿͬͪΌ͚ ͜Ε͚ͩ஌ͬͯΕ͹ ͍͍͓̺ͩͨ ?., .let, .apply, when, ?: return, companion object, fun

Slide 27

Slide 27 text

ͿͬͪΌ͚ ͜Ε͚ͩ஌ͬͯΕ͹ ͍͍͓̺ͩͨ ?., .let, .apply, when, ?: return, companion object, fun ͋ͱ͸ . ଧͬͯ Android Studio ઌੜʹڭ͑ͯ΋Β͍ͳ

Slide 28

Slide 28 text

ίϯύΫτͳݴ༿Ͱ Readable ͳ ίʔυ͕ॻ͚Δ

Slide 29

Slide 29 text

ݺΜͩʁಡΜͩʁ https://www.mercari.com/jp/search/? keyword=%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB %E3%82%B3%E3%83%BC%E3%83%89 ষɹཧղ͠΍͍͢ίʔυ ষɹ໊લʹ৘ใΛ٧ΊࠐΉ ষɹޡղ͞Εͳ໊͍લ ষɹඒ͠͞ ষɹίϝϯτ͢΂͖͜ͱΛ஌Δ ষɹίϝϯτ͸ਖ਼֬Ͱ؆ܿʹ ষɹ੍ޚϑϩʔΛಡΈ΍͘͢͢Δ ষɹڊେͳࣜΛ෼ׂ͢Δ ষɹม਺ͱಡΈ΍͢͞ ষɹແؔ܎ͷԼҐ໰୊Λநग़͢Δ ষɹҰ౓ʹͭͷ͜ͱΛ ষɹίʔυʹࢥ͍ΛࠐΊΔ ষɹ୹͍ίʔυΛॻ͘ ষɹςετͱಡΈ΍͢͞ ষɹʮ෼ʗ࣌ؒΧ΢ϯλʯΛઃܭɾ࣮૷͢Δ

Slide 30

Slide 30 text

obvious by definition Readable ͳΒ ίʔυ͕ಡΈ΍͍͢

Slide 31

Slide 31 text

Readable ͳΒ ͍·͞Β ίʔσΟϯάͷఴ࡟͞Εͳ͍

Slide 32

Slide 32 text

Readable ͳΒ ϏδωεϩδοΫʹ ूதͰ͖Δ

Slide 33

Slide 33 text

Readable ͳΒ ϏδωεϩδοΫʹ ूதͰ͖Δ ॻ͋͘ͳͨ΋ɺಡΉ஥ؒ΋

Slide 34

Slide 34 text

Readable ͳίʔυ͕ ॻ͚Δίʔμʔ͸ ࢌ͑ΒΕΔ

Slide 35

Slide 35 text

No content

Slide 36

Slide 36 text

ͭ·Γ

Slide 37

Slide 37 text

Readable ͸ ͓͍͍͠

Slide 38

Slide 38 text

͓͍͍͠ࢥ͍Λͤͯ͘͞ΕΔ Kotlin ͕͔Θ͍͘ͳΔ

Slide 39

Slide 39 text

খௗ ,PUMJO

Slide 40

Slide 40 text

͕͔ͩ͠͠

Slide 41

Slide 41 text

͓ͬ͞Μ͸ ֶशݶք໨લͳͷͰ ಓ۩͚ͩ༩͑ΒΕΔͱ ܦݧͷԆ௕ઢ্Ͱ͔͠ ࢖͑ͳ͔ͬͨΓ͢Δͷͩʂ

Slide 42

Slide 42 text

ྫ͑͹ ͜Μͳ Java ͕ ͋ͬͨͱ͢Δ͡Όͳ͍Ͱ͔͢ʔ

Slide 43

Slide 43 text

public class ModalContentWebActivity extends SchemeWebActivity { public static Intent createIntent(Context context, String url){ return createIntent(context, url, null, null); } public static Intent createIntent(Context context, String url, String funcName, String params){ Intent intent = new Intent(context, ModalContentWebActivity.class); intent.putExtra(S.url, url); intent.putExtra(S.funcName, funcName); intent.putExtra(S.params, params); return intent; }

Slide 44

Slide 44 text

Kotlinize it

Slide 45

Slide 45 text

ͦͨ͠Β͞ʔ ૉͷ͓ͬ͞Μ͸ ͖ͬͱ͜Μͳͷॻ͘ΜͩΑͶʔ

Slide 46

Slide 46 text

public class ModalContentWebActivity extends SchemeWebActivity { public static Intent createIntent(Context context, String url){ return createIntent(context, url, null, null); } public static Intent createIntent(Context context, String url, String funcName, String params){ Intent intent = new Intent(context, ModalContentWebActivity.class); intent.putExtra(S.url, url); intent.putExtra(S.funcName, funcName); intent.putExtra(S.params, params); return intent; }

Slide 47

Slide 47 text

class ModalContentWebActivity: SchemeWebActivity() { companion object { fun createIntent(context: Context, url: String?): Intent { return createIntent(context, url, null, null) } fun createIntent(context: Context, url: String?, funcName: String?, params: String?): Intent { val intent = Intent(context, ModalContentWebActivity::class.java) intent.putExtra(S.url, url) intent.putExtra(S.funcName, funcName) intent.putExtra(S.params, params) return intent }

Slide 48

Slide 48 text

͔Θ͍͘ͳ͍খௗ ୸Ր+BWBͷʹ͓͍͕͵͚ͳ͍

Slide 49

Slide 49 text

·ͣ σϑΥϧτҾ਺ͬͯͷ͕ ͋ͬͯͳ

Slide 50

Slide 50 text

class ModalContentWebActivity: SchemeWebActivity() { companion object { fun createIntent(context: Context, url: String?): Intent { return createIntent(context, url, null, null) } fun createIntent(context: Context, url: String?, funcName: String?, params: String?): Intent { val intent = Intent(context, ModalContentWebActivity::class.java) intent.putExtra(S.url, url) intent.putExtra(S.funcName, funcName) intent.putExtra(S.params, params) return intent }

Slide 51

Slide 51 text

class ModalContentWebActivity: SchemeWebActivity() { companion object { fun createIntent(context: Context, url: String?, funcName: String? = null, params: String? = null): Intent { val intent = Intent(context, ModalContentWebActivity::class.java) intent.putExtra(S.url, url) intent.putExtra(S.funcName, funcName) intent.putExtra(S.params, params) return intent }

Slide 52

Slide 52 text

class ModalContentWebActivity: SchemeWebActivity() { companion object { fun createIntent(context: Context, url: String?, funcName: String? = null, params: String? = null): Intent { val intent = Intent(context, ModalContentWebActivity::class.java) intent.putExtra(S.url, url) intent.putExtra(S.funcName, funcName) intent.putExtra(S.params, params) return intent } overload ؔ਺ফ͑ͨʂ໌ࣔఆٛҰݸ࡟ݮ

Slide 53

Slide 53 text

apply ͠·͠ΐ͏ͥ

Slide 54

Slide 54 text

apply ͠·͠ΐ͏ͥ /** * Calls the specified function [block] with `this` value as its receiver * and returns `this` value. */ @kotlin.internal.InlineOnly public inline fun T.apply(block: T.() -> Unit): T { block(); return this }

Slide 55

Slide 55 text

class ModalContentWebActivity: SchemeWebActivity() { companion object { fun createIntent(context: Context, url: String?, funcName: String? = null, params: String? = null): Intent { val intent = Intent(context, ModalContentWebActivity::class.java) intent.putExtra(S.url, url) intent.putExtra(S.funcName, funcName) intent.putExtra(S.params, params) return intent }

Slide 56

Slide 56 text

class ModalContentWebActivity: SchemeWebActivity() { companion object { fun createIntent(context: Context, url: String?, funcName: String? = null, params: String? = null): Intent { return Intent(context, ModalContentWebActivity::class.java).apply { putExtra(S.url, url) putExtra(S.funcName, funcName) putExtra(S.params, params) } }

Slide 57

Slide 57 text

class ModalContentWebActivity: SchemeWebActivity() { companion object { fun createIntent(context: Context, url: String?, funcName: String? = null, params: String? = null): Intent { return Intent(context, ModalContentWebActivity::class.java).apply { putExtra(S.url, url) putExtra(S.funcName, funcName) putExtra(S.params, params) } } ͜ͷதͰ͸ this ͕ Intent ΠϯελϯεͳͷͰ Ϩγʔόʔهड़Λল͚Δ

Slide 58

Slide 58 text

ॻ͖׳ΕΔͨΊͷίπͱͯ͠͸ ࠷ॳʹ return Hoge() ͬͯॻ͍ͪΌ͔ͬͯΒޙஔम ০͢Δߟ͑Ͱ΍Δͱ͍͍͔΋ ͋ͱ͸ val/var ͷΑ͏ͳҰ࣌ม਺ʹड͚औΔߟ͑Λ ࣺͯΔ͜ͱ

Slide 59

Slide 59 text

୯Ұࣜؔ਺͸͞Βʹ

Slide 60

Slide 60 text

class ModalContentWebActivity: SchemeWebActivity() { companion object { fun createIntent(context: Context, url: String?, funcName: String? = null, params: String? = null): Intent { return Intent(context, ModalContentWebActivity::class.java).apply { putExtra(S.url, url) putExtra(S.funcName, funcName) putExtra(S.params, params) } }

Slide 61

Slide 61 text

class ModalContentWebActivity: SchemeWebActivity() { companion object { fun createIntent(context: Context, url: String?, funcName: String? = null, params: String? = null) = Intent(context, ModalContentWebActivity::class.java).apply { putExtra(S.url, url) putExtra(S.funcName, funcName) putExtra(S.params, params) }

Slide 62

Slide 62 text

class ModalContentWebActivity: SchemeWebActivity() { companion object { fun createIntent(context: Context, url: String?, funcName: String? = null, params: String? = null) = Intent(context, ModalContentWebActivity::class.java).apply { putExtra(S.url, url) putExtra(S.funcName, funcName) putExtra(S.params, params) } ࣜͷ໭Γ஋Λฦ͢Αɺͱ͍͏௚ײతͳදݱʹɻ return ͱ͔΋͸΍ॻ͍ͨΒಐః

Slide 63

Slide 63 text

࠷ॳͱൺֱ͠·͠ΐ͏

Slide 64

Slide 64 text

public class ModalContentWebActivity extends SchemeWebActivity { public static Intent createIntent(Context context, String url){ return createIntent(context, url, null, null); } public static Intent createIntent(Context context, String url, String funcName, String params){ Intent intent = new Intent(context, ModalContentWebActivity.class); intent.putExtra(S.url, url); intent.putExtra(S.funcName, funcName); intent.putExtra(S.params, params); return intent; }

Slide 65

Slide 65 text

class ModalContentWebActivity: SchemeWebActivity() { companion object { fun createIntent(context: Context, url: String?, funcName: String? = null, params: String? = null) = Intent(context, ModalContentWebActivity::class.java).apply { putExtra(S.url, url) putExtra(S.funcName, funcName) putExtra(S.params, params) }

Slide 66

Slide 66 text

class ModalContentWebActivity: SchemeWebActivity() { companion object { fun createIntent(context: Context, url: String?, funcName: String? = null, params: String? = null) = Intent(context, ModalContentWebActivity::class.java).apply { putExtra(S.url, url) putExtra(S.funcName, funcName) putExtra(S.params, params) } ΋ͷ͛͑͢ߦ਺ݮΔͶ͑ จࣈ਺ݮΔͶ͑

Slide 67

Slide 67 text

վΊͯಡΜͰΈΔͱϚδ͍͍ຊ https://www.mercari.com/jp/search/? keyword=%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB %E3%82%B3%E3%83%BC%E3%83%89 ষɹཧղ͠΍͍͢ίʔυ ষɹ໊લʹ৘ใΛ٧ΊࠐΉ ষɹޡղ͞Εͳ໊͍લ ষɹඒ͠͞ ষɹίϝϯτ͢΂͖͜ͱΛ஌Δ ষɹίϝϯτ͸ਖ਼֬Ͱ؆ܿʹ ষɹ੍ޚϑϩʔΛಡΈ΍͘͢͢Δ ষɹڊେͳࣜΛ෼ׂ͢Δ ষɹม਺ͱಡΈ΍͢͞ ষɹແؔ܎ͷԼҐ໰୊Λநग़͢Δ ষɹҰ౓ʹͭͷ͜ͱΛ ষɹίʔυʹࢥ͍ΛࠐΊΔ ষɹ୹͍ίʔυΛॻ͘ ষɹςετͱಡΈ΍͢͞ ষɹʮ෼ʗ࣌ؒΧ΢ϯλʯΛઃܭɾ࣮૷͢Δ

Slide 68

Slide 68 text

ͱ͍͏͜ͱͰ • খௗ͔Θ͍͍Αখௗ • ංେͨ͠ෛ࠴Λฦࡁ͢Δ͍ͭͰʹɺ͔Θ͍͍ίʔυʹɻ • ͔Θ͍͍খௗ͸ಡΈ΍͍͢Αɻ • Kotlin Β͘͠খ͔͚ͨ͘͞Β͓͡͞Μ·͍ͩΔΑͬͯݴ͑ ͦ͏ • ฐࣾͰ΋ Kotlin ԽΛ͢͢Ί͍ͯ·͢ͳ͏ʢPRϨϏϡʔͰ َͷΑ͏ʹఴ࡟͍ͯ͠·͢ʣ