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
オブジェクト指向のこころ: 第8章 / DESIGN PATTERNS EXPLAINED: ...
Search
hideki kinjyo
PRO
September 30, 2021
Programming
0
96
オブジェクト指向のこころ: 第8章 / DESIGN PATTERNS EXPLAINED: chapter-8
会社で「オブジェクト指向のこころ」の読書会をやっています
hideki kinjyo
PRO
September 30, 2021
Tweet
Share
More Decks by hideki kinjyo
See All by hideki kinjyo
Composerの依存解決 #phpstudy
o0h
PRO
0
77
「影響が少ない」を自分の目でみてみる
o0h
PRO
3
1.3k
PHPによる"非"構造化プログラミング入門 -本当に熱いスパゲティコードを求めて- #phperkaigi
o0h
PRO
0
1.3k
もう少しテストを書きたいんじゃ〜 #phpstudy
o0h
PRO
22
5k
『テスト書いた方が開発が早いじゃん』を解き明かす #phpcon_nagoya
o0h
PRO
10
3.3k
色んなオートローダーを覗き見る #phpcon_okinawa
o0h
PRO
5
610
ヒューマンエラーの本を読んだ ~報告会~
o0h
PRO
3
320
みんなでワイワイ「テスト駆動開発」の話をやる会 #techramen24conf
o0h
PRO
4
620
SPLから始める「データ構造」入門
o0h
PRO
7
2.1k
Other Decks in Programming
See All in Programming
fieldalignmentから見るGoの構造体
kuro_kurorrr
0
130
音声プラットフォームのアーキテクチャ変遷から学ぶ、クラウドネイティブなバッチ処理 (20250422_CNDS2025_Batch_Architecture)
thousanda
0
380
Improve my own Ruby
sisshiki1969
0
100
Носок на сок
bo0om
0
1.1k
プロダクト横断分析に役立つ、事前集計しないサマリーテーブル設計
hanon52_
3
530
generative-ai-use-cases(GenU)の推しポイント ~2025年4月版~
hideg
1
370
Deoptimization: How YJIT Speeds Up Ruby by Slowing Down / RubyKaigi 2025
k0kubun
1
1.9k
KANNA Android の技術的課題と取り組み
watabee
0
180
オープンソースコントリビュート入門
_katsuma
0
120
カオスに立ち向かう小規模チームの装備の選択〜フルスタックTSという装備の強み _ 弱み〜/Choosing equipment for a small team facing chaos ~ Strengths and weaknesses of full-stack TS~
bitkey
1
130
AIコーディングエージェントを 「使いこなす」ための実践知と現在地 in ログラス / How to Use AI Coding Agent in Loglass
rkaga
4
1.2k
状態と共に暮らす:ステートフルへの挑戦
ypresto
3
1.1k
Featured
See All Featured
Building a Scalable Design System with Sketch
lauravandoore
462
33k
Building Flexible Design Systems
yeseniaperezcruz
329
39k
Rails Girls Zürich Keynote
gr2m
94
13k
Art, The Web, and Tiny UX
lynnandtonic
298
20k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
60k
Java REST API Framework Comparison - PWX 2021
mraible
31
8.5k
VelocityConf: Rendering Performance Case Studies
addyosmani
329
24k
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
41
2.3k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.6k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
StorybookのUI Testing Handbookを読んだ
zakiyama
29
5.7k
Transcript
第8章 視野を広げる 課題図書: オブジェクト指向のこころ: デザインパターンとともに学ぶ
ԿͷࢹΛ͛ͯΔΜͩΖ͏Ͷʂʁ • ΦϒδΣΫτࢦ(ΧϓηϧԽ)ͷ3ͭͷجຊత֓೦ • ΦϒδΣΫτɺΧϓηϧԽɺநΫϥε • ͜ΕΒ͕ʮͲ͏ͬͯʹཱ͍͔ͬͯ͘ͳʂʁҙٛਂͬ͞ ͯͲΜͳͷʂʁʯ͔ͳʔ • ͪΐͬͱݪཧݪଇͷࢹ͔Βߟ͑ͯΈΑ͏͔ʂతͳ
• σβύλɺΞδϟΠϧ։ൃͱ͍ͬͨͱͷܨ͕Γʹݴ ٴͯ͠ΈΔΑʂ
͜ͷষͷΩʔϫʔυ • ΦϒδΣΫτ • ΧϓηϧԽɾӅṭ • ܧঝɾಛघԽ • ࠶ར༻ •
ྲྀಈੑ • ڞ௨ੑ(ੳ) • Մมੑ(ੳ) • நɺ֓೦ɾ༷ɾ࣮
従来からの考え⽅と新たな考え⽅ 8.2 オブジェクト: 従来の考え⽅と新たな考え⽅ 8.3 カプセル化
「君たちのオブジェクト指向は間違っている(かも)」 「君たちのカプセル化は間違っている(かも)」 ⾔いたいこと
ൺͯΈΑ͏ ैདྷͷߟ͑ํ ޡղ ৽ͨͳߟ͑ํ ຊ࣭ ΦϒδΣΫτͱʁ ૢ࡞Λͬͨσʔλ σʔλͱৼΔ͍ ϝιου ͕
ͭʹͳͬͨͷʂ Λඋ࣮͑ͨମ ΧϓηϧԽͱʁ σʔλΛӅṭ͢Δ͜ͱʂ ͋ΒΏΔͷΛӅṭ͢Δ σʔλɺϝιουɺܕ
それで何が変わるのか? (を⾒ていきます)
ʮैདྷతʯͳΦϒδΣΫτͷځ۶͞ • ઃܭΛ͢Δ࣌ʹʮ֓೦ʯ͔ΒೖΔͱΓ͍͢Ͷʙ͕ͬͯ͋ Γ·͢(͋Γ·ͨ͠Ͷʁ) • ͨͩɺʮσʔλʴૢ࡞(ৼΔ͍)ʯͱ͍͏ଊ͑ํ࣮ʹدΓ ͗ͨ͢؍ͱ͍͏ؾ͕͢Δ • Ͳ͏͍͏σʔλ(ଐੑ)͕͋ͬͯɺͦΕΛͲ͏ѻ͏͔ʁΛ࠷ॳ͔ ΒΒͳ͍ͱઃܭ͕ୡ͞Εͳ͍༁Ͱ
• ͱͯʮ֓೦Ͱߟ͑Δ(நతʹΛ͢Δ)ʯͱݴ͑ͳ͍ʂ
※ ͪΐͬͱ͓Βͤ ʮͰߟ͑ΔͱԿ͕ྑ͍Μ͚ͩͬʁʯʹ͍ͭͯ1ষΛ͓ ͞Β͍ͯ͠ΈͯͶʂ • 1.5 ཁٻͷมߋʹऔΓΉ • 1.6 ΦϒδΣΫτࢦύϥμΠϜ
参考: オブジェクト指向のこころ: 第1章 / DESIGN PATTERNS EXPLAINED: chapter-1 - Speaker Deck https://speakerdeck.com/o0h/design-patterns-explained-chapter-1?slide=22
ΦϒδΣΫτΛʮʯͰߟ͑Δ • ֓೦্ͷ؍ʹج͍ͮͯோΊΔͱɺΦϒδΣΫτͱΛ උ࣮͑ͨମͰ͋Δͱଊ͑ΒΕΔ • ʮΛՌͨ͢ʯͨΊʹσʔλৼΔ͍Λ͍࣋ͬͯΔ • ݺͼग़͠ଆʹରͯ͠ΛՌͨ͢ओମͰ͋Γɺʮ෦͕Ͳ ͏ͳ͍ͬͯΔ͔ʯݺͼग़͠ଆʹ࿐ఄͤ͞ͳ͍ͰOK •
దͳΛՌͨͤΔΑ͏ʹઃܭͯ͠ɺࣗͷΛ୭͔ʹ όϥࢃ͔ͳ͍ଘࡏͰ͋Γ͍ͨͳ͊(ߴڽूɾ݁߹)
ͲʔΏʔ͜ͱͳͷ͔ͳ ྫ͑ʮਤܗඳըʯΫϥεͰߟ͑ͯΈΔ • ΦϒδΣΫτͱσʔλʴৼΔ͍ • ͷ࠲ඪใ(ଐੑ)ͱඳըɾදࣔ(ૢ࡞)Λ࣋ͭԿ͔ • ΦϒδΣΫτͱΛඋ࣮͑ͨମ • ਤܗΛඳ͖͍ͨ࣌ʹྑ͍ײ͡ʹͬͯ͘ΕΔԿ͔
֓೦ͷ؍ʹج͍ͮͨઃܭ • ʮ֓೦͚ͩͰઃܭΛਐΊΒΕΔʯͱ͍͏ײ͕֮େࣄʂ • ઃܭͷஈ֊ͰʮৄࡉΛΓ͠ʯͯߟ͑͘͢ͳΔ 従来的な考え⽅ 新しい考え⽅ 「座標データ」が必要 で、「描画・表⽰の⼿続き」も考 える必要があるな・・・
図形を描きたいな・・ それ⽤の描画できる何かを 作っておこう ৄࡉͱີʹͳΓ͍͢ ৄࡉΓ͞ΕΔ ࣮؍Ά͍ ֓೦্ͷ؍Ά͍
ΦϒδΣΫτʹର͢Δଊ͑ํͷϙΠϯτ • ৽͍͠ߟ͑ํʹΑͬͯɺʮͲ͏࣮͞ΕΔ͔ʯΑΓʮԿΛ࣮ߦ͢ Δͷ͔(త)ʯʹؔ৺ΛूதͰ͖Δ • ʮ࣮Ͱͳ͘ಈػʹண͢Δʯσβύλʹසग़ͷ؍ • ৄࡉΑΓઌʹ༧උతͳઃܭΛߦ͑ΔΑ͏ʹͳΔ • શͯ(ৄࡉ)Λચ͍ग़͞ͳͯ͘ઃܭͰ͖Δ
• “࣮ΛΠϯλʔϑΣʔεͷഎޙʹӅṭ͢Δ͜ͱͰɺ࣮ͱͦΕ Λ༻͢ΔΦϒδΣΫτΛ͢Δ͜ͱʹͳΔΘ͚Ͱ͢(P106)” • ʮखଓ͖తͳߟ͑ํʯ͔ΒʮΦϒδΣΫτࢦʯʂ
ʮैདྷతʯͳΧϓηϧԽͷΓͳ͞ • ʮΧϓηϧԽͱσʔλӅṭʯͰͳ͘ɾɾɾ • σʔλͷӅṭʮΧϓηϧԽͷݶΒΕͨҰ໘ʯ • ΧϓηϧԽͱʮ͋ΒΏΔͷͷӅṭʯͱଊ͑Δ͖ • ͜͜ͷ”ࢹ͕ڱ͘”ͳͬͯ͠·͏ͱɺຊ࣭͔Βԕ͔͟Δ •
σʔλɺ࣮ɺੜΫϥεɺઃܭͷৄࡉɺ࣮ମԽͷنଇ etc.
ͳΜͰʮσʔλͷӅṭʯ͚ͩ͡ΌΓΜͷ͡ΌΖ • ຊॻͰΧϓηϧԽͱݴ͍ͬͯΔͷɺʮݺͼग़͠ݩʹରͯ͠Ӆṭ ͢Δʯʮ৮ΕΒΕͳ͘͢Δʯ͜ͱΛ௨ͯ͡ʮҙࣝͰ͖ͳ͘͢ Δʯͱ͍͏χϡΞϯε͕ڧ͍ؾ͕͢Δ • ͜ΕʹΑͬͯɺ࣍ͷར(ڧΈ)͕֫ಘ͞Εͦ͏ • ݁߹Խ͘͢͠ͳΔ •
ʮநʹରͯ͠ϓϩάϥϛϯά͠ΖʯݪଇΛୡͨ͠Γɺʮϙ ϦϞʔϑΟζϜΛ׆͔͢ʯͱ͍͏ςΫχοΫ͕͍͘͢ͳΔ • ʮ֓೦ͷ؍Ͱߟ͑Δʯ্ͰɺʮΧϓηϧԽʯͷύϫʔ͕͔ܽͤ ͳ͍ʂ(ͱ͍͏ߟ͑ํͳΜ͡Όͳ͍͔ͳ͊)
σʔλͷΧϓηϧԽ • ʮσʔλΛ֎෦͔ΒӅṭ͢Δʯͱ͏ͷͲ͏Δ͔ʁͱ͍ ͏ͷɺΠϝʔδ͕༙͖͍͢ͱࢥ͍·͢ͷͰʂ • ͜͜ͰհΛׂѪ͠·͢
ϝιουͷΧϓηϧԽ • ʮந(abstract,interface)ʹରͯ͠ϝοηʔδϯάΛͯ͠ ɺ۩(concrete)ͷϝιου͕࣮ߦ͞Ε͍ͯΔ(͘͠ ͦͷٯ)ʯͱ͍͏Մೳੑ͕͋Δɾɾͱ͍͏Ӆṭ • ͕ɺ࣮ࡍͷॴݺͼख͕ʮͲ͕࣮ͬͪߦ͞ΕΔ͔ʯҙ ࣝ͠ͳͯ͘ྑ͍ 関連: リスコフの置換原則
- Wikipedia https://ja.wikipedia.org/wiki/リスコフの置換原則
ϝιουͷΧϓηϧԽ • alignShape()Shape::setLocation()Λ ࣮ߦ͍ͯ͠Δ͕ɺ࣮ࡍͷॲཧ Circle::setLocation()ʹͳ͍ͬͯΔ • ॏཁͳͷʮݺͼग़͠ଆ͕ɺͦͷϝιο υͷଘࡏͱ͍ํΛ͍ͬͯΔ͜ͱʯͰ ͋Γɺ͔ͦ͜ΒઌΦϒδΣΫτͷ ͱͳΔ
ܕͷΧϓηϧԽ • ݺͼग़͠ଆʹରͯ͠ɺϨγʔό(ݺͼग़͞Εͨଆ)͕ʮԿͷΫϥε ͷΦϒδΣΫτͳͷ͔ʯӅṭ͞ΕΔ • ΦϒδΣΫτXͳͷ͔ɺͦΕͱαϒΫϥεͷΦϒδΣΫτY ͳͷ͔ɾɾʁ • “ܕͷΧϓηϧԽɺϙϦϞʔϑΟζϜΛ༻͢ΔநΫϥεͱ ͦͷੜΫϥε(·ͨΠϯλʔϑΣʔεͱͦͷ࣮)ʹΑͬͯੜ
Έग़͞Ε·͢(P107)”
ܕͷΧϓηϧԽ • $shape͕Shapeͷੑ࣭Λ࣋ͭΦϒ δΣΫτ(is-a)Ͱ͋Δ͜ͱ͔ͬͯ ͍Δ͕ɺͦͷ࣮ମ͕ԿͰ͋Δ͔ʹͭ ͍ͯؔ৺͕ͳ͍(Կ͕དྷͯಈ͘) • Circle͔Εͳ͍͠ɺ Rectangle͔Εͳ͍ɾɾɾ •
͜ͷΑ͏ͳʮಉؔ͡ΘΓํʯͰ ʮঢ়گʹԠͯ͡ଟ༷ͳಈ͖ํΛ͢ Δʯͷ͕ϙϦϞʔϑΟζϜ
֓೦ͱͯ͠ͷܧঝvs࠶ར༻ͷͨΊͷܧঝ • ͔ͭͯܧঝʹ͍ͭͯड़ΒΕ͍ͯͨ͜ͱ • ίʔυͷ࠶ར༻(ΜͩҙຯͰͷDRYతͳ)ͷͨΊʹɺ ʮݩʑ͋ͬͨΫϥε͔Βɺಛఆͷঢ়گʹରԠ(ಛԽ)͘͢ ར༻Ͱ͖Δʯͱ͍͏ํ๏ • ΑΓ֓೦తͳΞϓϩʔνํ๏ͱͯ͠ѻ͏͜ͱͰɺརӹΛੜ Ή͜ͱ͕Ͱ͖Δͣ
• ͬͱʮࢹΛ͛ͯʯΦϒδΣΫτΧϓηϧԽɺܧ ঝΛѻ͏͜ͱͰɺ֦ுੑͷߴ͍ίʔυΛ࡞ΕΔ
࠶ར༻ͷͨΊͷܧঝͷ᠘ ʮޒ֯ܗΛಛԽ͠ɺಛघͳԑͷޒ֯ܗʯΛ࡞ͬͨྫɻ͜Ε࣍ͷΛΒΉ 1. ڽूੑͷԼ • ʮಛԽʯͤ͞Δࡍʹɺຊདྷͱҧ͏ྨͷࣄΛר͖ࠐΜͰ͠·͍ͬͯΔ (ʮԑΛѻ͏ʯͱ͍͏෦ɻShapeͰͳ͘PengtagonͷࣄͰ͍͍ͷʁ) 2. ࠶ར༻ੑͷԼ •
ʮಛघͳԑʯ͚ͩΛѻ͍ͨͯ͘ɺʮಛघͳԑͷޒ֯ܗʯʹʮޒ֯ܗʯ ػೳ͕༊ண͍ͯ͠ΔͷͰɺ֎͔Βར༻Ͱ͖ͳ͍ 3. มԽʹैͰ͖ͳ͍ • ཁٻͷมԽɾ૿େʹԠͯ͡ඞཁͳόϦΤʔγϣϯ͕૿͑ଓ͚Δͷͷɺʮಛ ԽʯͰରԠ͠Α͏ͱͨ͠߹ɺΫϥε͕૿͑·ͬͯ͘ݫ͘͠ͳΔ
֓೦ͱͯ͠ͷܧঝ • ”ಉ͡ৼΔ͍Λڞ༗͢Δͷʹண͠”ͬͯɺʮ࠶ར༻ͷͨ Ίͷܧঝʯͱҧ͏ͷ͔ʁ • (͜Εଟ8.5અΛݟͨ΄͏͕͔Γͦ͢͏ • ͬ͘͟Γ͍͏ͱ • ʮ۩ˠߋʹಛԽʯతͳͷ͕ʮ࠶ར༻ͷͨΊͷʙʯͱ͍͏
؍ • ʮҰൠੑɾࠎࢠʯʹணͯ͠ʮಉଐΛද֓͢೦Λྨ͢Δ (൚Խ͢Δ)ʯతͳͷ͕ʮ֓೦ͷͨΊͷʙʯͱ͍͏؍
ΧϓηϧԽʹର͢Δଊ͑ํͷϙΠϯτ • σʔλ͚ͩͰͳ͍ɺ͋ΒΏΔͷͷӅṭ͕ͦ͜ΧϓηϧԽ ͷೳྗ • GoF͕ΧϓηϧԽʹ͍ͭͯݴٴ͍ͯ͠Δࡍʹɺେମ͕ܕ ͷΧϓηϧԽͷ͜ͱ(ͱ͍͏͘Β͍ॏཁʂ) • ୯ͳΔʮ࣮ࡁΈͷίʔυͷ࠶ར༻ʯͷͨΊͰͳ͘ɺ ࢹΛ͛ͯʮܧঝͷҙຯʯΛଊ͍͑ͯ͘ͷ͕େࣄ
変わること、変わらないこと、差分 8.4 流動的要素を⾒つけ出し、それをカプセル化する 8.5 共通性/可変性分析と抽象クラス
͋ͳͨͷઃܭʹ͓͍ͯɺԿΛྲྀಈతཁૉͱ͢Δ͖͔Λߟͯ͠ ͍ͩ͘͞ɻ ͜ͷΞϓϩʔνɺ࠶ઃܭͷݪҼʹண͢Δͱ͍͏ͷͱਖ਼ରͱͳͬͯ ͍·͢ɻઃܭมߋΛڧ͍ΔՄೳੑͷ͋Δͷ͕Կ͔Λߟ͑ΔͷͰͳ͘ɺ࠶ ઃܭͤͣʹԿΛมߋՄೳʹ͢Δͷ͔Λߟ͑ΔͷͰ͢ɻ͜͜Ͱண͍ͯ͠Δͷ ɺྲྀಈత֓೦ͷΧϓηϧԽͰ͋Γɺଟ͘ͷσβΠϯύλʔϯͷςʔϚͱ ͳ͍ͬͯΔͷͰ͢ɻ 1 “
ͪΐͬͱدΓಓ: ݪஶͩͱ͜Μͳײ͡ • ʮͲͷΑ͏ʹύλʔϯΛબ͢Δ ͔ʯͱ͍͏จ຺Ͱग़ͯ͘Δ • ࠶ઃܭͷݪҼʹযΛߜΔ = ʮ֦ுੑɾมߋੑΛԼͤ͞ΔΑ ͏ͳઃܭΛ͍ͯ͠ͳ͍͔Λ୳Δʯ
• ٯͷΞϓϩʔν = ʮมߋ͕ൃੜ ͦ͠͏ͳՕॴΛ༧ݟ͠ɺ༧Ίઃܭ ʹ৫ΓࠐΜͰ͓͘ʯ オブジェクト指向における再利⽤のためのデザインパターン 改訂版 P41
ͪΐͬͱدΓಓ: ࠶ઃܭͷݪҼ ʮ࠶ઃܭΛ༨ّͳͤ͘͞ΔݪҼʯͱͯ͠8ͭͷΛྻڍ 1. Ϋϥε໊Λ໌നʹنఆͯ͠Φ ϒδΣΫτΛੜ͢Δ 2. ಛఆͷΦϖϨʔγϣϯͷґ ଘ 3.
ϋʔυΣΞιϑτΣΞ ϓϥοτϑΥʔϜͷґଘ 4. ΦϒδΣΫτͷදݱ͋Δ͍ ࣮ͷґଘ 5. ΞϧΰϦζϜͷґଘ 6. ີͳ݁߹ 7. αϒΫϥεԽʹΑΔػೳͷ֦ ு 8. ؆୯ͳΫϥεมߋ͕ෆՄೳͰ ͋Δ͜ͱ
͋ͳͨͷઃܭʹ͓͍ͯɺԿΛྲྀಈతཁૉͱ͢Δ͖͔Λߟͯ͠ ͍ͩ͘͞ɻ ͜ͷΞϓϩʔνɺ࠶ઃܭͷݪҼʹண͢Δͱ͍͏ͷͱਖ਼ରͱͳͬͯ ͍·͢ɻઃܭมߋΛڧ͍ΔՄೳੑͷ͋Δͷ͕Կ͔Λߟ͑ΔͷͰͳ͘ɺ࠶ ઃܭͤͣʹԿΛมߋՄೳʹ͢Δͷ͔Λߟ͑ΔͷͰ͢ɻ͜͜Ͱண͍ͯ͠Δͷ ɺྲྀಈత֓೦ͷΧϓηϧԽͰ͋Γɺଟ͘ͷσβΠϯύλʔϯͷςʔϚͱ ͳ͍ͬͯΔͷͰ͢ɻ 1 “ ཁΛૡ͍ఠΉͱɺ
ʮྲྀಈతཁૉΛݟ͚ͭग़͠ɺͦΕΛΧϓηϧԽ͢Δʯͷ͕ॏཁͱ͍͏͜ͱ
ྲྀಈੑ(มಈੑ)ͬͯԿʁ • ʮมΘΓͦ͏ͳ෦ʯͱ͍͏ͱܦ࣌తมԽͬΆ͍ʁ • ࣮ࡍʹɺೖΕସ͑ΔϞϊͰ͋Εಉ࣌ظʹଘࡏ͢ΔόϦΤʔγϣϯͰ ͋ΕʮྲྀಈੑʯͱΈͳ͢ • ྫ͑ɾɾɾ • ૿͑ͦ͏ͳͷݮΓͦ͏ͳͷ
• (ઌͷྫ)ਤܗͷछྨ͕૿͑ͨɺʮࣗసंʯʹʮϩʔυόΠΫʯ͕Ճ • มΘΓͦ͏ͳͷ • ΞϧΰϦζϜΛม͍͑ͨɺσʔλ͕૿͖͔͑ͯͨΒετϨʔδΛม ͍͑ͨɺAPI͕ഇࢭ͞Εͨ
ྲྀಈੑͱΧϓηϧԽ • ʮมԽ͠ʹ͍͘෦ʯͱʮྲྀಈతཁૉʯΛൃݟ͠ɺ ʮత(֓೦ɾந)ʯ͔ΒΓͯ͠ʮৄࡉ(࣮ɾ۩)ʯͱ۠ ผͰ͖Δͱ˕ • ྫ͑FacadeʮαϒγεςϜ(ৄࡉ)ͱ͍͏ྲྀಈੑʯΛΫϥΠ Ξϯτ(্ྲྀ)͔ΒӅṭ͢Δͷ ※ʮܕͷӅṭʹ͍ͭͯߟ͑Δ͜ͱͷҙٛʯΈ͍ͨͳͷɺ͜ͷઅͰ ཱͪࢭ·Βͣʹ࣍અ(ڞ௨ੑͱՄมੑ)Λཧղ͢Δํ͕ڞײͰ͖ͦ͏
ڞ௨ੑ/Մมੑ • ڞ௨ੑ/Մมੑੳ: ڞ௨ੑͱՄมੑΛੳʹΑͬͯൃݟ͢Δ • ྲྀಈతཁૉ => Մมੑ • ඇྲྀಈతཁૉ
=> ڞ௨ੑ • ڞ௨ੑΛ͍࣋ͬͯΔཁૉ: ϑΝϛϦ • ڞ௨ੑ(ϑΝϛϦ)֓೦্ͷ؍ΛɺՄมੑ(ϑΝϛϦߏһ) ্࣮ͷ؍ʹؔ࿈͢Δ
;Θ;Θͨ͠ྫ • ʮຯḩϥʔϝϯʯʮে༉ϥʔϝϯʯʮಲࠎϥʔϝϯʯʮਏ ຯḩϥʔϝϯʯʮւଽνϟʔγϡʔϥʔϝϯʯʮে༉ϥʔ ϝϯʯͱ͍ͬͨΦϒδΣΫτ͕ɺͱ͋ΔγεςϜͷ࣮ʹ ඞཁͩͬͨͱ͠·͢ • ͜ͷதͰɺʮօ͕͍࣋ͬͯΔͷʯʮօ͕͍࣋ͬͯΔ͕ ༰͕ҟͳΔͷʯΛߟ͑ΔͷͰ͢
;Θ;Θͨ͠ྫ • ͜ΕΒͷʮશͯʯʹؚ·ΕΔͷʁ • ໙Λ࣋ͭ • εʔϓΛ࣋ͭ • ثΛ࣋ͭ •
τοϐϯάΛ࣋ͭ • ඒຯ͍͠ • ͜ΕΒͷʮ͕ࠩ͋Δʯͷʁ • εʔϓ • τοϐϯά
;Θ;Θͨ͠ྫ • ڞ௨ੑʹணͯ͠ʮϑΝϛϦ: ϥʔϝϯʯ͕ߏ͞ΕΔ • ϥʔϝϯͱ͍͏֓೦͕ੜ·ΕΔ • ্ख͍͚͘ίϨͦͷ··ʮυϝΠϯʯʹͳΔ • ্ख͍͚͘ίϨͦͷ··ʮந(Ϋϥε)ʯʹͳΔ
• ʮεʔϓʯʮτοϐϯάʯɺʮϝϯόͱͳΔ͕༰͕ҟͳ ΔʯͷͰʮՄมύϥϝʔλʯͱݺΕΔ • ڞ௨ੑɺϑΝϛϦͷͯ͢ͷߏһʹରͯ͠ʮਅʯͱͳΔ • ͜͜ΛޡΔͱʮྑ͍நԽʯʹࢸΒͳ͍
;Θ;Θͨ͠ྫ • ໙ͷߗ͞ͱ͔ྔͱ͔ҧΘͶʁͬͯ͜ͱՄมੑʁ • ͦ͜Βล͕มΘͬͯে༉ϥʔϝϯে༉ϥʔϝϯͳײ͡ • Ramen::$menϝϯόʔʹMenΠϯελϯεΛ࣋ͨͤͪΌ͏ͳͲ • ͳ͓Ramenʹ໙ͷදݱΛʮ໙ͷྔʯͰ࣋ͨͤΔͱਏ͘ͳΔ •
ৼΔ͍͖ͷΦϒδΣΫτʹ͓͚ͯ͠ʮϥʔϝϯυϝΠϯʯʹର͠ ͯʮ໙αϒυϝΠϯʯͷࣝΛΓͤΔՄೳੑ • νϟʔγϡʔ໙͕ʮνϟʔγϡʔτοϐϯάͷে༉ϥʔϝϯʯ͔͔ΒΜ • ʮঢ়ଶʯͱͯ͠දݱ͢Δ͔ʮΦϒδΣΫτʯͱͯ͠දݱ͢Δ͔ઃܭ࣍ୈ • (ͦͦʮϥʔϝϯʯͰ୯Ұ(۩)ΫϥεͰࡁΉՄೳੑ͋Δ
;Θ;Θͨ͠ྫ • શͯͷϥʔϝϯͨͪʮϑΝϛϦߏһʯͱͳΔ • ʮಉ͡ϑΝϛϦʯͷதͰɺߏһΛݸผԽ͢ΔͷʮՄมੑͷதʯ • ʮεʔϓ(Մมύϥϝʔλ) = ຯḩʯͰʮ ຯḩϥʔϝϯʯΈ͍ͨͳ
• ՄมੑʹΑͬͯɺϑΝϛϦͷதͷͯ͢ͷߏһ͕දݱͰ͖Δ(ͯ͢ͷߏһΛ ཏ͢Δ)͔ʁ • ʮثʹ໙ͱεʔϓ͕ೖ͍ͬͯͯτοϐϯά͕͍ͬͯͯඒຯ͍͠ʯͱͨ͠Βɺ ϥʔϝϯͱݴ͑ΔʁϑΝϛϦΛఆٛ͢Δ(ͦͷϑΝϛϦͨΒ͠Ί͍ͯΔ)ͷʁ • ʮՄมੑͰઆ໌͕͔ͭͳ͍ߏһʯʮҰ෦ͷߏһͷͨΊ͚ͩͷՄมੑʯͳͲ • ِͰ͋Δ߹ɺޡͬͨؔ࿈͚(ྨʹಉ͡ϑΝϛϦͱΈͳ͢)͕ߦΘΕ͍ͯΔՄ ೳੑ͕͋Δ => ڽू
ͳͥʮ֓೦ʯతʹߟ͑͘͢ͳΔͷ͔ʁ • චऀͷओு • ैདྷతͳʮ໊ࢺͱಈࢺΛநग़͠ɺΦϒδΣΫτΛ࡞Δʯ ͱ͍͏Ξϓϩʔνʮਂ͍Ϋϥε֊͕࡞ΒΕͯ͠·͍ ͕ͪʯ • ڞ௨ੑ/Մมੑʹ͢Δͱʮڞ௨͢Δ֓೦ʹ͓͚Δྲྀಈ తཁૉʯ͕ݦΕ͘͢ͳΔ
ͳͥʮ֓೦ʯతʹߟ͑͘͢ͳΔͷ͔ʁ • Ͳ͜ʹมԽ͕͋Δͷ͔ʁ • CoplienͷΞϓϩʔνʮ࠷ॳʹυϝΠϯࣙॻΛ࡞Δʯ͜ͱ ͔ΒೖΔͷͰɺͦ͜ࣅ͍ͯΔͱݴ͑Δ • ͦͷޙʹʮڞ௨ੑɾՄมੑΛݟ͚ͭΔʯͱ͍͏ੳఔ͕ೖ Δ •
͜͜ͰநԽ = ֓೦্ͷ؍͔Βͷ࠶ཧ͕ߦΘΕΔ • ऄ: ੳͷࡍʹڞ௨ੑͱՄมੑʮಉ࣌ʹߟ͑Δʯͷ͕Φ εεϝ(by Coplien)
ͳͥʮ֓೦ʯతʹߟ͑͘͢ͳΔͷ͔ʁ • ʮഅΓɺӉધඈͿʯͱ͍͏ใ͔Β • ʮΓҠಈखஈΛ࣋ͭʯͱ͍͏நԽΛߦ͏ • ʮҠಈखஈΓʹΑΓҟͳΔʯͱ͍͏ࠩͷఆٛΛߦ͏ • walk/flyϝιουΛఆٛ͢ΔͷͰͳ͘ɺநϝιουmove͕ ൃ͞Εͦ͏
• ந-ଟ༷ͷੈք؍ʹΞϓϩʔν͍͢͠ • ʮ۩͕ݻ༗ͷೳྗΛ࣋ͭʯͷͰͳ͘ʮநͷՄมੑΛ࣋ ͭʯͱ͍͏؍
ʮྲྀಈੑʹண͢Δʯ͜ͱͷϙΠϯτ • Γ͍ͨ͜ͱʮมΘΓʹ͍͘෦ʯΛʮมΘΓ͍͢෦ ʯ͔Βอޢ͢Δ͜ͱ • มΘΓ͍͢ = όϦΤʔγϣϯ͕͋Δɺ͕࣌ؒܦͭͱΔ • Γ͓ͯ͘͜͠ͱͰɺʮ࠶ઃܭ͕ඞཁͳ͍ʯίʔυΛੜ
Έ͘͢ͳΔ • ʮྲྀಈੑ(Մมੑ)ʯΛʮಛԽʯͰɺʮ҆ఆͨ͠෦(ڞ௨ ੑ)ʯΛʮநʯ͍࣋ͬͯ͜͏ͱ͍͏ൃ • ৄࡉͳʮࠩʯΛࣺ૾ͯ͠ʮ֓೦ʯϨϕϧͰϞσϦϯά͢Δ
事前設計 vs 適応的な開発 8.6 アジャイル開発における品質
ΞδϟΠϧͱσβύλѱ͍ͷʁ • ͦΜͳίτͳ͍Αʂʂ • σβΠϯύλʔϯʮࣄલͷઃܭʯͱݺΕΔ͜ͱ͋Δ • ʮΧλϩά͔ΒબΜͰιϑτΣΞΛΈཱͯΔʯతͳ • ଞํͰΞδϟΠϧʮแׅతͳυΩϡϝϯτΑΓಈ͘ι ϑτΣΞΛʯ
• ʮࣄલͷઃܭΛߦΘͳ͍Α͏ʹઆ͘ͷʯͳͷ͔ʁ
ιϑτΣΞͷ࣭ • GoFʮ࠶ઃܭΛߦΘͳͯ͘ࡁΉΑ͏ʹʯɺΞδϟΠϧ ʮదԠతͳ։ൃΛଓ͚͍ͯ͘ʯ͜ͱͰɺιϑτΣΞͷՁ ΛߴΊΑ͏ͱ͢Δ • ྆ऀಉ༷ͷ࣭ΛٻΊ͍ͯΔ(ͱචऀؾ͘) • ͍ੑɺՄಡੑɺςετՄೳੑ •
※͜͜Ͱݴ͍ͬͯΔͷXP(ͷٕज़తϓϥΫςΟε)