会社で「オブジェクト指向のこころ」の読書会をやっています
ୈ25ষ σβΠϯύλʔϯͷ͓͞Β͍: ૯ׅͱࠓޙ՝ਤॻ: ΦϒδΣΫτࢦͷ͜͜Ζ: σβΠϯύλʔϯͱͱʹֶͿ
View Slide
ΦϒδΣΫτࢦݪଇͷαϚϦ
ΦϒδΣΫτͱɺదͳΛ͏ͷͰ͋Δ
ʁ• “λεΫΛ࣮ߦ͢Δٛɺ·ͨใΛ͍࣋ͬͯΔٛ”• ҎԼͷ3ͭͷओཁͳؚ߲͕·ΕΔ• ΦϒδΣΫτ͕ߦ͏ಈ࡞• ΦϒδΣΫτ͕࣋ͭࣝ• ΦϒδΣΫτ͕ଞʹӨڹΛ༩͑Δओཁͳஅ
ʁ• “Ϋϥε୯ҰͷతΛ࣋ͭͷͩͱߟ͑ͯΈΔͱɺΫϥε͕͢Δ͜ͱʢΫϥεͷΑΓ۩ମతͳʣɺ͓ͷͣͱͦͷతΛՌͨ͢ͷͱͳΓ·͢ɻ”• ΫϥεͷύϒϦοΫϝιουɺͷઆ໌ͱͯ͠ղऍͰ͖Δ• ύϒϦοΫΠϯλʔϑΣʔεɺΫϥεͷΛ໌֬ʹड़Δܖॻ
ΦϒδΣΫτͱɺదͳΛ͏ͷͰ͋ΔߨࢣେֶӃੜֶੜߨٛΛ͢ΔΑߨٛΛड͚ΔΑڭࣨΛҠಈ͢ΔΑׂ࣌ؒΞϯέʔτճऩ͢ΔΑߨٛͷ࣌ؒͱڭࣨΛࣔ͢Α
ΦϒδΣΫτɺࣗΒʹର͢ΔΛ༗͍ͯ͠Δ
Λ͏ͱɺΛ༗͢Δͱ͍͏͜ͱͰ͢• OOP/OODʮΦϒδΣΫτಉ͕࢜࿈ܞ͋ͬͯ͠ɺγεςϜΛ࡞Γ্͛Δʯͱ͍͏ൃ• ͋ΒΏΔΦϒδΣΫτʮଞऀ͔Βظ͞ΕΔ݁ՌΛ͞ͳ͍ͱ͍͚ͳ͍ʂʂʯͱ͍͏ͷ͕େલఏʹͳΔ• ʮѪΒ͍͠খಈΦϒδΣΫτʯΛཁٻͨ͠ͷʹɺʮΞϑϦΧκΑΓσΧ͍͔ΒՈʹೖΒͳ͍ͶʯͩͱγεςϜ͕ഁ͢Δ• ՝͞ΕͨΛՌͨ͢ɺͱ͍͏Λཁ͍ͯ͠Δ• 㲈త͕͋Δ͔Βͦ͜ɺΦϒδΣΫτ͕ੜΈग़͞Ε͍ͯΔ
ΦϒδΣΫτɺࣗΒʹର͢ΔΛ༗͍ͯ͠ΔߨࢣେֶӃੜߨٛΛ͢ΔΑΞϯέʔτճऩͨ͠Γͳͨ͘͠Γ͢ΔΑΞϯέʔτճऩ్தʹFYJU͢ΔΑ͜ΕͰࣄޙ݅Λຬͨͤͳ͍ʂ
ΧϓηϧԽͱɺ͋ΒΏΔछྨͷӅṭΛҙຯ͍ͯ͠Δ
ΧϓηϧԽ ͳʹɾͳΜͰ• ΧϓηϧԽʮ͋ΒΏΔͷͷӅṭ(P18)ʯ• “ΧϓηϧʢӳޠɾϑϥϯεޠɿCapsuleɺυΠπޠɿKapselʣͱɺʮখശʯΛҙຯ͢Δϥςϯޠͷ capsula ʹ༝དྷ͠ɺԿ͔Λ٧Ί͓ͯͨ͘Ίͷ༰ثͷ͜ͱΛද͢ɻ”https://ja.wikipedia.org/wiki/Χϓηϧ• ར༻ऀʹରͯ͠ɺʮ෦ΛӅ͢ʯʮެ։͢ΔใΛඞཁ࠷ݶͷͷʹݶఆ͢Δʯ• ΦϒδΣΫτࢦ͕Γ͍ͨ͜ͱ = ߴڽूɾૄ݁߹• ΧϓηϧԽʮૄ݁߹ʯΛՃͤ͞ΔͨΊͷ༗༻ͳखஈ
σʔλͷӅṭ• ʮσʔλΛӅṭ͢Δͷ͕େࣄʯͱ͍͏ΑΓɺʮৄࡉΛଞऀؒͰྲྀ௨ͤ͞ͳ͍ʯͷ͕ྑ͍ઃܭʹͭͳ͕Δɺͱ͍͏ײ֮ͷํ͕௫Έ͍͔͢ʁ• privateΛଚॏ͠·͠ΐ͏ɾɾʂ• ʮࡉ͔͘ΕΔʯ͜ͱʮࡉ͔͍ͬͯ͘Δʯʹܨ͕ͬͯɺ͢Δͱʮࡉ͔͍͜ͱʹΛ࣋ͭʯ͜ͱʹܨ͕Γ͔Ͷͳ͍• ٯʹʮࡉ͔͍͜ͱΒͳ͍ʯͩͱɺ͓ޓ͍ͷʮຊʹඞཁͳ͜ͱɺՌ͍ͨͨ͠తʯʹج͍ͮͨؔੑΛங͚Δ• Βͳ͍ํ͕ྑ͔ͬͨ͜ͱɺͨ͘͞Μ͋Γ·͢ΑͶɻઃܭಉ͡
࣮ͷӅṭ• ֤ΦϒδΣΫτͷಠཱੑΛकΓ·͠ΐ͏ʂʂతͳ• ʮ˓˓Λڭ͑ͯԼ͍͞ɺͨͩͦ͠ͷաఔ͋ͳͨʹҕͶ·͢ʯ• ࣮͕Ӆṭ͞Ε͍ͯͳ͍ͱʁ=> ΑΓʮखଓ͖ܕʯͬΆ͘ͳͬͨΓͦ͠͏• ͋Δ͖ؔ: ʮXͱݴͬͨΒYʹ͍ͭͯڭ͑ͯʯ• ා͍ؔ: ʮ(Yʹ͍ͭͯΓ͍͔ͨΒ)d->a->gg->daͯ͠ʯ
ΫϥεͷӅṭ• લఏͱͯ͠ʮతʹద͏ͳΒɺԿͷΦϒδΣΫτͰ͑͑ͰʯతͳελϯεͰ͍Δͱྑ͍ઃܭʹͳΓ͍͢• ͦ͜Ͱ• ʮతʯΛந/Ծ/ΠϯλʔϑΣΠεͰఆٛͯ͠ɺ• ࣮/۩ମ(۩)ʹ͍ͭͯʮΒͳ͍͠ɺ͓ͤʂʯͰࡁΉΑ͏ʹक͍ͬͯ͘
ઃܭͷӅṭ• (Facadeύλʔϯͱ͔ʹݟΒΕΔΑ͏ͳɺʮ۩ମతͳதʹ͍ͭͯӅͭͭ͠ɺར༻ऀ͕ఏڙͰ͖Δใ(Ҿɺinput)Λड͚औͬͯࣗͷࣝ(ͱҕৡ)ʹΑͬͯɺతʹ͔ͳ͏݁Ռ(output)Λฦ͢ʯΈ͍ͨͳΛࢦ͍ͯ͠Δ͔ͳʁͱࢥͬͨ)• օ͞ΜͲ͏ࢥ͍·ͨ͠ʁ
࣮ମԽͷӅṭ• ΦϒδΣΫτͷੜɺίϯετϥΫτʹ͍ͭͯʮతʹΒͳ͍͍ͯ͘ײ͡ʹ͢Δʯͱ͍ͬͨ• Factoryύλʔϯ• ͳͥʁ• ʮੜ͢Δʯͱ͍͏γʔϯʹ͓͍ͯɺ(ࣗڵຯͳ͍ͷʹ૬खͷ߹ʹै͏ͨΊʹʂʂ)ͱͯଟ͘ͷใΛඞཁͱ͢Δɺͱ͍͏͜ͱ͕ଟ͍• ͜Ε͕ෆཁͳ݁߹ΛͨΒ͢
ৼΔ͍σʔλʹଘࡏ͢Δྲྀಈతཁૉɺڞ௨ੑ/ՄมੑੳʹΑͬͯநԽ͢Δ
ڞ௨ੑɺՄมੑ• ڞ௨ੑ:ෳͷଘࡏʹஔ͍ͯීวతʹଘࡏ͢Δ(ৼΔ͍)• Մมੑ(ྲྀಈੑɺมಈੑ):ଞʹͳ͍ɺࠩҟ͕͋Δɺಠࣗੑͱͯ͠ଘࡏ͢Δ(ৼΔ͍)• ڞ௨ੑΛݟൈ͍ͯ(֓೦Ϩϕϧ)ɺͦΕΛநͱͯ͠ද͍ͯ͘͠(༷Ϩϕϧ)ɻʮڞ௨ੑʹऩ·Βͳ͍෦ʯΛ۩ͱ࣮ͯ͢͠Δ(࣮Ϩϕϧ)
ʮڞ௨ੑΛநʹʯͰͳ͔ͬͨΒԿ͕ʁ• ྫ͑ʮখ͍͞ϊʔτʯͱʮେ͖͍ϊʔτʯʮେখΛ݉ͶΔʯͷͰɺந/ܧঝؔʹ͍͔ͨ͠ʁ• ڞ௨͍ͯ͠Δͷʮϊʔτੑʯͷͣ• ʮࣈ࿅शாʯͱʮࣗ༝ாʯʁ• ʮݘʯʮೣʯʮΫδϥʯͷؔʁ• ੜ্ֶͷʮᄡೕྨʯ͕ɺఏڙ͢ΔγεςϜ෦ʹ͓͚Δʮతʯͷ؍͔Βʮҙຯͷ͋Δڞ௨ੑʯͳͷ͔ʁ• ʮݘʯʮೣʯʮΠϯίʯͷؔʁ• ʮѪ؝ಈʯʮ໐͘(ੜ)ʯͱ͍͏ڞ௨ੑ͕େࣄʁ• ʮࣂ͍ํʯʮ໐͖ํʯՄมੑʹͳΔ
େֶӃੜֶੜߨٛΛड͚ΔΑڭࣨΛҠಈ͢ΔΑΞϯέʔτճऩ͢ΔΑߨٛΛड͚ΔΑେֶӃੜֶੜͷόϦΤʔγϣϯ͔ʁ(ߨٛΛฉ͘༁Ͱͳ͍)TAͲ͏͢ΔʁߨٛΛࢹʹདྷ͓ͨҒ͍͞ΜͲ͏ʁ
ʮಉ͡తʹجͮ͘ཁૉʯͱ ଊ͑ΒΕͦ͏ʁେֶӃੜֶੜߨٛΛड͚ΔΑڭࣨΛҠಈ͢ΔΑΞϯέʔτճऩ͢ΔΑߨٛΛड͚ΔΑߨٛΛฉ͚ΔౕߨٛͷӡӦαϙʔτౕडߨ४උͰ͖Δౕڞ௨ੑͷநग़ʹͱͮ͘நԽ
ΠϯλʔϑΣΠεΛ༻͍࣮ͯ͢Δ
InterfaceΛඞͣ͏ʁ• ίίͰࢦ͍ͯ͠Δͷɺඞͣ͠ݴޠػೳ্ͷʮInterfaceʯͱ͍͏ҙຯͰͳ͍ɻͣɻ• ΠϯλʔϑΣΠε = ʮԿΛೖΕͨΒʯʮ(ԿΛͯ͠)ԿΛฦ͔͢ʯ• ݴ͍͑Δͱʮ͍ํʯʹΑͬͯʮԿ͕ಘΒΕΔ͔ʯ• ͜ΕʮతʯʮػೳʯʹԊͬͨநԽ• ͭ·Γɺʮ࣮ଶ(۩)͔ΒۃྗΕͯɺత(ϩʔϧ)ಉ࢜ͷܨ͕Γʹด͡ͳ͕ΒઃܭΛ͠·͠ΐ͏ʯ͘Β͍ͷ• ɾɾͱݸਓతʹࢥͬͨͷͰ͕͢ɺօ͞ΜͲ͏Ͱ͔͢ʁ
ܧঝɺطଘΦϒδΣΫτΛಛघԽ͢ΔͨΊͷͷͰͳ͘ɺྲྀಈతཁૉΛ֓೦Խ͢ΔͨΊͷखஈͱͯ͠ଊ͑Δ
େֶӃੜΞϯέʔτճऩ͢ΔΑߨٛΛड͚ΔΑطଘΦϒδΣΫτΛಛघԽ͢Δྫ5"ʮΦϒδΣΫτͷత()ͱؔͳ͍ϝιουʯΛ͍࣋ͬͯΔߨٛΛड͚Δ༁Ͱͳ͍ ͔ΒΦʔόʔϥΠυΑ
େֶӃੜΞϯέʔτճऩ͢ΔΑߨٛΛड͚ΔΑߨٛΛฉ͚ΔౕߨٛͷӡӦαϙʔτౕडߨ४උͰ͖ΔౕநʹΑͬͯྲྀಈతཁૉΛ֓೦Խ͢Δྫ5"Ξϯέʔτճऩ͢ΔΑ
ֶੜֶशͷͨΊʹߨٛΛड͚ΔΑߨٛΛฉ͚ΔౕநʹΑͬͯྲྀಈతཁૉΛ֓೦Խ͢ΔྫࢹϚϯධՁΛ͠ͳ͕ΒߨٛʹࢀՃ͢ΔΑཧ͢Δσʔλ• ߨࢣͷύϑΥʔϚϯε• डߨऀͷԠཧ͢Δσʔλ• ڭत༰• ࢼݧɺ॓ͷใ
͋ͱ7߲ڍ͕͍ͬͯΔΑ• Ϋϥεதʹଘࡏ͢Δྲྀಈతཁૉ͔Βɺҟ࣭ͳྲྀಈతཁૉΛΓग़͢• ݁߹Λ͘͢ΔΑ͏ΊΔ• ڽूΛߴ͘͢ΔΑ͏ΊΔ• ΦϒδΣΫτΛ༻͢ΔίʔυͱɺͦͷΦϒδΣΫτΛੜ͢ΔίʔυΛ͢Δ• OAOOϧʔϧΛݫक͢Δ• ҙਤʹΑΔϓϩάϥϛϯάͱҙਤΛ໌֬ʹද͢ωʔϛϯάϧʔϧΛ༻͍ͯɺίʔυͷՄಡੑ্ʹΊΔ• ίʔσΟϯάΛ։࢝͢ΔલʹɺίʔυͷςετՄೳੑΛߟྀ͢Δ
σβΠϯύλʔϯʹΑΔ ࣮ͷΧϓηϧԽํ๏
ར༻ऀ-࣮ߦऀͷؔ• ”ࠓ·Ͱհ͖ͯͨ͠σβΠϯύλʔϯͷ͍͔ͭ͘ɺΫϥΠΞϯτΦϒδΣΫτ͔Β࣮ͷৄࡉΛӅṭ͢Δͱ͍͏ಛΛ͍࣋ͬͯ·ͨ͠”νϟʔϋϯ͍ͩ͘͞ʂνϟʔϋϯ͋͛ΔΑʂྫྷౚ͔ങ͍ग़͠ख࡞Γ࣮ͷৄࡉʮ࣮ߦऀʯ͕ܾΊΔɻར༻ऀͷࢹքʹೖΕͤ͞ͳ͍ɺΓ͢
• ࣮ͷӅṭʹΑ֦ͬͯுΛ༰қʹ͢Δ• ྫ: Bridgeύλʔϯ• ࣮ͱந(ΠϯλʔϑΣΠε)ΛΓͯ͠ɺར༻ऀநʹ͚͔͚ͩ͠ΔΑ͏ʹ͢Δ• ࣮ͷछྨ͕૿͑ͯɺΫϥΠΞϯτӨڹΛड͚ͣʹ֦ுͰ͖ΔΑ͏ʹͳΔ࣮ͷӅṭʹΑΔ֦ுੑͷ୲อ
ڞ௨ੑ/Մมੑੳͱ σβΠϯύλʔϯ (25.4ʙ25.6)
ڞ௨ੑ/ՄมੑੳͱྖҬ• “͔͠͠࠷ॏཁͳ͜ͱɺڞ௨ੑ/ՄมੑੳΛ༻͍ͨڞ௨ੑͷચ͍ग़͠ʹΑͬͯɺྖҬʹଘࡏ͍ͯ͠ΔύλʔϯΛચ͍ग़͢ࡍͷख͕͔Γ͕ಘΒΕΔͱ͍͏͜ͱͳͷͰ͢ɻ”• ʮ࣮Ϩϕϧͷܗ͕ݟ͑Δʯ͜ͱΑΓɺʮྖҬͷܗΛϒϥογϡΞοϓͰ͖Δʯͷ͕ଚ͍ʂ• (֓೦Ϩϕϧͷ)நΛͲ͏͢Δʁ͕ܾ·ΕɺInterface/implementsAbstract/extendsͲ͏͢Δʁࣗͣͱಋ͔ΕΔΑͶʙʂͱ͍͏ҼՌؔʹͦ͜Λ͚Δ
ڞ௨ੑ/Մมੑੳͱύλʔϯ• σβΠϯύλʔϯɺʮΑ͋͘Γ͕ͪͳXʯʹରͯ͠ʮ͍͍ײ͡ʹϋϚΓ͍͢ܗࣜʯͱ͍͏දݱํ๏ΛఆࣜԽͨ͠ͷɾɾͱݴ͑Δ• Α͋͘Γ͕ͪͳ = ڞ௨ੑ• ʮ࣮ͷܗʯΑΓʮͲ͏͍͏෩ʹͷલͷΛೝࣝ͢Δ͔ʯͷखॿ͚ʹͳΔʂ• strategyͬΆ͍ɺfacadeͬΆ͍ɺfactoryͬΆ͍etc…• ʮ˓˓͕ͬͯ͋ΔͷΛ͍ͬͯΔʯ͜ͱͷՁ
ύλʔϯͷؔ࿈
ύλʔϯॏཁͳͷͰͳ͘ͳΔ• ΞϨάβϯμʔʮੜ͖ੜ͖ͱͨ͠ݐઃʯΛࢦͨ͠ਓ• ͨͱ͑ʮݟͨͷඒ͠͞ίϯηϓτ͚ͩΛॏࢹͨ͠ɺډ৺͕ѱ͍ਤॻؗʯͱ͔͕ݏʙͬͯਓɻʮຊΛಡΉਓͷࣗવͱཉ͢Δͷ͕݉ͶඋΘ͍ͬͯΔݐઃʯ͕͍͍ΑͶʂͬͯ• ύλʔϯϥϯήʔδɺͦ͏ͨ͠ʮΑ͘ٻΊΒΕΔͷʯʮͦͷޮՌɺํ๏ʯΛ·ͱΊͨͷ• ͳͷͰɺʮ͠ύλʔϯࣗମΛΒͳͯ͘ɺཉ͍͠ͱ࣮ݱํ๏͕ࣗવͱ༙͖ग़ͯ͘Δʯ͜ͱʹൺͯʮύλʔϯΛ͍ͬͯΔʯ͜ͱͷॏཁੑԼ͢Δ
ίϯςΩετ͕ઌɺύλʔϯ͕ޙ(Έ͍ͨͳ)• ”ݱ࣮Λͦͷ··ड͚ೖΕΔ͜ͱΛֶΜͰ͠·͑ɺύλʔϯͦͷͷॏཁͰͳ͍”• ”࢝ΊతͳڌΓॴͰ͋ͬͨΞϧίʔϓͱ͍͏ύλʔϯ͕ɺඞཁͰͳ͘ͳΔɻ(தུ)ᴷ୯ʹͦΕ͕;͞Θ͍͠ͱ͍͏ཧ༝ͰᴷΞϧίʔϒΛ࡞Δ͜ͱʹͳΔ”• ࣝͱͯ͠ύλʔϯΛʹ͚ͭΔ͜ͱͰίϯςΩετΛࣝผ͘͢͠ͳΔ͔Εͳ͍͕ɺύλʔϯ͕ಛఆͷίϯςΩετΛ༠ൃ͢ΔͷͰͳ͍
·ͱΊతͳͷ• ΦϒδΣΫτࢦݪଇ• (͍ҙຯͰͷ)ΧϓηϧԽΛେࣄʹͯ͠ʂ• ߴڽूͱૄ݁߹Λࢦͯ͠ʂ• ڞ௨ੑΛநग़ͯ͠நΛ࡞ͬͯɺநΛཔΓʹͨ͠ઃܭΛͯ͠ʂ• σβΠϯύλʔϯ• ΦϒδΣΫτࢦݪଇΛ׆͔͠·ͬͨ͘ྑ͍ײ͡ͷϨγϐूͰ͋ΔΑʂ• ύλʔϯΛͬͯɺਂΊΔ͜ͱͰྖҬͷΞϓϩʔνڧ͘ͳΕΔʂ• ύλʔϯͦͷͷΛΔ͜ͱͰͳ͍ΑɺʮΛݟۃΊΒΕΔΑ͏ʹͳΔʯʮͦͷରԠ๏ͱɺͦΕʹΑΔӨڹʯΛ௫ΊΔΑ͏ʹͳΔͷ͕େࣄʂ• ྑ͍ઃܭʹΑͬͯɺมߋʹڧ͍γεςϜΛߏங͍ͯ͘͠ʂ