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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Taro Nagasawa
December 09, 2016
Programming
320
0
Share
Double Context Extension (Kotlin) #Retty_tech_cafe
Retty Tech Cafe #8 (
https://retty.connpass.com/event/45628/)で発表した資料です
。
Taro Nagasawa
December 09, 2016
More Decks by Taro Nagasawa
See All by Taro Nagasawa
Android開発者のための Kotlin Multiplatform入門
ntaro
0
1.5k
Kotlin 最新動向2022 #tfcon #techfeed
ntaro
1
2.4k
#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
3k
Kotlin Contracts #m3kt
ntaro
4
4.4k
How_to_Test_Server-side_Kotlin.pdf
ntaro
1
560
Other Decks in Programming
See All in Programming
CDK Deployのための ”反響定位”
watany
5
920
セグメントとターゲットを意識するプロポーザルの書き方 〜採択の鍵は、誰に刺すかを見極めるマーケティング戦略にある〜
m3m0r7
PRO
0
720
Road to RubyKaigi: Play Hard(ware)
makicamel
1
520
Kingdom of the Machine
yui_knk
2
1.3k
🦞OpenClaw works with AWS
licux
1
320
GoogleCloudとterraform完全に理解した
terisuke
1
180
2026-04-15 Spring IO - I Can See Clearly Now
jonatan_ivanov
1
160
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて
matsuo_atsushi
0
120
ハーネスエンジニアリングにどう向き合うか 〜ルールファイルを超えて開発プロセスを設計する〜 / How to approach harness engineering
rkaga
26
18k
PHPer、Cloudflare に引っ越す
suguruooki
1
130
t *testing.T は どこからやってくるの?
otakakot
1
880
ソフトウェア設計の結合バランス #phperkaigi
kajitack
0
170
Featured
See All Featured
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
2.9k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
70
39k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.6k
Chasing Engaging Ingredients in Design
codingconduct
0
180
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
The untapped power of vector embeddings
frankvandijk
2
1.7k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.5k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
220
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.8k
Crafting Experiences
bethany
1
130
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
110
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.5k
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という提案 •
変なことしないで素直なコードを心がけましょう