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
CleanArchitecture輪読会 - SOLID原則 - / Clean Archit...
Search
juve534
August 13, 2021
120
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
CleanArchitecture輪読会 - SOLID原則 - / Clean Architecture Round Reading SOLID
社内勉強会で行ったCleanArchitecture輪読会の一部
juve534
August 13, 2021
More Decks by juve534
See All by juve534
DMMプラットフォームでプルリクエストのマージ時間を250時間から50時間に減らした話 / Developers Summit 2023
juve534
3
3k
スクラムガイド輪読会 / changes 2020 Scrum Guide
juve534
0
150
DIについて知る / Let's study together DI.
juve534
0
87
PHPUnitでパラメタライズドテストと例外のテスト / PHPUnit +Parameterized Test
juve534
0
350
レガシーコードに最低限の秩序をもたせる
juve534
2
1.6k
Featured
See All Featured
The Language of Interfaces
destraynor
162
27k
Color Theory Basics | Prateek | Gurzu
gurzu
1
510
Design in an AI World
tapps
1
390
RailsConf 2023
tenderlove
30
1.6k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
Test your architecture with Archunit
thirion
2
2.5k
Facilitating Awesome Meetings
lara
57
7.2k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.6k
Code Reviewing Like a Champion
maltzj
529
40k
Designing for humans not robots
tammielis
254
26k
Fashionably flexible responsive web design (full day workshop)
malarkey
409
67k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
290
Transcript
CleanArchitectureྠಡձ - SOLIDݪଇ - @juve534
ࣗݾհ • Twitter / GitHub • juve534 • ࣄ •
PHPΛͬͨΞϓϦέʔγϣϯ։ൃ • ͖ͳαοΧʔνʔϜ • Ϣϕϯτε(Juventus)
ࠓ͢͜ͱ • ઃܭͷݪଇ • SRP : ୯Ұͷݪଇ • OCP :
ΦʔϓϯɾΫϩʔζυͷݪଇ • LSP : Ϧείϑͷஔݪଇ • ISP : ΠϯλϑΣʔεͷݪଇ • DIP : ґଘੑٯసͷ๏ଇ
ઃܭͷݪଇ
ઃܭͷݪଇ • ؔσʔλߏʹ͍ͭͯ͢ • ͜ΕΒݐஙͰྫ͑ΔͱϨϯΨ • ϨϯΨͷग़དྷ͕ѱ͚Εྑ͍ݐஙʹͳΒͳ ͍ • ϨϯΨͷग़དྷΛྑ͍ͨ͘͠
SOLIDݪଇͱ • ྺ࢙ݹ͘80ޙ͔Βٞ͞Ε͍ͯΔ • ֤ݪଇͷฒͼॱΛมߋͯ͠ʮSOLIDʯͱͳͬ ͨ • 2004͘Β͍
SOLIDݪଇͱ • ؔσʔλߏΛΫϥεʹΈࠐΉํ๏Λ ڭ͑Δ • ΫϥεOOPͷΫϥεͰͳ͍ • ͍ͭ͘ͷػೳσʔλΛ·ͱΊͨͷ
SOLIDݪଇͱ • ҎԼͷΑ͏ͳதؒϨϕϧͷιϑτΣΞߏΛ༻ҙ • มߋʹڧ͍ • ཧղ͍͢͠ • ίϯϙʔωϯτͷن •
ଟ͘ͷιϑτΣΞγεςϜͰར༻Ͱ͖Δ
SOLIDݪଇͱ • ຊॻͰΨοπϦͦΕͧΕͷݪଇΛղઆ͠ͳ ͍ • هࡌϘϦϡʔϜগͳΊ • ͦΕͧΕͷݪଇΛΓ͍ͨ߹ग़య
ϨϯΨͷͰ͖≠ՈͷͰ͖
SOLIDݪଇΛຬ͍ͨͯ͠Δ≠ ྑ͍ιϑτΣΞ
SOLIDݪଇͱ • Լهͷཁૉॏཁʹͳͬͯ͘Δ • ίϯϙʔωϯτઃܭ • ্ҐͷΞʔΩςΫνϟݪଇ • ଞͷষͰΑΓ্Ґͷઃܭʹ͍ͭͯ৮ΕΔ
SRP : ୯Ұͷݪଇ
SRP : ୯Ұͷݪଇ • ࠷ޡղ͞Ε͍͢ݪଇ • ҰͭͷΛຬͨͤͱ͍͏͜ͱͰͳ͍ • มߋཧ༝͕ͻͱͭͰ͋Δ͖
Ϟδϡʔϧͨͬͨ 1ͭͷΞΫλʔʹରͯ͠ Λෛ͏͖
ঢ়1 : ఆ֎ͷॏෳ
ঢ়1 : ఆ֎ͷॏෳ • 3ͭͷϝιου͕ผʑͷΞΫλʔʹΛͭ • calculatePayܦཧ෦༻(CFO) • reportHoursਓࣄ෦(COO) •
saveσʔλϕʔεཧऀ(CTO)
ঢ়1 : ఆ֎ͷॏෳ • calculatePayͱreportHoursͷίʔυΛڞ௨Խ • ෳͷΞΫλʔͷमਖ਼ΛฒΈἧ͑Δ • ςετ͕ཏ͖͠Ε͵
ঢ়2 : Ϛʔδ • EmployeeͷΑ͏ʹෳͷνʔϜʹ·͙ͨ • ฒߦ։ൃίʔυΛϚʔδ • ίϯϑϦΫτ͕ਏ͍
ҟͳΔΞΫλʔͷίʔυ ׂ͠Α͏
ղܾࡦ • ؔΛผͷΫϥεʹҠಈ͢Δ • Ұྫͱͯ͠FacadeύλʔϯΛ׆༻͢Δ • ≠ LaravelͷFacade
ղܾࡦ
SRP·ͱΊ • ΞΫλʔ͝ͱʹΛׂ͢Δ • ಉ͡Α͏ͳݪଇ্ҐϨΠϠʔͰ͋Δ • ดੑڞ௨ͷݪଇʢCCPʣ • มߋͷ࣠ •
ॏཁͳߟ͑ํͷ1ͭͱ৺ಘΔ
OCP : ΦʔϓϯɾΫϩʔζυͷݪଇ
OCP : ΦʔϓϯɾΫϩʔζυͷݪଇ • 1988ʹఏএ͞Εͨ • ιϑτΣΞͷৼΔ͍ɺ • طଘʹӨڹΛ༩֦͑ͣு͞ΕΔ͖
None
OCP : ΦʔϓϯɾΫϩʔζυͷݪଇ • ྫ͑ձܭใࠂγεςϜ͕͋Δ • Webϖʔδͱͯ͠ग़ྗ • ҹσʔλͱͯ͠ग़ྗ
OCP : ΦʔϓϯɾΫϩʔζυͷݪଇ • ྫ͑ձܭใࠂγεςϜ͕͋Δ • Webϖʔδͱͯ͠ग़ྗ • ҹσʔλͱͯ͠ग़ྗ •
CSVϑΝΠϧͱͯ͠ग़ྗ ͜Ε͕Ճ
OCP : ΦʔϓϯɾΫϩʔζυͷݪଇ • CSVϑΝΠϧΛՃ͢Δ • Webϖʔδ͕Ϋϥογϡͨ͠Βਏ͍ • طଘͷίʔυʹӨڹ͕ग़ͳ͍ઃܭʹ͍ͨ͠
όϦΤʔγϣϯʹΑΔมߋͰ طଘͷίʔυʹӨڹΛ ༩͑ͳ͍Α͏ʹ͢Δ
Ξϓϩʔν • ग़ྗ෦(Presenter)Λࠩ͠ସ͑ΔΑ͏ʹ͢Δ • FactoryϝιουύλʔϯAbstractFactory ύλʔϯΛ͏
OCP·ͱΊ • όϦΤʔγϣϯʹΑΔมߋͰطଘͷίʔυʹ ӨڹΛ༩͑ͳ͍Α͏ʹ͢Δ • ίϯϙʔωϯτΛࡉ͔͘͢Δ͜ͱͰղܾ͢Δ
LSP : Ϧείϑͷஔݪଇ
LSP : Ϧείϑͷஔݪଇ • 1988ʹఏএ • جఈΫϥεͱͦΕΛੜͨ͠ΫϥεɺͲͪ Βࠩ͠ସ͑ՄೳͰ͋Δ͜ͱ
LSP : Ϧείϑͷஔݪଇ • ఆٛ͞Εͨ࣌جఈΫϥεͷൣғ • ݱʹ͓͍ͯΑΓ͍ൣғͰదԠՄೳ • ΠϯλϑΣʔε •
APIͷϦΫΤετ&Ϩεϙϯε
LSP : Ϧείϑͷஔݪଇ • ྫ͑ٸʹAPIͷϨεϙϯεΛม͑Δ • id→user_id • ޓੑͷͳ͍มߋͰݺͼग़͠ൣғશͯͰमਖ਼ ͕ඞཁʹͳΔ
None
None
Ξϓϩʔν • Ұ࣌తʹidͱuser_idͷ྆ํΛฦ͢ • ஔ͖͕͑ऴΘͬͨΒফ͢
None
LSP·ͱΊ • ੜͨ͠ͷجఈͱஔ͖͑ΛՄೳͱ͢Δ • ΠϯλϑΣʔεAPIͷϨεϙϯε
ISP : ΠϯλϑΣʔεͷݪ ଇ
ISP : ΠϯλϑΣʔεͷݪଇ • ΫϥΠΞϯτର͠ɺར༻͠ͳ͍ΠϯλʔϑΣ ΠεͷґଘΛڧ੍͠ͳ͍ • ͜ͷݪଇຊॻͰͷهࡌͱͯগͳ͍ • ׂͱݴޠґଘͳͱ͜Ζ͋Δ͔Β͔ͳ
ISP : ΠϯλϑΣʔεͷݪଇ • ͜Ε্ҐϨϕϧͰద༻Ͱ͖Δ • ྫ͑ϑϧελοΫϑϨʔϜϫʔΫଟ͘ͷ ϥΠϒϥϦʹґଘ͍ͯ͠Δ • ϑϨʔϜϫʔΫར༻ऀؒతʹґଘ͍ͯ͠
Δ͜ͱʹͳΔ
ISP : ΠϯλϑΣʔεͷݪଇ • ؒతʹґଘ͍ͯ͠ΔͷͰϥΠϒϥϦͷΞο ϓσʔτ͕ඞཁ • ์ஔ͍ͯ͠Δͱ੬ऑੑʹͳΔ͔
ISP·ͱΊ • ඞཁͰͳ͍ͷʹґଘ͢ΔͱᐫʹͳΔ • ߋʹ্ҐͷผͷষͰޠΒΕΔ
DIP : ґଘੑٯసͷ๏ଇ
ґଘ͕ؔந͚ͩΛ ࢀর͍ͯ͠Δ
≠۩ʹґଘ͠ͳ͍
DIP : ґଘੑٯసͷ๏ଇ • ݴޠOSϨϕϧͷ۩มԽ͕গͳ͍ • มԽ͍͢͠۩ཁૉʹґଘ͠ͳ͍ • ࣗͨͪͷΞϓϦέʔγϣϯʹ͋Δͣ
DIP : ґଘੑٯసͷ๏ଇ • มԽ͍͢͠۩ΫϥεΛࢀর͠ͳ͍ • ΠϯλʔϑΣΠεΛࢀর͢Δ
DIP : ґଘੑٯసͷ๏ଇ • มԽ͍͢͠۩ΫϥεΛܧঝ͠ͳ͍ • มߋʹΑΔӨڹΛड͚ͯ͠·͏ͨΊ
DIP : ґଘੑٯసͷ๏ଇ • ۩ؔΛΦʔόʔϥΠυ͠ͳ͍ • ґଘؔܧঝͯ͠͠·͏ͨΊ
Ξϓϩʔν • Abstract FactoryͰґଘؔΛநԽ͢Δ
DIP·ͱΊ • มԽ͍͢͠۩ཁૉʹґଘ͠ͳ͍ • நʹґଘ͢ΔΑ͏ʹ͢Δ • ্ҐϨϕϧͰద༻ՄೳͰԿొ͢Δ
͓͞Β͍
Ⅲষ·ͱΊ • ؔσʔλߏͷྑ͍ΈࠐΈํ • ʹSOLIDݪଇ • SOLIDݪଇΛۦͯ͠ϨϯΨͷग़དྷΛྑ͘͢ Δ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ Twitter/GitHub juve534