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
オブジェクト指向のこころ: 第11章 / DESIGN PATTERNS EXPLAINED:...
Search
hideki kinjyo
PRO
October 14, 2021
Programming
0
61
オブジェクト指向のこころ: 第11章 / DESIGN PATTERNS EXPLAINED: chapter-11
会社で「オブジェクト指向のこころ」の読書会をやっています
hideki kinjyo
PRO
October 14, 2021
Tweet
Share
More Decks by hideki kinjyo
See All by hideki kinjyo
Composerが「依存解決」のためにどんな工夫をしているか #phpcon
o0h
PRO
1
410
Composerの依存解決 #phpstudy
o0h
PRO
0
120
「影響が少ない」を自分の目でみてみる
o0h
PRO
3
1.7k
PHPによる"非"構造化プログラミング入門 -本当に熱いスパゲティコードを求めて- #phperkaigi
o0h
PRO
0
1.6k
もう少しテストを書きたいんじゃ〜 #phpstudy
o0h
PRO
23
5.2k
『テスト書いた方が開発が早いじゃん』を解き明かす #phpcon_nagoya
o0h
PRO
10
3.9k
色んなオートローダーを覗き見る #phpcon_okinawa
o0h
PRO
5
690
ヒューマンエラーの本を読んだ ~報告会~
o0h
PRO
3
360
みんなでワイワイ「テスト駆動開発」の話をやる会 #techramen24conf
o0h
PRO
4
690
Other Decks in Programming
See All in Programming
testingを眺める
matumoto
1
130
Azure SRE Agentで運用は楽になるのか?
kkamegawa
0
1.3k
実用的なGOCACHEPROG実装をするために / golang.tokyo #40
mazrean
1
180
MCPとデザインシステムに立脚したデザインと実装の融合
yukukotani
4
1.2k
OSS開発者という働き方
andpad
5
1.7k
The state patternの実践 個人開発で培ったpractice集
miyanokomiya
0
160
TDD 実践ミニトーク
contour_gara
1
280
プロポーザル駆動学習 / Proposal-Driven Learning
mackey0225
2
550
【第4回】関東Kaggler会「Kaggleは執筆に役立つ」
mipypf
0
1k
AI OCR API on Lambdaを Datadogで可視化してみた
nealle
0
230
ECS初心者の仲間 – TUIツール「e1s」の紹介
keidarcy
0
150
AI時代のドメイン駆動設計-DDD実践におけるAI活用のあり方 / ddd-in-ai-era
minodriven
25
9.7k
Featured
See All Featured
Navigating Team Friction
lara
189
15k
KATA
mclloyd
32
14k
How to Ace a Technical Interview
jacobian
279
23k
Side Projects
sachag
455
43k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
185
54k
Reflections from 52 weeks, 52 projects
jeffersonlam
351
21k
Writing Fast Ruby
sferik
628
62k
The Pragmatic Product Professional
lauravandoore
36
6.8k
The Art of Programming - Codeland 2020
erikaheidi
55
13k
Thoughts on Productivity
jonyablonski
69
4.8k
Code Review Best Practice
trishagee
70
19k
Transcript
第11章 Abstract Factoryパターン 課題図書: オブジェクト指向のこころ: デザインパターンとともに学ぶ
Abstract Factory நతͳ ੜ(ث)ɾ
நతͳ ੜ(ث)ɾ •۩Λഉ͢Δ •͋Δଆ໘ΛΓམͱ͢ •ʮ֓೦ʯͷੈքʹۙͮ͘ •ʮੜʯͱ͖͍ͨΒ ʮར༻ʯͱͷؔΛىͯ͠Ͷʂ •ʮਖ਼͘͠࡞Δʯ໘ ݁߹͕ى͖͍͢(ࡉ͔͍͕ࣝඞཁ)
ʰσβΠϯύλʔϯ վగ൛ P95)ʱ
Abstract FactoryͬͯβοΫϦݴ͏ͱɾɾ ⽬的(GoF本): 互いに関連したり依存し合うオブジェクト群を、 その具象クラスを明確にせずに⽣成するためのインターフェー スを提供する • 「⽣成」と「利⽤」の分離を進める • 「⽣成(≒⽣成物の取得)」を「抽象的」に⾏えるようにする
=> 具象から切り離された・本質的な⽬的と関係ない情報を切 り離して」⽣成する
ྫ: ਤܗදࣔ&ҹγεςϜ • ը૾σʔλΛɺσΟεϓϨΠ/ϓϦϯλʹग़ྗ͢Δ • ग़ྗ༰ɺεϖοΫʹԠͯ͡ղ૾/ߴղ૾ͳͷ (υϥΠό)͕બ͞ΕΔ
コードの品質を⾒てみる 例えば「MIDDLE」という選択肢が増えたら、どのくらい 変更しやすい・・?という観点で品質を考えることが可能 • 結合度: •「描く」「印刷する」という処理の中に、「ドライバを 判断する」という処理が混ざっている •他の知識が混⼊している • 凝集度:
•「仕事が多岐にわたる」ことで「別々の箇所に、被った 仕事」が発⽣している •「1つの変更」に対して「複数箇所の対応」が必要とい う状況
ڞ௨ੑͱՄมੑΛݟͯΈΔ • ڞ௨ੑ: ը໘දࣔɾҹ͕ग़དྷ͍ͯΔ • Մมੑ: ϚγϯʹԠͯ͡ɺར༻͖͢υϥΠό͕ҟͳΔ
ڞ௨ੑΛநͰදݱͯ͠ΈΔ • 「ドライバを使って hogehoge」と「必要なドライ バを⽣成する」という共通性 を、抽象クラスに持たせる • 「必要なドライバの組み合わせ を判断する」可変性を、具象 クラスで表現する
ʮूΑΓܧঝʯʹͨ͠ࣄͷ • 組合せ爆発が発⽣して、具象クラスが無限に増える・・ • 「新設のクラスを作るべき」という動機が「何らかの組み 合わせが新しく増えた場合」になるので、結果的にできあ がる「細かくて伝わりにくいクラス(群)」・・・
抽象化(=共通性の発⾒と表現)と集約(分離) • 「画⾯」と「印刷」を1つの共通性とみな す • 使⽤者(ApControl)は、「抽象」へと依存さ せる •具体的すぎるところは踏み込みすぎない! => 「抽象に依存する」「依存性の注⼊」
「利⽤と⽣成の分離」を利⽤した例。 (「共通している部分」が「抽象化されてい るでしょ??」というのが⼤事!)
ར༻(ґଘ)ΦϒδΣΫτΛͲ͏ͬͯ࡞Δ͔ʁ • ※ઌͷྫͩͱʮར༻ऀͷ֎ʹಀ͕ͨ͠ʯ෦ • FactoryΛ༻͍ͯੜΛ͢Δ • => ར༻ऀ͔Βʮੜखଓ͖ʯΛΧϓηϧԽ͢Δ
None
Abstract Factoryͱconcrete • ʮੜΛநԽʯͨ͠ͱ͜ΖͰɺʮ۩ମతͳใ͕ཁΒͳ͘ͳΔʯ Θ͚Ͱͳ͍ • ʮར༻ऀ͕۩ମతʹதΛΒͳ͍͍ͯ͘Αʯͱ͚ͨͩ͠Ͱɺ ʮΞϓϦέʔγϣϯશମͰ”۩ମ”͕ෆඞཁʹͳΔʯΘ͚Ͱͳ ͍ •
ʮ۩ମతͳใɺͲ͔͜Β͖ͯɺͲ͜ʹೖΕΔɾɾʁʯͱ͍͏ ͕͋Δ • ʮઃఆʯͱ͔ʮϑΝΫτϦϝιουʯΛ͑ΔΑʂ
Configuration • 設定ファイルとかに値をも たせて! • その中でガッと切り替える よ!
Factory Method • 「設定値に応じて、何を 作るか」も相⼿の責任に しちゃうよ!
※ऄ: நతͰͳ͍ϑΝΫτϦ • 「⽣成するクラス(具象)が固定されている」場合に、Abstractで ないFactoryという事になる • GoFのデザインパターンには「Factrory⽤の(Concrete)クラスを 作成するパターン」は取り上げられていないが、「Factory methodを持つクラス」と実装観点では同じになる •
「⽣成⼿続きを切り離したい(隠蔽したい)」のがFactory • 「⽣成対象のファミリを抽象的に扱いたい(隠蔽したい)」のが Abstract Factory
ࡶͳ·ͱΊ • Abstract FactoryͰɺมಈʹڧ͍&ੜͱར༻ͷʹϨοπτϥΠͰ ͢Αʂ • ͋͘·Ͱʮؔ৺ͷʯʮߴڽूԽɾ݁߹Խʯͱ͍͏ͳͷͰɺશମ Ͱߟ͑Δͱʮ۩ମతͳࣄ͕ͳ͘ͳΔʯʮ۩͕ݮΔʯͱ͍͏Θ͚Ͱ ͳ͍ɾɾʂ •
Ͳ͔ͬ͠ΒͰʮղ૾͍ͭ͘ʹ͠·͔͢ʁʯΔඞཁ͕͋Δ • ʮͲ͜ʹ͋Δ͔ʯ͕େࣄɻͦΕ͕ʮม͑͢͞ʯʮಡΈ͢͞ʯʹڹ ͍ͯ͘Δʂͱ͍͏ • ΑΓ֓೦ɾઓज़తͳͱ͜Ζ͕Γ͔ͨͬͨΒɺୈ20ষνϥݟͯ͠Έ Δͱྑ͍͔
ࢀߟͱ͔ • ʮ࣮ࡍʹͲΜͳײ͡ͳΜͩΖʯΈ͍ͨͳɺྫ͑PSR-17ͱ͔Slim ͷίʔυͱ͔ • ʲPHPʳPSR-17 HTTP FactoriesʢHTTPϑΝΫτϦʣ https://www.ritolab.com/entry/190 •
Slim • factory: https://github.com/slimphp/Slim/blob/4.9.0/Slim/ Factory/Psr17/Psr17Factory.php • client: https://github.com/slimphp/Slim/blob/4.9.0/Slim/App.php
SlimͷʮPsr17ϑΝϛϦʯΛνϥݟ 具象側で「どんな⼯房が必要か」の設定をし 抽象側ではファクトリメソッドが「具象な⼯房」で指定された⼿続き実⾏する https://github.com/slimphp/Slim/blob/4.9.0/Slim/Factory/Psr17/Psr17Factory.php#47 https://github.com/slimphp/Slim/blob/4.9.0/Slim/Factory/Psr17/LaminasDiactorosPsr17Factory.php
SlimͷʮPsr17ϑΝϛϦʯΛνϥݟ 「どの⼯房を使うか」は、依存パッケージの存在等をチェックして「使える ものがアレば⾃動検出する」ことで判断している https://github.com/slimphp/Slim/blob/4.9.0/Slim/Factory/Psr17/Psr17Factory.php#99 https://github.com/slimphp/Slim/blob/4.9.0/Slim/Factory/ServerRequestCreatorFactory.php#L55