Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
KotlinでAPIを型安全にした話
Search
noripi
December 19, 2017
Technology
1.8k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
KotlinでAPIを型安全にした話
2017.12.19 R.kt#2の発表で使用したスライドです。
noripi
December 19, 2017
More Decks by noripi
See All by noripi
Kotlinで型安全なSQLを書こう
noripi
0
940
バックエンドが異なるサービスの差分を APIで吸収してみた話
noripi
1
1.8k
サーバサイドKotlinのすすめ
noripi
0
12k
サーバーサイドKotlinのすすめ(仮)
noripi
0
800
Other Decks in Technology
See All in Technology
AI時代、データエンジニアが一番おもろい
genshun9
0
500
Deployment の 先にある AI Agent 基盤 - kagent vNext、Agent Substrate、Hermes から読み解く Agent Runtime の現在地 / k8s-matsuri-2-ai-agent-platform-amsy810
masayaaoyama
3
460
技術的負債から考える、AI時代のエンジニアリング投資 — ビズリーチの技術的負債と向き合った経験から、変更し続けられるソフトウェアを考える/ technical-debt-con2026
visional_engineering_and_design
1
770
AIに丸投げしないトイル削減 / Eliminating Toil Without Leaving It All to AI
kohbis
4
1.1k
DEFCON34-Write-up_HYCu-MYCu
daikiokazaki
0
160
AIで仕事のやり方を変える
matsu7874
3
1.1k
作品が生態系になった ─ Mini Tokyo 3D から世界へ
nagix
0
180
20260912_スクフェス三河
kgnkhkr
0
350
DEFCON_CHV_CTF_Write-up.pdf
bata_24
0
150
synctest時代のhttptest Go 1.27で変わるHTTPサーバテストの裏側 / go conference2026 synctest and httptest
budougumi0617
1
2.8k
銀行勘定系システムにおける開発プロセス刷新×AIによる環境モダナイゼーション / Development Process Transformation and AI-Driven Environment Modernization
muit
0
1.5k
データ界隈LT祭 第1回LT登壇
taromatsui_cccmkhd
1
1.2k
Featured
See All Featured
The browser strikes back
jonoalderson
0
1.7k
New Earth Scene 8
popppiees
3
2.6k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
310
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
4.8k
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
280
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.3k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
We Have a Design System, Now What?
morganepeng
55
8.3k
[SF Ruby Conf 2025] Rails X
palkan
2
1.4k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
300
Transcript
,PUMJOͰ"1*Λܕ҆શʹͨ͠ 3LU /PSJZVLJ*TIJEB
͍͋ͭࣗ͝͞ݾհ ɾ໊લ/PSJZVLJ*TIJEB ɾαʔόαΠυʢ,PUMJO+BWB1)11ZUIPO ɾΤϯδχΞ!3FUUZ ɾJ04 4XJGU0CKFDUJWF$ ɾ"84ͦͦ͜͜৮Δ ɾ,PUMJOྺϲ݄͘Β͍
ɾ,PUMJO͔Θ͍͍ ɾ࠷ۙ,PUMJO͗ͯ͢͠+BWBΛΕ͖ͯͨ ɾ,PUMJO/BUJWFʹظ͍ͯ͠Δ IUUQTRJJUBDPNOPSJQJJUFNTFFDCEBDBGCE
ຊͷ͓ ɾ,PUMJOΛಋೖͨ͠ܦҢ ɾ,PUMJOʹͯ͠Έͯײͨ͜͡ͱ
ࠃ/P໊࣮άϧϝαʔϏε3FUUZͷӡӦ ઃཱ XFCͱΞϓϦͰαʔϏεల։ γϯάϧυϝΠϯ εϚϗϑΝʔετ ݄ؒར༻ऀສ
3FUUZ ɾ8FC ɾΞϓϦ
ฐࣾʹ͓͚Δ,PUMJO ɾΞϓϦ༻"1*ʹ,PUMJOΛ͍ͬͯ·͢ ϒϥβ ΞϓϦ 8FCΞϓϦέʔγϣϯαʔό "1*αʔό %#
,PUMJOΛಋೖͨ͠ܦҢ
1)1Ͱ࡞ΒΕ͍ͯͨ"1* ɾ8FCΞϓϦέʔγϣϯʹ"1*Λੜ͍ͯͨ͠ ϒϥβ ΞϓϦ 8FCΞϓϦέʔγϣϯαʔό "1*αʔό %# ɾࣾʹ1)1Λॻ͚Δਓ͕ଟ͘։ൃεϐʔυ͍
1)1Ͱ࡞ΒΕ͍ͯͨ"1* ɾ࣌ͷ"1*ͷಛ ɾฦΓ΄΅+40/ܗ͕ࣜͩҧ͏͜ͱ͋Δ ɾ+40/ͷLFZʹೖΔͷܕ͕Ұҙʹఆ·Βͳ͍ ɾͲͷLFZʹͲΜͳ͕ೖͬͯ͘Δ͔ɺιʔείʔυΛݟͳ͍ͱ͔Βͳ͍ ɾ͍ͭͰͲ͜Ͱ0, ΞϓϦ 8FCΞϓϦέʔγϣϯαʔό
˓˓ͷҰཡ͍ͩ͘͞ʂʢ͖ͬͱ"SSBZʣ GBMTF ɾฦΓͷόϦσʔγϣϯʢͦΕ͕ࣦഊ͔Ͳ͏ؚ͔ΊʣΫϥΠΞϯτଆͷ
1)1͔Β+BWB ɾ8FCΞϓϦέʔγϣϯͱͯ͠+BWB ɾαʔόαΠυݴޠͱ࣮͕ͯ͋͠Γɺ'8๛ ɾΞϊςʔγϣϯͰ"1*ΛγϯϓϧʹఆٛͰ͖Δ+"934ͱ͍͏༷͕͋Δ ΞϓϦ "1*αʔό ˓˓ͷҰཡ͍ͩ͘͞ʂʢ͖ͬͱ"SSBZʣ <\^ \^>
ɾฦΓͷܕΛ10+0 ී௨ͷ+BWBΦϒδΣΫτ Ͱࣄલʹఆٛ ˠܕ҆શͳ"1*ͰΞϓϦΤϯδχΞʹฏͳੈքΛ ɾࣦഊͨ͠ΒYYYYΛฦ͢
ɾ+BWBͩͬͨͷͰ݁ߏϞμϯͳॻ͖ํ͕Ͱ͖͍ͯͨ +BWB͔Β,PUMJOͷҠߦ ɾ࣮Ҡߦ͢ΔͭΓͳ͔ͬͨ ɾ1)1ͷࠒͱൺͯ"1*͕֨ஈʹྑ͘ͳͬͯɺຬ͍ͯͨ͠
+BWB͔Β,PUMJOͷҠߦ ɾҠߦͨ͠ཧ༝ ɾ͋Δಥવ͜Μͳͷ͕ ˠ͓ΉΖʹ,PUMJO͕ಋೖ͞Εͨ
"1*ͷݱࡏ ΏΔ͔ʹ,PUMJOԽΛਐߦத
,PUMJOʹͯ͠Έͯײͨ͜͡ͱ
ɾ͢ΜͳΓಋೖͰ͖Δ ɾطʹ+BWBͷϓϩμΫτ͕͋Δ߹ɺͦ͜ʹ,PUMJOΛೖΕΔͷͱͯ؆୯ ɾ+BWBͩͱಈ͍ͨͷʹॻ͖͑ͨΒಈ͔ͳ͘ͳͬͨɺͱ͍͏͜ͱ·ͣͳ͍ ,PUMJOʹͯ͠Έͯ ɾ͋Δ6UJMJUZ͚ͩॻ͖͑ͱ͍͏͜ͱ؆୯ ɾ,PUMJO͔Θ͍͍ ɾ/6--ڐ༰ܕܕਪϥϜμͳͲϞμϯͳݴޠͷػೳΛҰ௨Γඋ͑Δ ɾ+BWB͔ΒͪΌΜͱίʔϧͰ͖ΔͷͰ+BWB͔͠ॻ͔ͳ͍ਓ͕͍ͯ҆৺ ɾൺֱతετϨεগͳ͘ॻ͚Δݴޠͷͭ
ɾ͑͏΄ͲΑΓྑ͍ॻ͖ํ͕ݟ͔ͭͬͯ͘Δ
Ҡߦͯ͠ؾ͍ͮͨ,PUMJOͷϝϦοτ ɾ/VMMBCJMJUZΛίϯύΠϥϨϕϧͰఆٛͰ͖Δ ɾͦͦ1)1͔ΒҠߦͨ͠తɺฦΓͷܕΛݫີʹఆٛ͢Δ͜ͱ ɾ+BWB࣌ʹ!/VMMBCMFΞϊςʔγϣϯͰදݱ͍͕ͯͨ͠ɺίϯύΠϥ ɹνΣοΫ͕ͳ͍ͨΊ࣮ଶͱҟͳ͍ͬͯͨ ɾΫϥΠΞϯτଆ͕0QUJPOBMͷػߏΛ࣋ͭݴޠͰॻ͔ΕΔ͜ͱ͕૿͖͍͑ͯͯΔ ˠ/6--ڐ༰͔Ͳ͏͔Λهड़͢Δ͜ͱɺܕΛهड़͢Δ ɹ͜ͱͱಉ͘͡Β͍ॏཁ
Ҡߦͯ͠ؾ͍ͮͨ,PUMJOͷϝϦοτ ɾσʔλϗϧμΫϥεͷఆٛ ɾฦΓͷܕΛ10+0 ී௨ͷ+BWBΦϒδΣΫτ Ͱࣄલʹఆٛ͢Δඞཁ͕͋Δ ɾ+BWBͩͱఆٛ͢Δͷ͕ͪΐͬͱΊΜͲ͍͘͞ public class
GetRestaurantResponse { private long restaurantId; private String restaurantName; public long getRestaurantId() { return this.restaurantId; } public String getRestaurantName() { return this.restaurantName; } }
Ҡߦͯ͠ؾ͍ͮͨ,PUMJOͷϝϦοτ ɾσʔλϗϧμΫϥεͷఆٛ ɾ,PUMJOͷ߹ɺEBUBDMBTTΛ͑γϯϓϧʹهड़Ͱ͖Δ data class GetRestaurantResponse( val restaurantId:
Long, val restaurantName: String )
Ҡߦͯ͠ؾ͍ͮͨ,PUMJOͷϝϦοτ ɾ$MBTT%FMFHBUJPO ɾجຊతͳܕΛΈ߹ΘͤͯฦΓΛ࡞Γ͍ͨέʔεׂͱΑ͋͘Δ ɾ+BWBͩͱఆٛ͢Δͷ͕͍ͩͿΊΜͲ͍͘͞ public class GetReviewResponse implements
IReview, IRestaurant, IUser { private IReview review; private IRestaurant restaurant; private IUser user; public long getReviewId() { return this.review.getReviewId(); } public String getUserName() { return this.user.getUserName(); } public String getRestaurantName() { return this.restaurant.getRestaurantName(); } ... }
Ҡߦͯ͠ؾ͍ͮͨ,PUMJOͷϝϦοτ ɾ$MBTT%FMFHBUJPO ɾΠϯλϑΣʔεͷ࣮ΛଞͷΫϥεʹҠৡͰ͖Δ ɾQSPQFSUZΛࡉ͔͘JOUFSGBDFԽ͓͚ͯ͠ɺฦΓΫϥεΛࡉ͔͘ఆٛՄೳʹ data class GetReviewResponse( private
val review: IReview, private val restaurant: IRestaurant, private val user: IUser ) : IReview by review, IRestaurant by restaurant, IUser by user { // ෳͷinterfaceͰఆ͕͔ٛͿͬͯΔͱ͖͚ͩ໌ࣔతʹࢦఆ override val userId: Int = this.user.userId }
·ͱΊ ɾ,PUMJO͢ΜͳΓಋೖͰ͖Δʂ ɾฐࣾͰɺ͋Δ͓ΉΖʹ,PUMJO͕Ճ͞Ε͔ͯͦ͜ΒঃʑʹҠߦ͍ͯ͠·͢ ɾ,PUMJOͷ͍͍ͱ͜Ζ ɾطʹ+BWBͷϓϩμΫτ͕͋Δ߹ɺͦ͜ʹ,PUMJOΛೖΕΔͷͱͯ؆୯ ɾ/VMMڐ༰ܕͰ֎෦ΠϯλϑΣʔεΛΑΓݫີʹఆٛͰ͖Δ ɾEBUBDMBTTΛͬͯσʔλϗϧμΛγϯϓϧʹఆٛͰ͖Δ ɾ$MBTT%FMFHBUJPO ɾଞʹ͍Ζ͍Ζ