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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
hideki kinjyo
PRO
September 30, 2021
Programming
0
120
オブジェクト指向のこころ: 第8章 / DESIGN PATTERNS EXPLAINED: chapter-8
会社で「オブジェクト指向のこころ」の読書会をやっています
hideki kinjyo
PRO
September 30, 2021
Tweet
Share
More Decks by hideki kinjyo
See All by hideki kinjyo
#phperbiglt のLT
o0h
PRO
0
72
手軽に積ん読を増やすには?/読みたい本と付き合うには?
o0h
PRO
1
230
symfony/mcp-bundleで、既存アプリケーションもお手軽にMCPサーバー化
o0h
PRO
1
120
組織もソフトウェアも難しく考えない、もっとシンプルな考え方で設計する #phpconfuk
o0h
PRO
10
5.6k
Composerが「依存解決」のためにどんな工夫をしているか #phpcon
o0h
PRO
1
680
Composerの依存解決 #phpstudy
o0h
PRO
0
170
「影響が少ない」を自分の目でみてみる
o0h
PRO
4
2.4k
PHPによる"非"構造化プログラミング入門 -本当に熱いスパゲティコードを求めて- #phperkaigi
o0h
PRO
0
1.9k
もう少しテストを書きたいんじゃ〜 #phpstudy
o0h
PRO
23
5.4k
Other Decks in Programming
See All in Programming
OTP を自動で入力する裏技
megabitsenmzq
0
100
Windows on Ryzen and I
seosoft
0
280
CS教育のDX AIによる育成の効率化
niftycorp
PRO
0
110
Swift ConcurrencyでよりSwiftyに
yuukiw00w
0
260
2026年は Rust 置き換えが流行る! / 20260220-niigata-5min-tech
girigiribauer
0
230
Agentic AI: Evolution oder Revolution
mobilelarson
PRO
0
170
PostgreSQL を使った快適な go test 環境を求めて
otakakot
0
550
Vuetify 3 → 4 何が変わった?差分と移行ポイント10分まとめ
koukimiura
0
140
オブザーバビリティ駆動開発って実際どうなの?
yohfee
3
830
The Ralph Wiggum Loop: First Principles of Autonomous Development
sembayui
0
3.7k
AI Assistants for Your Angular Solutions
manfredsteyer
PRO
0
140
AI時代のソフトウェア開発でも「人が仕様を書く」から始めよう-医療IT現場での実践とこれから
koukimiura
0
150
Featured
See All Featured
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
140
Un-Boring Meetings
codingconduct
0
220
Writing Fast Ruby
sferik
630
63k
jQuery: Nuts, Bolts and Bling
dougneiner
65
8.4k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
52k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Statistics for Hackers
jakevdp
799
230k
Principles of Awesome APIs and How to Build Them.
keavy
128
17k
A better future with KSS
kneath
240
18k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
250
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
3.7k
Tell your own story through comics
letsgokoyo
1
840
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(ͷٕज़తϓϥΫςΟε)