Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
AndroidでKotlinフル活用プログラミング #Kotlin_Sansan
Search
Taro Nagasawa
January 15, 2016
Programming
1
2.8k
AndroidでKotlinフル活用プログラミング #Kotlin_Sansan
AndroidでKotlin勉強会 @ Sansan で発表したスライドです。
http://connpass.com/event/22189/
Taro Nagasawa
January 15, 2016
Tweet
Share
More Decks by Taro Nagasawa
See All by Taro Nagasawa
Android開発者のための Kotlin Multiplatform入門
ntaro
0
820
Kotlin 最新動向2022 #tfcon #techfeed
ntaro
1
2.3k
#Ubie 狂気の認知施策と選考設計
ntaro
13
13k
UbieにおけるサーバサイドKotlin活用事例
ntaro
1
1.1k
KotlinでSpring 完全理解ガイド #jsug
ntaro
6
3.5k
Kotlinでサーバサイドを始めよう!
ntaro
1
1k
Androidからサーバーサイドまで!プログラミング言語 Kotlinの魅力 #devboost
ntaro
5
2.8k
Kotlin Contracts #m3kt
ntaro
4
4.2k
How_to_Test_Server-side_Kotlin.pdf
ntaro
1
520
Other Decks in Programming
See All in Programming
Researchlyの開発で参考にしたデザイン
adsholoko
0
100
組込みだけじゃない!TinyGo で始める無料クラウド開発入門
otakakot
2
380
なんでRustの環境構築してないのにRust製のツールが動くの? / Why Do Rust-Based Tools Run Without a Rust Environment?
ssssota
14
47k
モテるデスク環境
mozumasu
3
1.4k
Introduce Hono CLI
yusukebe
6
3.2k
開発組織の戦略的な役割と 設計スキル向上の効果
masuda220
PRO
10
1.9k
alien-signals と自作 OSS で実現する フレームワーク非依存な ロジック共通化の探求 / Exploring Framework-Agnostic Logic Sharing with alien-signals and Custom OSS
aoseyuu
2
810
퇴근 후 1억이 거래되는 서비스 만들기 | 내가 AI를 사용하는 방법
maryang
1
110
Temporal Knowledge Graphで作る! 時間変化するナレッジを扱うAI Agentの世界
po3rin
5
1k
TransformerからMCPまで(現代AIを理解するための羅針盤)
mickey_kubo
7
5.7k
CSC305 Lecture 12
javiergs
PRO
0
240
GC25 Recap: The Code You Reviewed is Not the Code You Built / #newt_gophercon_tour
mazrean
0
130
Featured
See All Featured
Learning to Love Humans: Emotional Interface Design
aarron
274
41k
Rebuilding a faster, lazier Slack
samanthasiow
84
9.2k
Producing Creativity
orderedlist
PRO
348
40k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
KATA
mclloyd
PRO
32
15k
Optimizing for Happiness
mojombo
379
70k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
640
Designing Experiences People Love
moore
142
24k
How STYLIGHT went responsive
nonsquared
100
5.9k
Making the Leap to Tech Lead
cromwellryan
135
9.6k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
34
2.3k
Transcript
AndroidでKotlin フル活用プログラミング 2016-01-15 AndroidでKotlin勉強会 @ Sansan 長澤 太郎 @ngsw_taro
自己紹介 • 長澤 太郎 @ngsw_taro • 仕事ではAndroidメイン、Java, Scala, Railsなど •
Kotlinエバンジェリスト(自称) ◦ 講演や執筆などの実績多数 • 27歳、蟹座、ビール大好き
私のブログ
アプリカティブなんとかみたいなやつ val minus = { a: Int -> { b:
Int -> a - b } } fun <T, R> T.bind(f: ((T)->R)?): R? = f?.invoke(this) y?.bind(x?.bind(minus)) fun <T, R> ((T)->R).apply(n: T?): R? = n?.bind(this) val sub: Int? = minus.apply(x)?.apply(y) http://taro.hatenablog.jp/entry/2014/04/06/144811
メソッド参照みたいなやつ val <A, B> (A.()->B).tof: (A)->B get() = { a:
A -> a.this() } listOf("a", "bb", "ccc").map(String::length.tof) http://taro.hatenablog.jp/entry/2015/02/24/215413
Extensionで なんでもするマン
AndroidでKotlin Extensionプログラミング 2016-01-15 AndroidでKotlin勉強会 @ Sansan 長澤 太郎 @ngsw_taro
RxLifecycle面倒
RxLifecycleを使う // in RxAppCompatActivity apiAccesss() .compose(bindToLifecycle<MyData>()) .subscribe { ... }
省略できないっぽい
こうしたい: 拡張関数使えばできそう // in RxAppCompatActivity apiAccesss() .bindToLifecycle() .subscribe { ...
}
こういうの作る // in RxAppCompatActivity fun <T> Observable<T>.bindToLifecycle() = compose<T>(self.bindToLifecycle()) いい感じ!
共通部品化したい
こういう提案 interface RxLifecycleFeature: ActivityLifecycleProvider { fun <T> Observable<T>.bindToLifecycle() = compose<T>(
[email protected]
())
}
使用側のアクティビティ class MyActivity: RxAppCompatActivity(), RxLifecycleFeature { fun go() { apiAccess()
.bindToLifecycle() .subscribe {...} } }
明示的Activity起動の問題
よくあるやつ: 遷移先 class TargetActivity: Activity() { companion object { fun
intent(c: Context, data: String) = Intent(c, TargetActivity::class.java) .putExtra(“data”, data) } }
よくあるやつ: 遷移元 class SourceActivity: Activity() { fun go() { val
data = “hogefuga” startActivity(TargetActivity.intent(this, data)) } }
よくあるやつ: 遷移元 class SourceActivity: Activity() { fun go() { val
data = “hogefuga” startActivity(TargetActivity.intent(this, data)) } } thisを書きたくない! 簡単には拡張関数に できなさそう...
Intent生成を遅らせる: 遷移先 class TargetActivity: Activity() { companion object { fun
intent(data: String) = { c: Context -> Intent(c, TargetActivity::class.java) .putExtra(“data”, data) } } }
Intent生成を遅らせる: 遷移先 class TargetActivity: Activity() { companion object { fun
intent(data: String) = { c: Context -> Intent(c, TargetActivity::class.java) .putExtra(“data”, data) } } } Contextを取らなくなった
Intent生成を遅らせる: 遷移先 class TargetActivity: Activity() { companion object { fun
intent(data: String) = { c: Context -> Intent(c, TargetActivity::class.java) .putExtra(“data”, data) } } } Context -> Intentな 関数を返す
イマイチな使用例: 遷移元 class SourceActivity: Activity() { fun go() { val
data = “hogefuga” startActivity(TargetActivity.intent(data)(this)) } }
よさげな使用例: 遷移元 class SourceActivity: Activity() { fun go() { val
data = “hogefuga” TargetActivity.intent(data).start() } fun ((Context)->Intent).start() { startActivity(this(applicationContext)) } }
よさげな使用例: 遷移元 class SourceActivity: Activity() { fun go() { val
data = “hogefuga” TargetActivity.intent(data).start() } fun ((Context)->Intent).start() { startActivity(this(applicationContext)) } } ここからthisが消えた
共通部品化する for 遷移先 inline fun <reified T : Activity> intentBuilder(crossinline
init: Intent.() -> Unit) = { context: Context -> Intent(context, T::class.java).apply { init() } }
共通部品を使う: 遷移先 class TargetActivity: Activity() { companion object { fun
intent(data: String) = intentBuilder<TargetActivity> { putExtra(“data”, data) } } }
共通部品化する for 遷移元 interface IntentFeature { fun startActivity(intent: Intent) fun
getApplicationContext() fun ((Context)->Intent).start() { startActivity(this(getApplicationContext())) } } インタフェースを継承するので はなく、抽象メソッドを定義して おく
共通部品を使う: 遷移元 class SourceActivity: Activity(), IntentFeature { fun go() {
val data = “hogefuga” TargetActivity.intent(data).start() } }
おまけ: M11以前 trait IntentFeature: Activity { fun ((Context)->Intent).start() { startActivity(this(getApplicationContext()))
} } 実装する側のクラスを 指定できた
Thank you, Enjoy Kotlin!