ソフトウェアアーキテクチャ入門
by
Ogata Katsuya
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
2025-09-14 / ॳ৺ऀ͚νʔϜ։ൃϒʔτΩϟϯϓ #4 ٕज़ෛ࠴Λ࡞Βͳ͍ͨΊͷ ιϑτΣΞΞʔΩςΫνϟೖ Katsuya Ogata
Slide 2
Slide 2 text
ࣗݾհ • ໊લ: ॹํ ࠀ࠸ (͓͕ͨ ͔ͭ) • ॴଐ: େࡕେֶใֶݚڀՊ • झຯ: ొࢁ/ਭ/৯ࣄ • ࠷ۙϋϚͬͯΔ͜ͱ: ࣗαʔόʔ • X: @ogata_katsuya • ݸਓ: www.ogatakatsuya.com
Slide 3
Slide 3 text
ॳ৺ऀ͚νʔϜ։ൃϒʔτΩϟϯϓ #4
Slide 4
Slide 4 text
ຊߨ࠲ͷత AI࣌ʹ௨༻͢ΔΤϯδχΞϦϯάྗཆߨ࠲ • AI͕ίʔυΛϞϦϞϦॻ͍ͯ͘ΕΔ͔Βͦ͜ɺઃܭྗνʔϜ։ൃͷεΩϧ ͕ɺΑΓڧ͘ٻΊΒΕ͍ͯΔ • όΠϒίʔσΟϯάΛߦ͏͜ͱʹΑΓɺجૅతͳٕࣝज़Λ࣋ͨͳ͍·· ϓϩμΫτ։ൃΛߦͳ͍ͬͯ͘ͷةݥʂ • ΑΓAIΛຯํʹ͚ͭͯɺΑΓྑ͍ΤϯδχΞϦϯάΛ͍ͯͨ͘͠Ίͷߨ࠲
Slide 5
Slide 5 text
ॳ৺ऀ͚νʔϜ։ൃϒʔτΩϟϯϓ #4
Slide 6
Slide 6 text
ΞʔΩςΫνϟͱʁ ͳʹͦΕ͓͍͍͠ͷʁʁ🤤 • γεςϜશମͷࢥ • ॊೈʹมԽ͢ΔͷΛड͚ೖΕΔͨΊʹɺมԽͤ͞ͳ͍γεςϜͷࠎΈ • ཁ༷݅มΘ͍ͬͯ͘ͷͩͱఆ͢Δ • ͦͷ্ͰɺॊೈʹରԠͰ͖ΔΑ͏ͳΞʔΩςΫνϟΛબ͢Δ • ϓϩδΣΫτͷ్தͰΞʔΩςΫνϟΛ৽͢Δ͜ͱඇৗʹίετͱϦεΫ ͕ߴ͘ͳͬͯ͠·͏ • ϓϩδΣΫτͷॳظʹ৻ॏ͔ͭ൵؍తʹઃܭΛ͢Δ͜ͱ͕؊ཁ
Slide 7
Slide 7 text
ιϑτΣΞΞʔΩςΫνϟ ͳͥιϑτΣΞΞʔΩςΫνϟ͕ॏཁͳͷ͔ • AIਖ਼͘͠ಈ͍ͯ͘ΕΔίʔυΛੜ͢Δ͜ͱʹ͚͍ͯΔ • ͔͠͠ɺظతͳઢͰݟͨͱ͖ʹɺ࠷ྑͱݴ͑ͳ͍ • ৽͍͠ϝϯόʔ͕ίʔυΛཧղ͢Δͷʹ͕͔͔࣌ؒΔ • ػೳՃΛ͠Α͏ͱࢥͬͨΒมߋՕॴ͕େʹͳΔ • όά͕ൃੜ͍͢͠ίʔυʹͳͬͯ͠·͏ • ਓ͕ؒཧղͰ͖ͳ͍ίʔυʹͳͬͯ͠·͏
Slide 8
Slide 8 text
ιϑτΣΞΞʔΩςΫνϟ ͳͥιϑτΣΞΞʔΩςΫνϟ͕ॏཁͳͷ͔ • ΞʔΩςΫνϟɺAIʹʮͲΜͳܗͰίʔυΛॻ͔ͤΔ͔ʯͷʹͳͬͯ͘ ΕΔ • ςετΛॻ͖͘͢ͳΔ • Λదʹ͢Δ͜ͱͰۀ͕͘͢͠ͳΔ • ΞʔΩςΫνϟΛઃఆ͓ͯ͘͜͠ͱͰɺͦΕҎ߱ͷAIͷग़ྗ҆ఆͯ͘͠Δ
Slide 9
Slide 9 text
ຊߨٛͷείʔϓ • Δ͜ͱ • ྑ͍ίʔυΛॻͨ͘Ίͷٕज़ • อकੑɾ֦ுੑΛ࣋ͬͨιϑτΣΞΞʔΩςΫνϟ • Βͳ͍͜ͱ • ϚΠΫϩαʔϏε or ϞϊγϦοΫ • ΠϯϑϥͷབྷΉγεςϜઃܭ
Slide 10
Slide 10 text
͓ॻ͖ 1. ྑ͍ίʔυΛॻͨ͘Ίͷٕज़ 2. ϨΠϠʔυΞʔΩςΫνϟͷհ 3. ( ͕࣌ؒ͋Ε ) ࣮ફྫ 4. ίʔυ࣭ͱτϨʔυΦϑ 5. ·ͱΊ
Slide 11
Slide 11 text
1. ྑ͍ίʔυΛॻͨ͘Ίͷٕज़
Slide 12
Slide 12 text
Bad Code
Slide 13
Slide 13 text
Good Code
Slide 14
Slide 14 text
ωετΛਂ͘͠ͳ͍ Early returnͱcontinue/breakΛ׆༻͢Δ • ifจͷωετ͕ਂ͘ͳΔͷΛ͙ • 🙅 If A -> if B -> ॲཧ • 🙆 If !A return -> if !B return -> ॲཧ • forจதͷifจcontinue/breakΛ༻͍͙ͯ͢ൈ͚Δ
Slide 15
Slide 15 text
Bad Code
Slide 16
Slide 16 text
Good Code
Slide 17
Slide 17 text
σʔλͱॲཧ͍ۙॴʹஔ͘ ϏδωεϩδοΫσʔλΫϥεʹدͤΔ • σʔλΫϥεʹؔ࿈͢ΔϩδοΫಉ͡ॴʹஔ͘ • σόοΫ༷࣌มߋ࣌ʹՄಡੑɾมߋ༰қੑ্͕͢Δ • σʔλΫϥεͷॳظԽ࣌ʹෆਖ਼͕ೖΒͳ͍Α͏ʹݕূ͢Δ • ϩʔΧϧมΛΠϛϡʔλϒϧʹ͢Δ͜ͱͰ༧ظͤ͵্ॻ͖Λ͙ • PythonͰͰ͖ͳ͍͕ɺϝιουͷҾΠϛϡʔλϒϧʹ͢Δͱྑ͍
Slide 18
Slide 18 text
Bad Code
Slide 19
Slide 19 text
Good Code
Slide 20
Slide 20 text
σʔλܕΛ׆༻͢Δ ؔͷΓʹܕΛར༻͢Δ • ؔͷΓʹϓϦϛςΟϒܕ(bool, int, fl oat, double, string)͔͠༻͍ͳ͍ • ϓϦϛςΟϒܕࣥண • ΓͷΞϊςʔγϣϯʹσʔλܕΛ༻͍Δ͜ͱͰɺՄಡੑΛ্ͤ͞Δ • ΤϥʔͱҰॹʹ݁ՌΛฦ͢Resultܕͱ͍͏ͷଘࡏ͢Δ • TypeScript, Rust, Golang etc…
Slide 21
Slide 21 text
Bad Code
Slide 22
Slide 22 text
Good Code
Slide 23
Slide 23 text
Λదʹ͢Δ ୯Ұͷ๏ଇ / ؔ৺ͷ • ͳΜͰͰ͖ͪΌ͏Ϋϥε(ਆΫϥε)Λ࡞Βͳ͍ • ʹԠͯ͡దʹ͚ͯ͋͛Δ • ςετ͕Γ͘͢ͳΔ • ϦϑΝΫλϦϯά͕͘͢͠ͳΔ • ֤ίϯϙʔωϯτΛૄ݁߹ʹอͭ͜ͱ͕ॏཁ • SOLIDݪଇΛࢀর͢Δͱྑ͍
Slide 24
Slide 24 text
ΠϯλʔϑΣʔεͱϩδοΫΛ͢Δ ϩδοΫΛӅṭͯ͠ΠϯλʔϑΣʔε͚ͩΛެ։͢Δ • ϩδοΫ͕ີ݁߹ʹͳΒͳ͍ͨΊʹɺΠϯλʔϑΣʔεʹґଘͯ͠Β͏ • มߋ༰қੑ / Մಡੑ্͕͕Δ • νʔϜ։ൃ͕Γ͘͢ͳΔ • ܨ͗͜ΈͷࡍʹɺΠϯλʔϑΣʔε͚ͩΛҙࣝ͢Εྑ͍ • ࠓޙɺ͞ΒʹՃ͞ΕΔՄೳੑ͕͋Δͳͱ͍͏࣌ʹ͏ͱྑ͍ • ΠϯλʔϑΣʔεͷߟ͑ํΛ׆༻Ͱ͖ΔΑ͏ʹͳΔͱάοͱϨϕϧ্͕͕Δ
Slide 25
Slide 25 text
Bad Code
Slide 26
Slide 26 text
Good Code
Slide 27
Slide 27 text
Bad Code
Slide 28
Slide 28 text
Good Code
Slide 29
Slide 29 text
ͦͷଞͷٕज़ • Θ͔Γ໋໊͍͢Λ৺͕͚Δ • ϚδοΫφϯόʔΛආ͚Δ • దʹίϝϯτΛೖΕΔ • কདྷඞཁʹͳΔ͔ɻɻɻͱ͍͏ίʔυೖΕͳ͍ɺඞཁʹͳͬͨΒ࣮͢Δ • YAGNIݪଇ • ඞཁແ͘ͳͬͨίʔυ͙͢ʹফ͢ • ίʔυ͕ॏෳ͍ͯ͠ͳ͍͔Λ֬ೝ͢Δ • DRYݪଇ
Slide 30
Slide 30 text
2. ϨΠϠʔυΞʔΩςΫνϟͷհ
Slide 31
Slide 31 text
ϨΠϠʔυΞʔΩςΫνϟͱ ֤ͰΛׂɾӅṭ͢Δ ϨΠϠʔ ׂ ۩ମྫ Presentation ϢʔβʔΠϯλʔϑΣʔε HTTP ϦΫΤετͷॲཧ REST/GraphQL Webϖʔδ Application Ϣʔεέʔεͷ࣮ υϝΠϯɾΠϯϑϥΛར༻ͨ͠ॲཧϑϩʔ Usecase Domain ϏδωεϩδοΫ γεςϜͷ֩ͱͳΔ෦ UserΫϥε ProductΫϥε Infrustructure σʔλϕʔεΞΫηε ֎෦APIݺͼग़͠ Repository Infrustructure
Slide 32
Slide 32 text
දతͳϨΠϠʔυΞʔΩςΫνϟ • ΫϦʔϯΞʔΩςΫνϟ • ΦχΦϯΞʔΩςΫνϟ • ϔΩαΰφϧΞʔΩςΫνϟ • ໊લ͕ҧ͏͚ͩͰతಉ͡ • ؔ৺ͷ • ςετ͘͢͠ • υϝΠϯΛத৺ʹ • MVC (Model - View - Controller)
Slide 33
Slide 33 text
ॲཧͷྲྀΕ 1. Controller͕HTTPϦΫΤετΛड͚औͬͯదʹॲཧ͢Δ 2. Usecaseʹड͚औͬͨσʔλΛҾ͖͢ 3. UsecaseͰॲཧͷྲྀΕΛهड़͢Δ 1. UsecaseͰDomainϞσϧʹม͢Δ 2. ඞཁ͕͋ΕRepositoryΛར༻ͯ͠σʔλΛऔಘ͢Δ 4. ControllerͰHTTPϨεϙϯεܕʹมͯ͠ฦ͢
Slide 34
Slide 34 text
3. ࣮ફྫ
Slide 35
Slide 35 text
ϨΠϠʔυΞʔΩςΫνϟͷ࣮ફྫ ؆୯ͳUserͷCRUDૢ࡞Λ͢ΔAPI UserͷऔಘͱొͷΈΛѻ͏
Slide 36
Slide 36 text
DTOͷܕఆٛ
Slide 37
Slide 37 text
Controllerͷॲཧ
Slide 38
Slide 38 text
Usecaseͷॲཧ
Slide 39
Slide 39 text
Domainͷॲཧ
Slide 40
Slide 40 text
Repositoryͷॲཧ
Slide 41
Slide 41 text
(༨ஊ) ࣮ྫ https://clouddirect.jp.fujitsu.com/service/navi-words-osi_reference_model
Slide 42
Slide 42 text
(༨ஊ) ࣮ྫ • τϥϯεϙʔτ • TCP / UDPͱ͍ͬͨϓϩτίϧΛѻ͏ • ओʹɺ௨৴ͷ৴པੑΛ্ɾ୲อ͢ΔͨΊͷ • ωοτϫʔΫٕज़ͷҧ͍Λٵऩͯ͠ΞϓϦέʔγϣϯʹωοτϫʔΫͷ ΓޱΛݟͤͯ͋͛Δ • جຊతͳελϯεͱͯ͠ωοτϫʔΫΛ৴པ͍ͯ͠ͳ͍ • ͦͷͨΊʹɺ࠶ૹॲཧΛߦ͏
Slide 43
Slide 43 text
4. ίʔυ࣭ͱτϨʔυΦϑ
Slide 44
Slide 44 text
Α͠ɺ৽͍͠ ϓϩδΣΫτΛ্ཱͪ͛Δͧ💨
Slide 45
Slide 45 text
ͱΓ͋͑ͣ ϨΠϠʔυΞʔΩςΫνϟͰ࣮͢Δͧ💪
Slide 46
Slide 46 text
ϞϊγϦοΫͳίʔυશͯѱͩ👿
Slide 47
Slide 47 text
🙅
Slide 48
Slide 48 text
ΞʔΩςΫνϟͷબఆ ΞʔΩςΫνϟ͞·͟·ͳཁૉΛؑΈͯҙࢥܾఆΛߦ͏ https://speakerdeck.com/snoozer05/software-architecture-and-decision-making?slide=45
Slide 49
Slide 49 text
ΞʔΩςΫνϟͷҙࢥܾఆ ΞʔΩςΫνϟͷબఆ͞·͟·ͳཁૉΛؑΈܾͯఆ͢Δ • Ϗδωε • ͍ͭ·ͰʹϦϦʔε͍͔ͨ͠ • αʔϏεͷٻΊΔύϑΥʔϚϯεɾηΩϡϦςΟཁ݅ • ৫ • ͲΜͳεΩϧηοτͷਓ͕͍ͯɺͲΕ͘Β͍ͷਓͰ։ൃ͢Δ͔ • ٕज़ • ͲΜͳݴޠɾϑϨʔϜϫʔΫΛ༻͍ͯ։ൃΛߦ͏͔
Slide 50
Slide 50 text
ΞʔΩςΫνϟͷҙࢥܾఆ ΞʔΩςΫνϟͷબఆ͞·͟·ͳཁૉΛؑΈܾͯఆ͢Δ • ΞʔΩςΫνϟ͋͘·Ͱखஈ • తʹ߹ΘͤͯదͳબఆΛߦ͏͜ͱ͕ॏཁ • ͦΕͧΕͷΞʔΩςΫνϟͷϝϦοτɾσϝϦοτΛదʹཧղͯ͠ɺҙࢥܾ ఆΛߦ͏͜ͱ͕େ • ͍͘Βίʔυ͕៉ྷͰɺςετͷΧόϨοδ͕ߴͯ͘ϢʔβʔʹՁఏڙͰ ͖ͳ͚Εҙຯ͕ͳ͍
Slide 51
Slide 51 text
ٕज़తෛ࠴ͱͷ͖߹͍ํ ٕज़తෛ࠴ʹѱͰͳ͍ • ϏδωεϓϩδΣΫτਪਐ͢ΔͨΊͷٕज़తෛ࠴ͳΒ🙆 • Ϗδωε͕ޭ͢Εͦ͜ͰಘͨࢿۚͰෛ࠴Λฦ͍͚ͯ͠ྑ͍ • ԾʹϨΨγʔͳίʔυɺՁ؍ͷ߹Θͳ͍ίʔυͱग़ձ࣮ͬͯͨ͠ਓ ͷϦεϖΫτΛΕͳ͍ • Some Respect For Legacy Code
Slide 52
Slide 52 text
5. ·ͱΊ
Slide 53
Slide 53 text
·ͱΊ • AI࣌ͦ͜ɺιϑτΣΞΞʔΩςΫνϟͷઃܭྗ͕ॏཁ • ྑ͍ίʔυΛॻ͘͜ͱͰอकੑΛ্͛Δ͜ͱ͕Ͱ͖Δ • ྑ͍ίʔυΛॻٕ͘ज़Λదʹ͍ͬͯ͘͜ͱ͕ॏཁ • ༷ʑͳιϑτΣΞΞʔΩςΫνϟ͕ଘࡏ͢Δ • ͦΕͧΕͷੑ࣭ʹ߹Θͤͯదʹબɾ׆༻͢Δ͜ͱ͕ॏཁ • ίʔυ࣭ͱͦͷτϨʔυΦϑ͕ଘࡏ͢Δ͜ͱΛཧղͯ͠ӡ༻͍ͯ͘͠ඞཁ͕ ͋Δ
Slide 54
Slide 54 text
ࢀߟจݙ • ॻ੶ • ྑ͍ίʔυ/ѱ͍ίʔυͰֶͿઃܭೖ • Good Code, Bad Code • ʹऩ·Δίʔυͷॻ͖ํ • Σϒϖʔδ • ͜Ε͔ΒֶͿਓͷͨΊͷιϑτΣΞΞʔΩςΫνϟೖ • Software Architecture in an AI-Driven World • ιϑτΣΞΞʔΩςΫνϟݚमʲMIXI 25৽ଔٕज़ݚमʳ
Slide 55
Slide 55 text
Q&A