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
SPAのAPI開発の「やりづらさ」をDDDとオブジェクト指向の発想で解決する
Search
Hiromi Hishida
December 11, 2020
Programming
4
2.7k
SPAのAPI開発の「やりづらさ」をDDDとオブジェクト指向の発想で解決する
PHPカンファレンス2020 前夜祭にて発表
Hiromi Hishida
December 11, 2020
Tweet
Share
More Decks by Hiromi Hishida
See All by Hiromi Hishida
すばやく実装するための戦略とテクニック2024 / speed is power! 2024 #techramen24conf #shoyu
77web
8
3.9k
#phpcon_odawara オープン・クローズドなテストフィクスチャを求めて / open closed test fixtures
77web
3
410
Doctrine ORMでValue Objectを扱う方法4選 #phpstudy / 4 ways to handle Value Objects with Doctrine ORM
77web
4
200
100%出しきれないのを許すスクラムチーム運営
77web
1
210
マイクロサービスがほしいと思ったときに本当に必要だったもの〜なぜ人は共通基盤の夢を見るのか〜 / why microservice
77web
5
1.5k
モデルとはなにか / what is model?
77web
6
2.7k
たとえば、唐揚げを揚げながらPHPコードを書く技術 #phpstudy
77web
1
370
ベテランのバグ調査の秘訣、こっそり教えちゃいます。
77web
23
9.8k
Symfony+Doctrine ORMで始める安全なモジュラモノリス
77web
3
4.2k
Other Decks in Programming
See All in Programming
Developer Joy == Developer Productivity (really!)
hollycummins
1
240
『ドメイン駆動設計をはじめよう』中核の業務領域
masuda220
PRO
5
1k
rails_girls_is_my_gate_to_join_the_ruby_commuinty
maimux2x
0
200
GraphQLとGigaViewer for Apps
numeroanddev
2
190
unique パッケージから学ぶ interning と weak reference @ Asakusa.go#3
karamaru
2
820
React + TextAliveでカッコいいLyric Applicatioinを作ろう!!
tosuri13
0
400
From Idea to IDE: Developing Plugins for Android Studio
thisaay
1
230
Data Contracts In Practice With Debezium and Apache Flink
gunnarmorling
0
110
Amazon Neptuneで始める初めてのグラフDB ー グラフDBを使う意味を考える ー
satoshi256kbyte
2
260
Prolog入門
qnighy
4
1k
KSPの導入・移行を前向きに検討しよう!
shxun6934
PRO
0
290
Composing an API the *right* way (Droidcon New York 2024)
zsmb
2
190
Featured
See All Featured
Teambox: Starting and Learning
jrom
131
8.7k
Clear Off the Table
cherdarchuk
91
320k
The Language of Interfaces
destraynor
153
23k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
663
120k
It's Worth the Effort
3n
182
27k
What the flash - Photography Introduction
edds
67
11k
Principles of Awesome APIs and How to Build Them.
keavy
125
16k
Six Lessons from altMBA
skipperchong
26
3.4k
Music & Morning Musume
bryan
46
6k
Automating Front-end Workflow
addyosmani
1365
200k
Designing for humans not robots
tammielis
248
25k
Docker and Python
trallard
39
3k
Transcript
CZ!XFCUI%FD BU1)1$POGFSFODF 41"ͷ"1*։ൃͷΓͮΒ͞Λ%%% ͱΦϒδΣΫτࢦͷൃͰղܾ͢Δ
w ϑϦʔϥϯεˠΧϧςοτίϛϡχ έʔγϣϯζ։ൃ෦ɺݱࡏόοΫΤ ϯυϦʔυΤϯδχΞ w ຊ4ZNGPOZϢʔβʔձʢ։ళٳ ۀঢ়ଶʜʣ w ʮਓʹΘΕΔγεςϜʯΛ࡞Γͨ ͯ͘ɺϝϯςφϏϦςΟͷߴ͍։ൃ
Λࢦͯ͠νʔϜϝϯόʔͱҰॹʹ ʑฃಆதʂ w NPUIFSPG
ର w 41"ͷ"1* w TFSWFSUPTFSWFSͷ"1*ݪଇͱͯ͠είʔϓ֎Ͱ͕͢ɺࢀߟʹͰ͖Δ෦ ͋Δ͔͠Ε·ͤΜ
ݹ͖ྑ͖ϑϩϯτΤϯυ։ൃ QIQ PO$MJDLlʜz ʢಉ͡ਓ͕Δʣ
ݱͷϑϩϯτΤϯυ։ൃ <?php @Component({}) export class MyComponent extends OnInit {...} ʢҧ͏ਓ͕Δʣ
ݹ͖ྑ͖"1*։ൃ w TFSWFSUPTFSWFSࣗࣾͷσʔλΛଞࣾʢύʔτφʔʣʹެ։͢Δ w "NB[POΞιγΤΠτ8FCαʔϏεʢݱࡏͷ1SPEVDU"EWFSUJTJOH"1*ʣ w (PPHMF.BQT"1* w (PPHMFࠂ"1* :BIPPࠂ"1*ͳͲ
w ʮݹ͖ྑ͖ʯͱॻ͖·͕ͨ͠ݱࡏͰͪΖΜੜ͖͍ͯ·͢
ݱͷ"1*։ൃ w TFSWFSUPCSPXTFSPSTFSWFSUPNPCJMFBQQࣗࣾͷσʔλΛࣗࣾͷ41"ʢϑ ϩϯτΤϯυʣʹҾ͖͢ w ݹ͖ྑ͖"1*։ൃʹͳ͍ಛघੑ͕͋Δ
41"ͷ"1*։ൃͷಛघੑ w "1*Λ࡞ΔਓͱϑϩϯτΤϯυΛ࡞Δਓʢʹ"1*Λ͏ਓʣ͕ಉ͡৫ʹଐ͠ ͓ͯΓɺ྆ऀͷࣄΛ౷߹ͯͭ͠ͷγεςϜΛ࡞Ζ͏ͱ͍ͯ͠Δ͜ͱ w ͱ͍͑ɺݱͰେاۀɾ࣏ࣗମʢΦʔϓϯσʔλʣҎ֎ͷେ ͷ։ൃऀͷߦ͏"1*։ൃ41"ͷ"1*։ൃͳͷͰɺಛघੑͰͳͦ͘ Ε͕ී௨ʁ
41"ͷ"1*։ൃͷΓͮΒ͞ w ϩδοΫͷॏෳ w τϥϯβΫγϣϯͰ͖ͳ͍ w ͜ͷ"1*ɺଞʹͲ͜ͰΘΕ͍͚ͯͨͬʁʂ w O
ϩδοΫͷॏෳ w όοΫΤϯυͱϑϩϯτΤϯυͷ྆ํʹಉ͡ϩδοΫ͕ݱΕΔ
ϩδοΫͷॏෳ
ϩδοΫͷॏෳ (&5BQJJUFNT 0, \ lOBNFzzQIQDPOεςοΧʔz lQSJDFz ^ MFUQSJDFEBUBQSJDF
QSJDFQSJDF
ϩδοΫͷॏෳ w όοΫΤϯυʹଘࡏ͢ΔϩδοΫόοΫΤϯυଆͰӅṭ͢Δ w ϑϩϯτΤϯυϑϩϯτΤϯυͷؔ৺ࣄʹ͍͠ w Ξχϝʔγϣϯ w Ϋϩεϒϥβ w
69
ϩδοΫͷॏෳ (&5BQJJUFNT 0, \ lOBNFzzQIQDPOεςοΧʔz lOFUQSJDFz lUBYz
lQSJDFz ^ MFUQSJDFEBUBQSJDF QSJDFOFUQSJDF
τϥϯβΫγϣϯͰ͖ͳ͍ w αʔόʔଆͷঢ়ଶ͕มԽ͢ΔͷΛࢭΊΒΕͳ͍
τϥϯβΫγϣϯͰ͖ͳ͍
τϥϯβΫγϣϯͰ͖ͳ͍ (&5BQJJUFNT 0, \ lTUPDLz ^ 1045BQJPSEFS 0, \ lJEz
^ 1045BQJPSEFSJUFN
τϥϯβΫγϣϯͰ͖ͳ͍ (&5BQJJUFNT 0, \ lTUPDLz ^ 1045BQJPSEFS 0, \ lJEz
^ 1045BQJPSEFSJUFN ࡏݿΕൃੜʂ
τϥϯβΫγϣϯͰ͖ͳ͍ w UFMMEPO`UBTLʮίʔώʔͪΐ͏͍ͩʂʯ w ϩδοΫͷӅṭͷҰछͰ͋Δʢ0SEFSIBT.BOZ0SEFS*UFNTͰ͋Δ͜ͱ ΛϑϩϯτΤϯυΒͳͯ͘ྑ͍ʣ w τϥϯβΫγϣϯαʔόʔͰߦ͏͜ͱ͕Ͱ͖Δ
τϥϯβΫγϣϯͰ͖ͳ͍ 1045BQJPSEFS\lJUFN@JETz<>^ ࡏݿ͕͋Ε͕ؼͬͯ͘Δ͕ɺͳ͚ΕͱͳΔ
͜ͷ"1*ɺଞʹͲ͜ͰΘΕ͍͚ͯͨͬʁ w ಉ͡Α͏ͳσʔλΛ͏͔Βͱ"1*Λ͋ͪͪ͜Ͱ͍·Θͨ݁͠ՌɺཁΒͳ͘ ͳͬͨ"1*Λআͨͯ͘͠ଞͷ෦ʹӨڹ͕ग़ͦ͏ͰআͰ͖ͳ͍
͜ͷ"1*ɺଞʹͲ͜ͰΘΕ͍͚ͯͨͬʁ
͜ͷ"1*ɺଞʹͲ͜ͰΘΕ͍͚ͯͨͬʁ (&5BQJBSUJDMFT MJNJUP⒎TFU 0, < \lUJUMFzzBBBz zCPEZzzBBBz^ \lUJUMFzzCCCz zCPEZzzCCCz^
> (&5BQJBSUJDMFT MJNJU 0, < \lUJUMFzzBBBz zCPEZzzBBBz^ \lUJUMFzzCCCz zCPEZzzCCCz^ >
͜ͷ"1*ɺଞʹͲ͜ͰΘΕ͍͚ͯͨͬʁ (&5BQJBSUJDMFT MJNJUP⒎TFU 0, < \lUJUMFzzBBBz zCPEZzzBBBz^ \lUJUMFzzCCCz zCPEZzzCCCz^
> (&5BQJBSUJDMFT MJNJU 0, < \lUJUMFzzBBBz zCPEZzzBBBz^ \lUJUMFzzCCCz zCPEZzzCCCz^ > QBHFʹ͍͚ͨ͠ͲͰ͖ͳ͍ ΘΕͳ͍CPEZσʔλΛ͍࣋ͬͯΔ
͜ͷ"1*ɺଞʹͲ͜ͰΘΕ͍͚ͯͨͬʁ w "1*431ʹ͠Α͏ w ϑϩϯτΤϯυ͔Βݟͯผͷ༻్ͳΒ"1*ผʹ͢Δ w ͪΖΜόοΫΤϯυͰϩδοΫ͕ڞ௨ͷ෦·ͱΊΕྑ͍
͜ͷ"1*ɺଞʹͲ͜ͰΘΕ͍͚ͯͨͬʁ (&5BQJBSUJDMFT QBHF 0, < \lUJUMFzzBBBz zCPEZzzBBBz^ \lUJUMFzzCCCz zCPEZzzCCCz^
> (&5BQJMBUFTU@BSUJDMFT 0, < \lUJUMFzzBBBz^ \lUJUMFzzCCCz^ >
O w αʔόʔαΠυͰҰରଟͷϦϨʔγϣϯΛ࣋ͭΦϒδΣΫτΛऔಘ͠Α͏ͱ͠ ͯɺO ճͷϦΫΤετΛൃߦͯ͠͠·͏
O
O (&5BQJDBUFHPSJFT 0, < \lOBNFzz1)1z^ \lOBNFzz4ZNGPOZz^ > (&5BQJBSUJDMFT@DPVOU
DBUFHPSZ1)1 0, \ lDPVOUz ^ (&5BQJBSUJDMFT@DPVOU DBUFHPSZ4ZNGPOZ 0, \ lDPVOUz ^ ʢOճϦΫΤετʣ
O w O ΛղܾͰ͖ΔϨΠϠʔʢ42-ʣʹͤΔ w ܗ͕มΘΔͷͰɺผͷ໊લΛ͚ͭΔ w 2ͦΜͳ͜ͱ͍͍ͯ͠ͷʁϢʔβʔͷϝϯλϧϞσϧͱ߹Θͳ͍Μ͡Όͳ ͍ʁ
w "1*ͷϢʔβʔϑϩϯτΤϯυ͔ͩΒɺϑϩϯτΤϯυͷϝϯλϧϞσϧ ͱ%4-ʢ"1*ͷ63- ύϥϝʔλ ϨεϙϯεʣΛ߹ΘͤΑ͏
O (&5BQJDBUFHPSZ@XJUI@BSUJDMFT@DPVOU 0, < \lOBNFzz1)1z zBSUJDMFT@DPVOUz^ \lOBNFzz4ZNGPOZz zBSUJDMFT@DPVOUz^
>
༨ஊղܾυϝΠϯͱυϝΠϯͱϝϯλϧϞσϧ w ϑϩϯτΤϯυղܾυϝΠϯɺόοΫΤϯυղܾυϝΠϯɺۀυ ϝΠϯ w υϝΠϯۦಈઃܭͷରͱͳΔͷυϝΠϯ͚ͩͰͳ͍ w ࠷ऴϢʔβʔͷϝϯλϧϞσϧͱҰக͢Δ࣮Λ͍ͯͯ͠%#ਖ਼نԽͳΜͯ ͍ͭ·ͰܦͬͯͰ͖·ͤΜ w
ϢʔβʔͷϝϯλϧϞσϧʹҰகͤ͞Δ͖%4-
QIQ @Component({}) export class MyComponent extends OnInit {...} "1*
#*; 6*69
UIBOLZPV