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
300
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
530
Kotlin 最新動向2022 #tfcon #techfeed
ntaro
1
2.2k
#Ubie 狂気の認知施策と選考設計
ntaro
13
13k
UbieにおけるサーバサイドKotlin活用事例
ntaro
1
1.1k
KotlinでSpring 完全理解ガイド #jsug
ntaro
6
3.4k
Kotlinでサーバサイドを始めよう!
ntaro
1
950
Androidからサーバーサイドまで!プログラミング言語 Kotlinの魅力 #devboost
ntaro
5
2.6k
Kotlin Contracts #m3kt
ntaro
4
3.9k
How_to_Test_Server-side_Kotlin.pdf
ntaro
1
470
Other Decks in Programming
See All in Programming
第3回関東Kaggler会_AtCoderはKaggleの役に立つ
chettub
3
1.1k
XStateを用いた堅牢なReact Components設計~複雑なClient Stateをシンプルに~ @React Tokyo ミートアップ #2
kfurusho
1
950
Rubyで始める関数型ドメインモデリング
shogo_tksk
0
130
技術を改善し続ける
gumioji
0
100
sappoRo.R #12 初心者セッション
kosugitti
0
270
責務と認知負荷を整える! 抽象レベルを意識した関心の分離
yahiru
8
1.3k
もう僕は OpenAPI を書きたくない
sgash708
5
1.9k
Jakarta EE meets AI
ivargrimstad
0
180
CI改善もDatadogとともに
taumu
0
180
ナレッジイネイブリングにAIを活用してみる ゆるSRE勉強会 #9
nealle
0
120
ソフトウェアエンジニアの成長
masuda220
PRO
12
2k
CloudNativePGを布教したい
nnaka2992
0
100
Featured
See All Featured
Designing for humans not robots
tammielis
250
25k
Designing on Purpose - Digital PM Summit 2013
jponch
117
7.1k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
Testing 201, or: Great Expectations
jmmastey
42
7.2k
Practical Orchestrator
shlominoach
186
10k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
40
2k
Designing for Performance
lara
604
68k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
49
2.3k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
21
2.5k
Done Done
chrislema
182
16k
Thoughts on Productivity
jonyablonski
69
4.5k
Agile that works and the tools we love
rasmusluckow
328
21k
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という提案 •
変なことしないで素直なコードを心がけましょう