Slide 1

Slide 1 text

(less than) 100 lines or die. "OESPJEͰ,PUMJOษڧձ !NBUUBL

Slide 2

Slide 2 text

とつぜんですが、

Slide 3

Slide 3 text

Javaで こんなコードありませ んか?

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

͍ͭͷ·ʹ͔௕͘ͳ͍ͬͯΔߦ਺ɻɻɻ

Slide 6

Slide 6 text

つらい…!!

Slide 7

Slide 7 text

もし、 10⾏のコードなら?

Slide 8

Slide 8 text

1໨ͰΘ͔Δʂ

Slide 9

Slide 9 text

100⾏のコードなら?

Slide 10

Slide 10 text

਺ेඵ͋Ε͹ ཧղͰ͖Δʂ

Slide 11

Slide 11 text

1000⾏のコードなら?

Slide 12

Slide 12 text

਺෼ͳ͍ͱ ಡΊͳ͍ʂ

Slide 13

Slide 13 text

1万⾏のコードなら?

Slide 14

Slide 14 text

もう⾟くて読めない… でも実在します. https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/TextView.java#L10190

Slide 15

Slide 15 text

Մಡੑ (ཧղʹ͔͔Δ࣌ؒ) ߦ਺ ʢ஫: Πϝʔδਤʣ

Slide 16

Slide 16 text

Τϯόά͢Δ֬཰ ߦ਺ ʢ஫: Πϝʔδਤʣ

Slide 17

Slide 17 text

ۤ೰͢Δ࣌ؒ ߦ਺ ʢ஫: Πϝʔδਤʣ

Slide 18

Slide 18 text

ΞχϝΛݟΔ࣌ؒ ߦ਺ ʢ஫: Πϝʔδਤʣ

Slide 19

Slide 19 text

⻑いコードを メンテナンスしたくな い!!

Slide 20

Slide 20 text

というわけで

Slide 21

Slide 21 text

100 lines or die.

Slide 22

Slide 22 text

95%のソースコードを 100⾏未満にする!

Slide 23

Slide 23 text

というミッションで アプリを書いてみまし た。

Slide 24

Slide 24 text

プロジェクト概要

Slide 25

Slide 25 text

⾔語: ΞʔΩςΫνϟ: 3૚ΞʔΩςΫνϟϕʔε σʔλόΠϯσΟϯά: RxJava ϥΠϒϥϦ: kotterknife, retrofit, okhttp, …

Slide 26

Slide 26 text

結果

Slide 27

Slide 27 text

97% (ϥΠϒϥϦͳͲαϒϓϩδΣΫτͱςετআ͘) 100ߦະຬ 529 files / ߹ܭ: 545 files

Slide 28

Slide 28 text

31# 133# 108# 88# 65# 39# 26# 18# 14# 7# 5# 4# 4# 1# 0# 0# 0# 1# 0# 0# 0# 0# 0# 0# 0# 0# 1# 0# 20# 40# 60# 80# 100# 120# 140# 0# 10# 20# 30# 40# 50# 60# 70# 80# 90# 100# 110# 120# 130# 140# 150# 160# 170# 180# 190# 200# 210# 220# 230# 240# 250# 260# (16 files / 545 files) 2.9%

Slide 29

Slide 29 text

MainActivity΋ɺࠓͷͱ͜Ζ99ߦ

Slide 30

Slide 30 text

ผϓϩδΣΫτͷΞϓϦ(Java)ͱൺֱ

Slide 31

Slide 31 text

0" 5" 10" 15" 20" 25" 0" 30" 60" 90"120"150"180"210"240"270"300"330"360"390"420"450"480"510"540"570"600"630"660"690"720"750"780"810"840"870"900"930"960"990" (39 files / 131 files) 29.7%

Slide 32

Slide 32 text

※౰ࣾൺ 10ഒͷՄಡੑ޲্Λ࣮ݱʂ (͖ͯͱ͏Ͱ͢)

Slide 33

Slide 33 text

Swift൛ͷΞϓϦͱൺֱ (΄΅ࣅͨΑ͏ͳΞʔΩςΫνϟͰͭͬͨ͘)

Slide 34

Slide 34 text

1" 49" 44" 33" 23" 20"20" 17"17" 11" 8" 8" 10" 2" 3" 4" 3" 4" 5" 5" 0" 2" 0" 1" 0" 2" 0" 1" 1" 2" 1" 0" 0" 1" 0" 1" 1" 0" 0" 0" 0" 0" 0" 0" 1" 0" 0" 0" 0" 0" 0" 0" 1" 0" 10" 20" 30" 40" 50" 60" 0" 20" 40" 60" 80" 100" 120" 140" 160" 180" 200" 220" 240" 260" 280" 300" 320" 340" 360" 380" 400" 420" 440" 460" 480" 500" 520" (67 files / 307 files) 21.8%

Slide 35

Slide 35 text

Kotlin͍͢͝ʂ (࣮ࡍʹ͸ViewControllerͷ௕͕͞ओͳࠩ)

Slide 36

Slide 36 text

短く書く⼯夫 (࣌ؒ͋Ε͹)

Slide 37

Slide 37 text

ϓϩδΣΫτͷίʔυશମΛ ͖ͬ͢Γग़དྷͨཁҼΛ͍͔ͭ͘

Slide 38

Slide 38 text

3層アーキテクチャ ベース

Slide 39

Slide 39 text

http://www.slideshare.net/mokemokechicken/iosandroidmodel ࢀߟ: iOS/AndroidΞϓϦΤϯδχΞ͕ཧղ͢΂͖ʮModelʯͷৼΔ෣͍

Slide 40

Slide 40 text

"DUJWJUZ $VTUPN 7JFX 'SBHNFOU 7JFX .PEFM .PEFM 4FSWJDF Presentation Layer Business Layer 20͘Β͍ 100͘Β͍ 100͘Β͍ 100͘Β͍ 10͘Β͍

Slide 41

Slide 41 text

ΘΓͱ໾ׂ෼͚Ͱ͖͍ͯΔͷͰɺ ංେԽ͢ΔϘτϧωοΫfile΋গͳ͍

Slide 42

Slide 42 text

CustomViewの活⽤

Slide 43

Slide 43 text

Activity, Fragment, CustomView ͷ࢖͍෼͚ - ϚονϣͳActivityʹ͞ΑͳΒ͢Δํ๏ - http://www.slideshare.net/yanzm/droid-kaigi2015-yanzm

Slide 44

Slide 44 text

Activity << Fragment << CustomView ϑΝΠϧ਺͸

Slide 45

Slide 45 text

খ͞ͳύʔπ(CustomView)Λ ୔ࢁͭ͘Γ࢖͍ճ͢ํ਑

Slide 46

Slide 46 text


 
 
 
 
 CustomViewͰxmlΛ૊Ή (ύʔπ͸খ͘͞খ෼͚)

Slide 47

Slide 47 text

class CustomView : FrameLayout {
 val textView: TextView by bindView(R.id.text)
 
 constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {}
 constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) {}
 
 override fun onFinishInflate() {
 super.onFinishInflate()
 if (this.isInEditMode) { return }
 
 // model͔Βσʔλऔಘ
 val data = Observable.just("text")
 
 // observableͷ಺༰͕TextViewʹ൓ө͞ΕΔ
 TextViewModel(this.textView, data).subscribe()
 }
 } CustomView಺ͰσʔλόΠϯυ

Slide 48

Slide 48 text

⼩さな ViewModel構想

Slide 49

Slide 49 text

No content

Slide 50

Slide 50 text

ImageViewModel TextViewModel AudioButtonViewModel NextPageViewModel

Slide 51

Slide 51 text

ViewModelͰ͍Ζ͍Ζ΍Γա͗ͳ͍ 1ͭͷViewModelͰ1ͭͷ͜ͱΛ΍Δ

Slide 52

Slide 52 text

Extensionの活⽤

Slide 53

Slide 53 text

// File: ScoreEntity.kt
 data class ScoreEntity(
 val param1: Int,
 val param2: Int
 ) αʔόʔͱ௨৴͢Δࡍͷ Entity৘ใ͸ࣗಈੜ੒͞ΕΔ

Slide 54

Slide 54 text


 // File: ScoreEntityExtension.kt
 val ScoreEntity.score: Int
 get() = param1 * param2 Entityʹ෇ਵ͢Δͪΐͬͱͨ͠ϩδοΫ͸ Extensionͱͯ͠ผϑΝΠϧʹॻ͘

Slide 55

Slide 55 text

ͪΐͬͱͨ͠ϩδοΫ͕ γϣʔτΧοτͰ͖͖ͯͬ͢Γʂ

Slide 56

Slide 56 text

まとめ

Slide 57

Slide 57 text

まとめ KotlinͰίʔυΛ΋ͬͱ୹͘ ϝϯς͠΍͘͢͠Α͏ʂ

Slide 58

Slide 58 text

Thank you!