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
110
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
140
DIについて知る / Let's study together DI.
juve534
0
85
PHPUnitでパラメタライズドテストと例外のテスト / PHPUnit +Parameterized Test
juve534
0
340
レガシーコードに最低限の秩序をもたせる
juve534
2
1.6k
Featured
See All Featured
Bash Introduction
62gerente
615
220k
Build your cross-platform service in a week with App Engine
jlugia
234
19k
The browser strikes back
jonoalderson
0
1.8k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.9k
Product Roadmaps are Hard
iamctodd
55
13k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
20k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
570
Into the Great Unknown - MozCon
thekraken
41
2.8k
Speed Design
sergeychernyshev
33
2.2k
Large-scale JavaScript Application Architecture
addyosmani
516
110k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.5k
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