Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
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
66
オブジェクト指向のこころ: 第11章 / DESIGN PATTERNS EXPLAINED: chapter-11
会社で「オブジェクト指向のこころ」の読書会をやっています
hideki kinjyo
PRO
October 14, 2021
Tweet
Share
More Decks by hideki kinjyo
See All by hideki kinjyo
手軽に積ん読を増やすには?/読みたい本と付き合うには?
o0h
PRO
1
170
symfony/mcp-bundleで、既存アプリケーションもお手軽にMCPサーバー化
o0h
PRO
1
53
組織もソフトウェアも難しく考えない、もっとシンプルな考え方で設計する #phpconfuk
o0h
PRO
10
5k
Composerが「依存解決」のためにどんな工夫をしているか #phpcon
o0h
PRO
1
610
Composerの依存解決 #phpstudy
o0h
PRO
0
150
「影響が少ない」を自分の目でみてみる
o0h
PRO
3
1.9k
PHPによる"非"構造化プログラミング入門 -本当に熱いスパゲティコードを求めて- #phperkaigi
o0h
PRO
0
1.8k
もう少しテストを書きたいんじゃ〜 #phpstudy
o0h
PRO
23
5.3k
『テスト書いた方が開発が早いじゃん』を解き明かす #phpcon_nagoya
o0h
PRO
9
4.2k
Other Decks in Programming
See All in Programming
著者と進める!『AIと個人開発したくなったらまずCursorで要件定義だ!』
yasunacoffee
0
140
愛される翻訳の秘訣
kishikawakatsumi
3
330
まだ間に合う!Claude Code元年をふりかえる
nogu66
5
840
ゲームの物理 剛体編
fadis
0
350
生成AIを利用するだけでなく、投資できる組織へ
pospome
2
350
モデル駆動設計をやってみようワークショップ開催報告(Modeling Forum2025) / model driven design workshop report
haru860
0
270
認証・認可の基本を学ぼう前編
kouyuume
0
250
Integrating WordPress and Symfony
alexandresalome
0
160
令和最新版Android Studioで化石デバイス向けアプリを作る
arkw
0
410
WebRTC と Rust と8K 60fps
tnoho
2
2k
Microservices rules: What good looks like
cer
PRO
0
1.5k
AIエージェントを活かすPM術 AI駆動開発の現場から
gyuta
0
430
Featured
See All Featured
Practical Orchestrator
shlominoach
190
11k
Visualization
eitanlees
150
16k
Git: the NoSQL Database
bkeepers
PRO
432
66k
Facilitating Awesome Meetings
lara
57
6.7k
The Cult of Friendly URLs
andyhume
79
6.7k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.8k
Rails Girls Zürich Keynote
gr2m
95
14k
Designing for humans not robots
tammielis
254
26k
Six Lessons from altMBA
skipperchong
29
4.1k
Product Roadmaps are Hard
iamctodd
PRO
55
12k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
51k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.8k
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