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
CleanArchitecture輪読会 - SOLID原則 - / Clean Archit...
Search
juve534
August 13, 2021
0
52
CleanArchitecture輪読会 - SOLID原則 - / Clean Architecture Round Reading SOLID
社内勉強会で行ったCleanArchitecture輪読会の一部
juve534
August 13, 2021
Tweet
Share
More Decks by juve534
See All by juve534
DMMプラットフォームでプルリクエストのマージ時間を250時間から50時間に減らした話 / Developers Summit 2023
juve534
3
2.3k
スクラムガイド輪読会 / changes 2020 Scrum Guide
juve534
0
92
DIについて知る / Let's study together DI.
juve534
0
48
PHPUnitでパラメタライズドテストと例外のテスト / PHPUnit +Parameterized Test
juve534
0
230
レガシーコードに最低限の秩序をもたせる
juve534
2
1.3k
Featured
See All Featured
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
7
150
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
What's new in Ruby 2.0
geeforr
342
31k
Building Adaptive Systems
keathley
38
2.2k
Bash Introduction
62gerente
608
210k
StorybookのUI Testing Handbookを読んだ
zakiyama
26
5.2k
Become a Pro
speakerdeck
PRO
24
5k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
107
49k
Visualization
eitanlees
144
15k
GraphQLとの向き合い方2022年版
quramy
43
13k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5k
[RailsConf 2023] Rails as a piece of cake
palkan
51
4.9k
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