Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
KotlinでAPIを型安全にした話
Search
noripi
December 19, 2017
Technology
0
1.8k
KotlinでAPIを型安全にした話
2017.12.19 R.kt#2の発表で使用したスライドです。
noripi
December 19, 2017
Tweet
Share
More Decks by noripi
See All by noripi
Kotlinで型安全なSQLを書こう
noripi
0
910
バックエンドが異なるサービスの差分を APIで吸収してみた話
noripi
1
1.8k
サーバサイドKotlinのすすめ
noripi
0
12k
サーバーサイドKotlinのすすめ(仮)
noripi
0
790
Other Decks in Technology
See All in Technology
知っていると得する!Movable Type 9 の新機能を徹底解説
masakah
0
200
「え?!それ今ではHTMLだけでできるの!?」驚きの進化を遂げたモダンHTML
riyaamemiya
10
4.4k
手動から自動へ、そしてその先へ
moritamasami
0
160
セキュリティAIエージェントの現在と未来 / PSS #2 Takumi Session
flatt_security
3
1.4k
Design System Documentation Tooling 2025
takanorip
1
920
シンプルを極める。アンチパターンなDB設計の本質
facilo_inc
1
1k
GitLab Duo Agent Platformで実現する“AI駆動・継続的サービス開発”と最新情報のアップデート
jeffi7
0
130
命名から始めるSpec Driven
kuruwic
3
830
Uncertainty in the LLM era - Science, more than scale
gaelvaroquaux
0
390
Oracle Database@Google Cloud:サービス概要のご紹介
oracle4engineer
PRO
0
640
“決まらない”NSM設計への処方箋 〜ビットキーにおける現実的な指標デザイン事例〜 / A Prescription for "Stuck" NSM Design: Bitkey’s Practical Case Study
bitkey
PRO
1
330
著者と読み解くAIエージェント現場導入の勘所 Lancers TechBook#2
smiyawaki0820
7
2.8k
Featured
See All Featured
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.6k
Mobile First: as difficult as doing things right
swwweet
225
10k
The World Runs on Bad Software
bkeepers
PRO
72
12k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.2k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
359
30k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.8k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Learning to Love Humans: Emotional Interface Design
aarron
274
41k
Building Flexible Design Systems
yeseniaperezcruz
329
39k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
15k
How GitHub (no longer) Works
holman
316
140k
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 ɾଞʹ͍Ζ͍Ζ