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
Double Context Extension (Kotlin) #Retty_tech_cafe
Search
Taro Nagasawa
December 09, 2016
Programming
0
320
Double Context Extension (Kotlin) #Retty_tech_cafe
Retty Tech Cafe #8 (
https://retty.connpass.com/event/45628/)で発表した資料です
。
Taro Nagasawa
December 09, 2016
Tweet
Share
More Decks by Taro Nagasawa
See All by Taro Nagasawa
Android開発者のための Kotlin Multiplatform入門
ntaro
0
1.2k
Kotlin 最新動向2022 #tfcon #techfeed
ntaro
1
2.3k
#Ubie 狂気の認知施策と選考設計
ntaro
13
14k
UbieにおけるサーバサイドKotlin活用事例
ntaro
1
1.2k
KotlinでSpring 完全理解ガイド #jsug
ntaro
6
3.6k
Kotlinでサーバサイドを始めよう!
ntaro
1
1k
Androidからサーバーサイドまで!プログラミング言語 Kotlinの魅力 #devboost
ntaro
5
2.9k
Kotlin Contracts #m3kt
ntaro
4
4.3k
How_to_Test_Server-side_Kotlin.pdf
ntaro
1
540
Other Decks in Programming
See All in Programming
Claude Codeと2つの巻き戻し戦略 / Two Rewind Strategies with Claude Code
fruitriin
0
140
Grafana:建立系統全知視角的捷徑
blueswen
0
330
コマンドとリード間の連携に対する脅威分析フレームワーク
pandayumi
1
460
Smart Handoff/Pickup ガイド - Claude Code セッション管理
yukiigarashi
0
140
Basic Architectures
denyspoltorak
0
680
AI時代の認知負荷との向き合い方
optfit
0
160
AI Schema Enrichment for your Oracle AI Database
thatjeffsmith
0
320
今こそ知るべき耐量子計算機暗号(PQC)入門 / PQC: What You Need to Know Now
mackey0225
3
380
Fluid Templating in TYPO3 14
s2b
0
130
CSC307 Lecture 02
javiergs
PRO
1
780
Data-Centric Kaggle
isax1015
2
780
LLM Observabilityによる 対話型音声AIアプリケーションの安定運用
gekko0114
2
430
Featured
See All Featured
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
460
4 Signs Your Business is Dying
shpigford
187
22k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
350
Art, The Web, and Tiny UX
lynnandtonic
304
21k
Become a Pro
speakerdeck
PRO
31
5.8k
Site-Speed That Sticks
csswizardry
13
1.1k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
280
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
196
71k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
2
940
How STYLIGHT went responsive
nonsquared
100
6k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.8k
Transcript
Double Context Extension Retty Tech Cafe #8 2016-12-09 長澤 太郎
自己紹介 • 長澤 太郎 たろーって呼んでね ◦ @ngsw_taro • エンジニア@エムスリー株式会社 ◦
Android, Kotlin, Java, Spring, Railsなど • Kotlinエバンジェリスト • ディズニーが好き
Kotlinいいよね! • 型推論 • ラムダ式 • NULL安全 • Extension •
委譲プロパティ • 分解宣言 • コルーチン • 型エイリアス
Kotlinいいよね! • 型推論 • ラムダ式 • NULL安全 • Extension •
委譲プロパティ • 分解宣言 • コルーチン • 型エイリアス
Extension(拡張) • 拡張関数 • 拡張プロパティ fun String.hello() { println("Hello, $this")
} "world".hello() val String.initial: Char? get()=firstOrNull()?.toUpperCase() "world".initial
拡張関数じゃ物足りない問題
こんな関数呼び出しをしたい! class MyActivity: FragmentActivity { ... fun showMessage() { //
myDialog.show(supportFragmentManager, "tag") myDialog.show("tag") } }
こんな関数呼び出しをしたい! class MyActivity: FragmentActivity { ... fun showMessage() { //
myDialog.show(supportFragmentManager, "tag") myDialog.show("tag") } } DialogFragmentに拡張関数showを生やせば? いや、プロパティsupportFragmentManagerが必要だ... →FragmentManagerに依存
クラスの中に拡張関数を定義してみる class MyActivity: FragmentActivity { ... fun FragmentDialog.show(tag: String?) {
show(supportFragmentManager, tag) } fun showMessage() { myDialog.show("tag") } }
クラスの中に拡張関数を定義してみる class MyActivity: FragmentActivity { ... fun FragmentDialog.show(tag: String?) {
show(supportFragmentManager, tag) } fun showMessage() { myDialog.show("tag") } } イケる!?
再利用ができない問題... class MyActivity: FragmentActivity { ... fun FragmentDialog.show(tag: String?) {
show(supportFragmentManager, tag) } } class YourActivity: FragmentActivity { ... fun FragmentDialog.show(tag: String?) { show(supportFragmentManager, tag) } }
再利用ができない問題... class MyActivity: FragmentActivity { ... fun FragmentDialog.show(tag: String?) {
show(supportFragmentManager, tag) } } class YourActivity: FragmentActivity { ... fun FragmentDialog.show(tag: String?) { show(supportFragmentManager, tag) } } 同じコードが重複する
どうするか?
if (ちょっとした実験とか趣味のコード) { } else { }
if (ちょっとした実験とか趣味のコード) { recommend(DoubleContextExtension) } else { }
if (ちょっとした実験とか趣味のコード) { recommend(DoubleContextExtension) } else { recommend(Extension至上主義を捨てよ) }
Double Context Extension • 2つのコンテキストを持った拡張関数 • 命名 by 私 •
見た目: 型Aの定義中で、型Aに依存しながらも型Bの拡張関 数を生やすことができる class MyActivity: FragmentActivity { ... fun showMessage() { myDialog.show("tag") } }
Double Context Extension • 実際のコード: 「B型の拡張関数」を返す「A型の拡張プロパ ティ」を定義する // どこか適当なファイル val
FragmentActivity.show: DialogFramgnet.(String?)->Unit get() { tag -> show(supportFragmentManager, tag) }
どう解釈されるか val FragmentActivity.show: DialogFramgnet.(String?)->Unit get() { tag -> show(supportFragmentManager, tag)
} class MyActivity: FragmentActivity { fun showMessage() { myDialog.show("tag") } ... }
どう解釈されるか val FragmentActivity.show: DialogFramgnet.(String?)->Unit get() { tag -> show(supportFragmentManager, tag)
} class MyActivity: FragmentActivity { fun showMessage() { myDialog.show("tag") } ... } FragmentActivityの 拡張関数showの呼び出し
どう解釈されるか val FragmentActivity.show: DialogFramgnet.(String?)->Unit get() { tag -> show(supportFragmentManager, tag)
} class MyActivity: FragmentActivity { fun showMessage() { myDialog.(this.show)("tag") } ... } こう書いても同じ
どう解釈されるか val FragmentActivity.show: DialogFramgnet.(String?)->Unit get() { tag -> show(supportFragmentManager, tag)
} class MyActivity: FragmentActivity { fun showMessage() { myDialog.show("tag") } ... } 返って来た拡張関数オブジェクトを myDialogをレシーバに、 ”tag”を引数にして呼び出す
まとめ • 拡張関数って便利だよね • でも限界がある • Double Context Extensionという提案
まとめ • 拡張関数って便利だよね • でも限界がある • Double Context Extensionという提案 •
変なことしないで素直なコードを心がけましょう