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
noripi
December 19, 2017
Technology
0
1.7k
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
870
バックエンドが異なるサービスの差分を APIで吸収してみた話
noripi
1
1.7k
サーバサイドKotlinのすすめ
noripi
0
11k
サーバーサイドKotlinのすすめ(仮)
noripi
0
760
Other Decks in Technology
See All in Technology
Server-Side Engineer of LINE Sukimani
lycorp_recruit_jp
0
360
メンタル面でもつよつよエンジニアになる/登壇資料(井田 献一朗)
hacobu
0
120
.NET 9 のパフォーマンス改善
nenonaninu
0
1.3k
【re:Invent 2024 アプデ】 Prompt Routing の紹介
champ
0
160
Google Cloud で始める Cloud Run 〜AWSとの比較と実例デモで解説〜
risatube
PRO
0
120
怖くない!ゼロから始めるPHPソースコードコンパイル入門
colopl
0
170
組み込みアプリパフォーマンス格闘記 検索画面編
wataruhigasi
1
140
React Routerで実現する型安全なSPAルーティング
sansantech
PRO
2
280
サービスでLLMを採用したばっかりに振り回され続けたこの一年のあれやこれや
segavvy
2
550
株式会社ログラス − エンジニア向け会社説明資料 / Loglass Comapany Deck for Engineer
loglass2019
3
32k
20241220_S3 tablesの使い方を検証してみた
handy
4
700
watsonx.ai Dojo #5 ファインチューニングとInstructLAB
oniak3ibm
PRO
0
190
Featured
See All Featured
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
28
2.1k
[RailsConf 2023] Rails as a piece of cake
palkan
53
5.1k
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.9k
Imperfection Machines: The Place of Print at Facebook
scottboms
266
13k
GraphQLとの向き合い方2022年版
quramy
44
13k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
How GitHub (no longer) Works
holman
311
140k
The Power of CSS Pseudo Elements
geoffreycrofte
73
5.4k
A better future with KSS
kneath
238
17k
Building Adaptive Systems
keathley
38
2.3k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
229
52k
A Modern Web Designer's Workflow
chriscoyier
693
190k
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 ɾଞʹ͍Ζ͍Ζ