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
87
オブジェクト指向のこころ: 第8章 / DESIGN PATTERNS EXPLAINED: chapter-8
会社で「オブジェクト指向のこころ」の読書会をやっています
hideki kinjyo
PRO
September 30, 2021
Tweet
Share
More Decks by hideki kinjyo
See All by hideki kinjyo
もう少しテストを書きたいんじゃ〜 #phpstudy
o0h
PRO
16
3.5k
『テスト書いた方が開発が早いじゃん』を解き明かす #phpcon_nagoya
o0h
PRO
8
2.3k
色んなオートローダーを覗き見る #phpcon_okinawa
o0h
PRO
5
560
ヒューマンエラーの本を読んだ ~報告会~
o0h
PRO
3
290
みんなでワイワイ「テスト駆動開発」の話をやる会 #techramen24conf
o0h
PRO
4
560
SPLから始める「データ構造」入門
o0h
PRO
7
1.9k
PHPUnit11の新しい仲間たち
o0h
PRO
3
420
単体テストを書かない技術 #phpcon_odawara
o0h
PRO
62
21k
パンフ記事 「初めてのリファクタリング!」 の裏側 #phperkaigi
o0h
PRO
2
170
Other Decks in Programming
See All in Programming
Formの複雑さに立ち向かう
bmthd
1
920
パスキーのすべて ── 導入・UX設計・実装の紹介 / 20250213 パスキー開発者の集い
kuralab
3
880
メンテが命: PHPフレームワークのコンテナ化とアップグレード戦略
shunta27
0
300
CDK開発におけるコーディング規約の運用
yamanashi_ren01
2
240
Code smarter, not harder - How AI Coding Tools Boost Your Productivity | Angular Meetup Berlin
danielsogl
0
100
第3回関東Kaggler会_AtCoderはKaggleの役に立つ
chettub
3
1.1k
Rubyで始める関数型ドメインモデリング
shogo_tksk
0
140
Serverless Rust: Your Low-Risk Entry Point to Rust in Production (and the benefits are huge)
lmammino
1
150
Grafana Loki によるサーバログのコスト削減
mot_techtalk
1
140
新宿駅構内を三人称視点で探索してみる
satoshi7190
2
120
CI改善もDatadogとともに
taumu
0
190
データベースのオペレーターであるCloudNativePGがStatefulSetを使わない理由に迫る
nnaka2992
0
230
Featured
See All Featured
Product Roadmaps are Hard
iamctodd
PRO
50
11k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
30
2.2k
Building Flexible Design Systems
yeseniaperezcruz
328
38k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
46
2.3k
Thoughts on Productivity
jonyablonski
69
4.5k
Building a Scalable Design System with Sketch
lauravandoore
461
33k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
160
15k
Fashionably flexible responsive web design (full day workshop)
malarkey
406
66k
Navigating Team Friction
lara
183
15k
KATA
mclloyd
29
14k
Being A Developer After 40
akosma
89
590k
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(ͷٕज़తϓϥΫςΟε)