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
KotlinでAPIを型安全にした話
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
920
バックエンドが異なるサービスの差分を APIで吸収してみた話
noripi
1
1.8k
サーバサイドKotlinのすすめ
noripi
0
12k
サーバーサイドKotlinのすすめ(仮)
noripi
0
790
Other Decks in Technology
See All in Technology
こんなところでも(地味に)活躍するImage Modeさんを知ってるかい?- Image Mode for OpenShift -
tsukaman
1
170
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
15
93k
(技術的には)社内システムもOKなブラウザエージェントを作ってみた!
har1101
0
220
Oracle AI Database移行・アップグレード勉強会 - RAT活用編
oracle4engineer
PRO
0
110
Cosmos World Foundation Model Platform for Physical AI
takmin
0
970
AWS DevOps Agent x ECS on Fargate検証 / AWS DevOps Agent x ECS on Fargate
kinunori
2
150
旅先で iPad + Neovim で iOS 開発・執筆した話
zozotech
PRO
0
100
【Oracle Cloud ウェビナー】[Oracle AI Database + AWS] Oracle Database@AWSで広がるクラウドの新たな選択肢とAI時代のデータ戦略
oracle4engineer
PRO
2
180
ランサムウェア対策としてのpnpm導入のススメ
ishikawa_satoru
0
220
SREじゃなかった僕らがenablingを通じて「SRE実践者」になるまでのリアル / SRE Kaigi 2026
aeonpeople
6
2.6k
Amazon Bedrock Knowledge Basesチャンキング解説!
aoinoguchi
0
160
AzureでのIaC - Bicep? Terraform? それ早く言ってよ会議
torumakabe
1
610
Featured
See All Featured
For a Future-Friendly Web
brad_frost
182
10k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.6k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
110
Building Flexible Design Systems
yeseniaperezcruz
330
40k
Navigating Team Friction
lara
192
16k
Abbi's Birthday
coloredviolet
1
4.8k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
85
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
60
42k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
120
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.7k
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 ɾଞʹ͍Ζ͍Ζ