会社で「オブジェクト指向のこころ」の読書会をやっています
第8章視野を広げる課題図書:オブジェクト指向のこころ: デザインパターンとともに学ぶ
View Slide
ԿͷࢹΛ͛ͯΔΜͩΖ͏Ͷʂʁ• ΦϒδΣΫτࢦ(ΧϓηϧԽ)ͷ3ͭͷجຊత֓೦• ΦϒδΣΫτɺΧϓηϧԽɺநΫϥε• ͜ΕΒ͕ʮͲ͏ͬͯʹཱ͍͔ͬͯ͘ͳʂʁҙٛਂͬͯ͞ͲΜͳͷʂʁʯ͔ͳʔ• ͪΐͬͱݪཧݪଇͷࢹ͔Βߟ͑ͯΈΑ͏͔ʂతͳ• σβύλɺΞδϟΠϧ։ൃͱ͍ͬͨͱͷܨ͕Γʹݴٴͯ͠ΈΔΑʂ
͜ͷষͷΩʔϫʔυ• ΦϒδΣΫτ• ΧϓηϧԽɾӅṭ• ܧঝɾಛघԽ• ࠶ར༻• ྲྀಈੑ• ڞ௨ੑ(ੳ)• Մมੑ(ੳ)• நɺ֓೦ɾ༷ɾ࣮
従来からの考え⽅と新たな考え⽅8.2 オブジェクト: 従来の考え⽅と新たな考え⽅8.3 カプセル化
「君たちのオブジェクト指向は間違っている(かも)」「君たちのカプセル化は間違っている(かも)」⾔いたいこと
ൺͯΈΑ͏ैདྷͷߟ͑ํޡղ৽ͨͳߟ͑ํຊ࣭ΦϒδΣΫτͱʁૢ࡞ΛͬͨσʔλσʔλͱৼΔ͍ ϝιου͕ͭʹͳͬͨͷʂΛඋ࣮͑ͨମΧϓηϧԽͱʁ σʔλΛӅṭ͢Δ͜ͱʂ͋ΒΏΔͷΛӅṭ͢Δσʔλɺϝιουɺܕ
それで何が変わるのか?(を⾒ていきます)
ʮैདྷతʯͳΦϒδΣΫτͷځ۶͞• ઃܭΛ͢Δ࣌ʹʮ֓೦ʯ͔ΒೖΔͱΓ͍͢Ͷʙ͕ͬͯ͋Γ·͢(͋Γ·ͨ͠Ͷʁ)• ͨͩɺʮσʔλʴૢ࡞(ৼΔ͍)ʯͱ͍͏ଊ͑ํ࣮ʹدΓ͗ͨ͢؍ͱ͍͏ؾ͕͢Δ• Ͳ͏͍͏σʔλ(ଐੑ)͕͋ͬͯɺͦΕΛͲ͏ѻ͏͔ʁΛ࠷ॳ͔ΒΒͳ͍ͱઃܭ͕ୡ͞Εͳ͍༁Ͱ• ͱͯʮ֓೦Ͱߟ͑Δ(நతʹΛ͢Δ)ʯͱݴ͑ͳ͍ʂ
※ ͪΐͬͱ͓ΒͤʮͰߟ͑ΔͱԿ͕ྑ͍Μ͚ͩͬʁʯʹ͍ͭͯ1ষΛ͓͞Β͍ͯ͠ΈͯͶʂ• 1.5 ཁٻͷมߋʹऔΓΉ• 1.6 ΦϒδΣΫτࢦύϥμΠϜ参考:オブジェクト指向のこころ: 第1章 / DESIGN PATTERNS EXPLAINED: chapter-1 - Speaker Deckhttps://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(ͷٕज़తϓϥΫςΟε)