Upgrade to Pro — share decks privately, control downloads, hide ads and more …

オブジェクト指向のこころ: 第11章 / DESIGN PATTERNS EXPLAINED: chapter-11

オブジェクト指向のこころ: 第11章 / DESIGN PATTERNS EXPLAINED: chapter-11

会社で「オブジェクト指向のこころ」の読書会をやっています

hideki kinjyo
PRO

October 14, 2021
Tweet

More Decks by hideki kinjyo

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  11. 抽象化(=共通性の発⾒と表現)と集約(分離)
    • 「画⾯」と「印刷」を1つの共通性とみな

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

    View Slide

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

    View Slide

  13. View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  20. 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

    View Slide

  21. 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

    View Slide