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
DIライブラリ Airframeを使ってみた
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
takeosuzuki
April 25, 2019
Programming
1.7k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
DIライブラリ Airframeを使ってみた
takeosuzuki
April 25, 2019
Other Decks in Programming
See All in Programming
SLOをサービス品質の共通言語にするために 取り組んできたこと
wakana0222
0
540
霧の中の代数的エフェクト
funnyycat
1
420
php-fpmのプロセスが枯渇した日-調査・対処・そして本当にやるべきだったこと-
shibuchaaaan
0
120
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
1.3k
改善しないと、タスクが回らない。 “てんこ盛りポジション” を引き継いだ情シスの、入社3ヶ月の業務改善録
krm963
0
100
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
390
えっ!!コードを読まずに開発を!?
hananouchi
0
230
Lean は証明の正しさを確認するためだけのツールって思ってませんか?
inoueasei
1
110
1年で人数1.5倍、PR数5.5倍増。 品質とアウトカムはどうなったか、 何が効いたか
ike002jp
0
140
PHP Application における Kubernetes 内 gRPC 通信
ganchiku
0
530
吝嗇家のためのAI活用 / AI development for miser - ChatGPT + Issue Driven Development
tooppoo
0
190
継続モナドとリアクティブプログラミング
yukikurage
3
630
Featured
See All Featured
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.5k
ラッコキーワード サービス紹介資料
rakko
1
4M
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
320
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
740
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
470
Test your architecture with Archunit
thirion
1
2.3k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
190
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.5k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
260
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
590
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
620
Transcript
by TakeoSuzuki
自己紹介 Scala歴4ヶ月 3月からChatworkでアルバイト
@taroleoさんが開発していたライブラリ Scalaアプリケーション開発に便利 その中の一つがDIライブラリ
複数の実装があるとき
trait DataBase { def write(text: String): Unit } class RealDB()
extends DataBase { override def write(text: String): Unit = println(s"$text を本番用DBに書き込みました!") } class TestDB() extends DataBase { override def write(text: String): Unit = println(s"テスト環境のため $text は書き込みしてません!") } trait MyApp { val db = bind[DataBase] } val d = newDesign .bind[DataBase].to[RealDB] d.build[MyApp] { app => app.db.write("お試し") // お試し を本番用DBに書き込みました! // TestDB =>テスト環境のため お試し は書き込みしてません! }
RealDB、TestDBを変えるだけで 実装を切り替えることができる
同一のBindが複数ある時
trait MyApp { val firstName = bind[String] val lastName =
bind[String] } val d = newDesign .bind[String].toInstance("Takeo") .bind[String].toInstance("Suzuki") d.build[MyApp] { app => println(app.firstName) //Takeo println(app.lastName) //Suzuki } d.build[MyApp] { app => println(app.firstName) //Suzuki println(app.lastName) // Suzuki } 予想 結果
• 後が優先される • その型のフィールド全てに適用
MyAppに未定義のメソッドがある時
trait MyApp { val firstName = bind[String] val lastName =
bind[String] def f(x: Int): Int } class MyAppImpl extends MyApp { override def f(x: Int): Int = x + 1 } val d = newDesign .bind[String].toInstance("Takeo") .bind[MyApp].to[MyAppImpl] d.build[MyApp] { app => println(app.firstName) // Takeo println(app.lastName) // Takeo println(app.f(10)) //11 } これでいいのか・・・
val db: DataBase = new RealDB() val d = newDesign.bind[DataBase].to[RealDB]
None