Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
オブジェクト指向のこころ: 第8章 / DESIGN PATTERNS EXPLAINED: ...
Search
hideki kinjyo
PRO
September 30, 2021
Programming
130
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
オブジェクト指向のこころ: 第8章 / DESIGN PATTERNS EXPLAINED: chapter-8
会社で「オブジェクト指向のこころ」の読書会をやっています
hideki kinjyo
PRO
September 30, 2021
More Decks by hideki kinjyo
See All by hideki kinjyo
phperだってパンチカードでコーディングしたい
o0h
PRO
0
340
Symfonyが 簡単にAI agentになる
o0h
PRO
1
150
yield再入門 #phpcon
o0h
PRO
0
1.8k
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
460
Composerを使ったサプライチェーン攻撃の様子を眺めてみる #phpstudy
o0h
PRO
3
410
ソースコード→AST→オペコード、の旅を覗いてみる
o0h
PRO
1
380
PCOVから学ぶコードカバレッジ #phpcon_odawara
o0h
PRO
0
650
夢の無限スパゲッティ製造機 -実装篇- #phpstudy
o0h
PRO
0
300
夢の無限スパゲッティ製造機 #phperkaigi
o0h
PRO
0
1.1k
Other Decks in Programming
See All in Programming
When benchmarks go bad - what I learned from measuring performance wrong
hollycummins
0
220
Domain-Driven Transformation
hschwentner
2
2.3k
作れる、でも消せるか?──安全に「枯らして消す」機能削除術 / Drain, Then Delete
chobishiba
2
700
AmebaブログはKMPから卒業します
kmars0605
0
190
気持ちぃ〜角丸 Squircle
ryu1013
0
310
残高管理から台帳サービスへの進化
artoy
1
200
月間100万人のサービス刷新で、 技術選定をHonoに振り切った話
yutobara
8
6.6k
當我們開始不讀 Code - AI Agent 時代,Code Review 與 Clean Code 還剩下什麼?
jame2408
1
230
APNsからLive Activityを開始する話
yumnumm
0
170
FactoryBotをやめればRSpecは速くなるのか?
yuta_onishi_97
0
540
現場と育てるRailsモデリング 〜Spreadsheetから始めたモデル設計〜
siroemk
2
600
Atomic Design, Enforced: Scaling Mobile Design Systems (next.app devCon / droidCon Berlin 2026)
steliosf
PRO
0
170
Featured
See All Featured
Statistics for Hackers
jakevdp
799
230k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
Speed Design
sergeychernyshev
33
2.2k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
310
Building AI with AI
inesmontani
PRO
1
1.3k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.5k
30 Presentation Tips
portentint
PRO
1
430
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.9k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
20k
KATA
mclloyd
PRO
35
16k
Producing Creativity
orderedlist
PRO
348
41k
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(ͷٕज़తϓϥΫςΟε)