Upgrade to Pro — share decks privately, control downloads, hide ads and more …

100 lines or die

85d7f0ae00c0cf1092dffcec966e3ae9?s=47 mattak
January 15, 2016

100 lines or die

KotlinAndroid勉強会 LT

85d7f0ae00c0cf1092dffcec966e3ae9?s=128

mattak

January 15, 2016
Tweet

Transcript

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

  2. とつぜんですが、

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

  4. None
  5. ͍ͭͷ·ʹ͔௕͘ͳ͍ͬͯΔߦ਺ɻɻɻ

  6. つらい…!!

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

  8. 1໨ͰΘ͔Δʂ

  9. 100⾏のコードなら?

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

  11. 1000⾏のコードなら?

  12. ਺෼ͳ͍ͱ ಡΊͳ͍ʂ

  13. 1万⾏のコードなら?

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

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

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

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

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

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

  20. というわけで

  21. 100 lines or die.

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

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

  24. プロジェクト概要

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

  26. 結果

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

  28. 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%
  29. MainActivity΋ɺࠓͷͱ͜Ζ99ߦ

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

  31. 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%
  32. ※౰ࣾൺ 10ഒͷՄಡੑ޲্Λ࣮ݱʂ (͖ͯͱ͏Ͱ͢)

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

  34. 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%
  35. Kotlin͍͢͝ʂ (࣮ࡍʹ͸ViewControllerͷ௕͕͞ओͳࠩ)

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

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

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

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

  40. "DUJWJUZ $VTUPN 7JFX 'SBHNFOU 7JFX .PEFM .PEFM 4FSWJDF Presentation Layer

    Business Layer 20͘Β͍ 100͘Β͍ 100͘Β͍ 100͘Β͍ 10͘Β͍
  41. ΘΓͱ໾ׂ෼͚Ͱ͖͍ͯΔͷͰɺ ංେԽ͢ΔϘτϧωοΫfile΋গͳ͍

  42. CustomViewの活⽤

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

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

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

  46. <?xml version="1.0" encoding="utf-8"?>
 <me.mattak.sampleapp.CustomView xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical">
 
 <TextView


    android:id="@+id/text"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content" />
 
 </me.mattak.sampleapp.CustomView> CustomViewͰxmlΛ૊Ή (ύʔπ͸খ͘͞খ෼͚)
  47. 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<String>ͷ಺༰͕TextViewʹ൓ө͞ΕΔ
 TextViewModel(this.textView, data).subscribe()
 }
 } CustomView಺ͰσʔλόΠϯυ
  48. ⼩さな ViewModel構想

  49. None
  50. ImageViewModel TextViewModel AudioButtonViewModel NextPageViewModel

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

  52. Extensionの活⽤

  53. // File: ScoreEntity.kt
 data class ScoreEntity(
 val param1: Int,
 val

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

    * param2 Entityʹ෇ਵ͢Δͪΐͬͱͨ͠ϩδοΫ͸ Extensionͱͯ͠ผϑΝΠϧʹॻ͘
  55. ͪΐͬͱͨ͠ϩδοΫ͕ γϣʔτΧοτͰ͖͖ͯͬ͢Γʂ

  56. まとめ

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

  58. Thank you!