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
71
オブジェクト指向のこころ: 第8章 / DESIGN PATTERNS EXPLAINED: chapter-8
会社で「オブジェクト指向のこころ」の読書会をやっています
hideki kinjyo
PRO
September 30, 2021
Tweet
Share
More Decks by hideki kinjyo
See All by hideki kinjyo
色んなオートローダーを覗き見る #phpcon_okinawa
o0h
PRO
5
410
ヒューマンエラーの本を読んだ ~報告会~
o0h
PRO
3
220
みんなでワイワイ「テスト駆動開発」の話をやる会 #techramen24conf
o0h
PRO
3
400
SPLから始める「データ構造」入門
o0h
PRO
7
1.6k
PHPUnit11の新しい仲間たち
o0h
PRO
3
280
単体テストを書かない技術 #phpcon_odawara
o0h
PRO
60
19k
パンフ記事 「初めてのリファクタリング!」 の裏側 #phperkaigi
o0h
PRO
2
130
phpunit/php-code-coverageって何をしてるんだ #phperkaigi
o0h
PRO
3
1.1k
Composerを便利に使うために私がやっていること #phperkaigi
o0h
PRO
1
2.2k
Other Decks in Programming
See All in Programming
Modern Functional Fluent CFML REST by Luis Majano
ortus24
0
140
メルカリ ハロ アプリの技術スタック
atsumo
2
830
DjangoNinjaで高速なAPI開発を実現する
masaya00
0
530
Subclassing, Composition, Python, and You
hynek
3
180
データサイエンスのフルサイクル開発を実現する機械学習パイプライン
xcnkx
2
510
VS Code extension: ドラッグ&ドロップでファイルを並び替える
ttrace
0
170
Новый уровень ML-персонализации Lamoda: Как мы усилили ее в каталоге и перенесли на другие продукты
lamodatech
0
220
The Efficiency Paradox and How to Save Yourself and the World
hollycummins
0
190
モジュラモノリス、その前に / Modular monolith, before that
euglena1215
8
720
Micro Frontends for Java Microservices - dev2next 2024
mraible
PRO
0
210
実践Dash - 手を抜きながら本気で作るデータApplicationの基本と応用 / Dash for Python and Baseball
shinyorke
2
620
Cohesion in Modeling and Design
mploed
3
220
Featured
See All Featured
In The Pink: A Labor of Love
frogandcode
139
22k
ParisWeb 2013: Learning to Love: Crash Course in Emotional UX Design
dotmariusz
110
6.9k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
504
140k
Git: the NoSQL Database
bkeepers
PRO
425
64k
YesSQL, Process and Tooling at Scale
rocio
167
14k
Adopting Sorbet at Scale
ufuk
73
9k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
92
16k
For a Future-Friendly Web
brad_frost
174
9.3k
4 Signs Your Business is Dying
shpigford
180
21k
Web development in the modern age
philhawksworth
205
10k
Put a Button on it: Removing Barriers to Going Fast.
kastner
58
3.5k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
126
18k
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(ͷٕज़తϓϥΫςΟε)