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
54
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
93
DIについて知る / Let's study together DI.
juve534
0
49
PHPUnitでパラメタライズドテストと例外のテスト / PHPUnit +Parameterized Test
juve534
0
230
レガシーコードに最低限の秩序をもたせる
juve534
2
1.3k
Featured
See All Featured
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
47
2.1k
Typedesign – Prime Four
hannesfritz
40
2.4k
Imperfection Machines: The Place of Print at Facebook
scottboms
265
13k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
27
4.3k
10 Git Anti Patterns You Should be Aware of
lemiorhan
654
59k
Being A Developer After 40
akosma
86
590k
StorybookのUI Testing Handbookを読んだ
zakiyama
27
5.3k
No one is an island. Learnings from fostering a developers community.
thoeni
19
3k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
38
1.8k
VelocityConf: Rendering Performance Case Studies
addyosmani
325
24k
Automating Front-end Workflow
addyosmani
1366
200k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
665
120k
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