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
63
オブジェクト指向のこころ: 第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
500
Composerの依存解決 #phpstudy
o0h
PRO
0
120
「影響が少ない」を自分の目でみてみる
o0h
PRO
3
1.7k
PHPによる"非"構造化プログラミング入門 -本当に熱いスパゲティコードを求めて- #phperkaigi
o0h
PRO
0
1.7k
もう少しテストを書きたいんじゃ〜 #phpstudy
o0h
PRO
23
5.3k
『テスト書いた方が開発が早いじゃん』を解き明かす #phpcon_nagoya
o0h
PRO
9
4k
色んなオートローダーを覗き見る #phpcon_okinawa
o0h
PRO
5
720
ヒューマンエラーの本を読んだ ~報告会~
o0h
PRO
3
370
みんなでワイワイ「テスト駆動開発」の話をやる会 #techramen24conf
o0h
PRO
4
730
Other Decks in Programming
See All in Programming
Introduce Hono CLI
yusukebe
6
2.8k
アメ車でサンノゼを走ってきたよ!
s_shimotori
0
230
オープンソースソフトウェアへの解像度🔬
utam0k
16
3k
CSC305 Lecture 04
javiergs
PRO
0
270
Web フロントエンドエンジニアに開かれる AI Agent プロダクト開発 - Vercel AI SDK を観察して AI Agent と仲良くなろう! #FEC余熱NIGHT
izumin5210
3
560
他言語経験者が Golangci-lint を最初のコーディングメンターにした話 / How Golangci-lint Became My First Coding Mentor: A Story from a Polyglot Programmer
uma31
0
200
非同期jobをtransaction内で 呼ぶなよ!絶対に呼ぶなよ!
alstrocrack
0
980
Devvox Belgium - Agentic AI Patterns
kdubois
1
130
チームの境界をブチ抜いていけ
tokai235
0
180
私達はmodernize packageに夢を見るか feat. go/analysis, go/ast / Go Conference 2025
kaorumuta
2
600
bootcamp2025_バックエンド研修_WebAPIサーバ作成.pdf
geniee_inc
0
120
『毎日の移動』を支えるGoバックエンド内製開発
yutautsugi
2
250
Featured
See All Featured
Typedesign – Prime Four
hannesfritz
42
2.8k
Embracing the Ebb and Flow
colly
88
4.9k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.2k
BBQ
matthewcrist
89
9.8k
A Tale of Four Properties
chriscoyier
161
23k
Thoughts on Productivity
jonyablonski
70
4.9k
Unsuck your backbone
ammeep
671
58k
Learning to Love Humans: Emotional Interface Design
aarron
274
41k
Testing 201, or: Great Expectations
jmmastey
45
7.7k
What's in a price? How to price your products and services
michaelherold
246
12k
Java REST API Framework Comparison - PWX 2021
mraible
34
8.9k
Being A Developer After 40
akosma
91
590k
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