Slide 1

Slide 1 text

第11章 Abstract Factoryパターン 課題図書: オブジェクト指向のこころ: デザインパターンとともに学ぶ

Slide 2

Slide 2 text

Abstract Factory ந৅తͳ ੜ੒(ث)ɾ޻๪

Slide 3

Slide 3 text

ந৅తͳ ੜ੒(ث)ɾ޻๪ •۩৅Λഉ͢Δ •͋Δଆ໘Λ੾Γམͱ͢ •ʮ֓೦ʯͷੈքʹۙͮ͘ •ʮੜ੒ʯͱ͖͍ͨΒ ʮར༻ʯͱͷؔ܎Λ૝ىͯ͠Ͷʂ •ʮਖ਼͘͠࡞Δʯ৔໘͸ ݁߹͕ى͖΍͍͢(ࡉ͔͍஌͕ࣝඞཁ)

Slide 4

Slide 4 text

ʰσβΠϯύλʔϯ վగ൛ P95)ʱ

Slide 5

Slide 5 text

Abstract FactoryͬͯβοΫϦݴ͏ͱɾɾ ⽬的(GoF本): 互いに関連したり依存し合うオブジェクト群を、 その具象クラスを明確にせずに⽣成するためのインターフェー スを提供する • 「⽣成」と「利⽤」の分離を進める • 「⽣成(≒⽣成物の取得)」を「抽象的」に⾏えるようにする => 具象から切り離された・本質的な⽬的と関係ない情報を切 り離して」⽣成する

Slide 6

Slide 6 text

ྫ: ਤܗදࣔ&ҹ࡮γεςϜ • ը૾σʔλΛɺσΟεϓϨΠ/ϓϦϯλʹग़ྗ͢Δ • ग़ྗ಺༰͸ɺεϖοΫʹԠͯ͡௿ղ૾౓/ߴղ૾౓ͳ΋ͷ (υϥΠό)͕બ୒͞ΕΔ

Slide 7

Slide 7 text

コードの品質を⾒てみる 例えば「MIDDLE」という選択肢が増えたら、どのくらい 変更しやすい・・?という観点で品質を考えることが可能 • 結合度: •「描く」「印刷する」という処理の中に、「ドライバを 判断する」という処理が混ざっている •他の知識が混⼊している • 凝集度: •「仕事が多岐にわたる」ことで「別々の箇所に、被った 仕事」が発⽣している •「1つの変更」に対して「複数箇所の対応」が必要とい う状況

Slide 8

Slide 8 text

ڞ௨ੑͱՄมੑΛݟͯΈΔ • ڞ௨ੑ: ը໘දࣔɾҹ࡮͕ग़དྷ͍ͯΔ • Մมੑ: ϚγϯʹԠͯ͡ɺར༻͢΂͖υϥΠό͕ҟͳΔ

Slide 9

Slide 9 text

ڞ௨ੑΛந৅Ͱදݱͯ͠ΈΔ • 「ドライバを使って hogehoge」と「必要なドライ バを⽣成する」という共通性 を、抽象クラスに持たせる • 「必要なドライバの組み合わせ を判断する」可変性を、具象 クラスで表現する

Slide 10

Slide 10 text

ʮू໿ΑΓܧঝʯʹͨ͠ࣄͷ໰୊ • 組合せ爆発が発⽣して、具象クラスが無限に増える・・ • 「新設のクラスを作るべき」という動機が「何らかの組み 合わせが新しく増えた場合」になるので、結果的にできあ がる「細かくて伝わりにくいクラス(群)」・・・

Slide 11

Slide 11 text

抽象化(=共通性の発⾒と表現)と集約(分離) • 「画⾯」と「印刷」を1つの共通性とみな す • 使⽤者(ApControl)は、「抽象」へと依存さ せる •具体的すぎるところは踏み込みすぎない! => 「抽象に依存する」「依存性の注⼊」 「利⽤と⽣成の分離」を利⽤した例。 (「共通している部分」が「抽象化されてい るでしょ??」というのが⼤事!)

Slide 12

Slide 12 text

ར༻(ґଘ)ΦϒδΣΫτΛͲ͏΍ͬͯ࡞Δ͔ʁ • ※ઌͷྫͩͱʮར༻ऀͷ֎ʹಀ͕ͨ͠ʯ෦෼ • FactoryΛ༻͍ͯੜ੒Λ෼཭͢Δ • => ར༻ऀ͔Β͸ʮੜ੒खଓ͖ʯΛΧϓηϧԽ͢Δ

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

Abstract Factoryͱconcrete • ʮੜ੒Λந৅Խʯͨ͠ͱ͜ΖͰɺʮ۩ମతͳ৘ใ͕ཁΒͳ͘ͳΔʯ Θ͚Ͱ͸ͳ͍ • ʮར༻ऀ͕۩ମతʹத਎Λ஌Βͳ͍͍ͯ͘Αʯͱ͚ͨͩ͠Ͱɺ ʮΞϓϦέʔγϣϯશମͰ”۩ମ”͕ෆඞཁʹͳΔʯΘ͚Ͱ͸ͳ ͍ • ʮ۩ମతͳ৘ใ͸ɺͲ͔͜Β͖ͯɺͲ͜ʹೖΕΔɾɾʁʯͱ͍͏ ໰୊͕͋Δ • ʮઃఆ஋ʯͱ͔ʮϑΝΫτϦϝιουʯΛ࢖͑ΔΑʂ

Slide 15

Slide 15 text

Configuration • 設定ファイルとかに値をも たせて! • その中でガッと切り替える よ!

Slide 16

Slide 16 text

Factory Method • 「設定値に応じて、何を 作るか」も相⼿の責任に しちゃうよ!

Slide 17

Slide 17 text

※ऄ଍: ந৅తͰ͸ͳ͍ϑΝΫτϦ • 「⽣成するクラス(具象)が固定されている」場合に、Abstractで ないFactoryという事になる • GoFのデザインパターンには「Factrory⽤の(Concrete)クラスを 作成するパターン」は取り上げられていないが、「Factory methodを持つクラス」と実装観点では同じになる • 「⽣成⼿続きを切り離したい(隠蔽したい)」のがFactory • 「⽣成対象のファミリを抽象的に扱いたい(隠蔽したい)」のが Abstract Factory

Slide 18

Slide 18 text

ࡶͳ·ͱΊ • Abstract FactoryͰɺมಈʹڧ͍&ੜ੒ͱར༻ͷ෼཭ʹϨοπτϥΠͰ ͢Αʂ • ͋͘·Ͱʮؔ৺ͷ෼཭ʯʮߴڽूԽɾ௿݁߹Խʯͱ͍͏࿩ͳͷͰɺશମ Ͱߟ͑Δͱʮ۩ମతͳ࢓ࣄ͕ͳ͘ͳΔʯʮ۩৅͕ݮΔʯͱ͍͏Θ͚Ͱ͸ ͳ͍ɾɾʂ • Ͳ͔ͬ͠ΒͰʮղ૾౓͸͍ͭ͘ʹ͠·͔͢ʁʯ͸஌Δඞཁ͕͋Δ • ʮͲ͜ʹ͋Δ͔ʯ͕େࣄɻͦΕ͕ʮม͑΍͢͞ʯʮಡΈ΍͢͞ʯʹڹ ͍ͯ͘Δʂͱ͍͏࿩ • ΑΓ֓೦ɾઓज़తͳͱ͜Ζ͕஌Γ͔ͨͬͨΒɺୈ20ষ΋νϥݟͯ͠Έ Δͱྑ͍͔΋

Slide 19

Slide 19 text

ࢀߟͱ͔ • ʮ࣮ࡍʹͲΜͳײ͡ͳΜͩΖʯΈ͍ͨͳ࿩͸ɺྫ͑͹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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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