Upgrade to Pro — share decks privately, control downloads, hide ads and more …

なぜ技術がないと 面白いゲームが創れないのか?

なぜ技術がないと 面白いゲームが創れないのか?

「現場のエンジニアが語る『Fate/Grand Order』の開発技術からアップデートに関するノウハウまで一挙公開 Presented by GMOアプリクラウド」の講演資料です。

Yuki Tamura

July 10, 2017
Tweet

More Decks by Yuki Tamura

Other Decks in Technology

Transcript

  1. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    %&-J()5803,4*OD
    ͳٕͥज़͕ͳ͍ͱ

    ໘ന͍ήʔϜ͕૑Εͳ͍ͷ͔ʁ
    1SFTFOUFECZ(.0ΞϓϦΫϥ΢υ

    View Slide

  2. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ࣗݾ঺հɿాଜ༞थ
    ΤετϙϦε఻ه
    ͱ͍͏ήʔϜʹಌΕͯ
    ήʔϜۀքʹೖΓ·ͨ͠

    View Slide

  3. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ஫ɿ͓࿩͢Δͷ͸
    ໘ന͍ήʔϜͷ
    ૑ΓํͰ͸͋Γ·ͤΜ

    View Slide

  4. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ήʔϜ։ൃ
    ָ͠ΜͰ·͔͢ʁ

    View Slide

  5. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ήʔϜ։ൃ͸
    ະિ༗ͷةػʹ௚໘͍ͯ͠·͢

    View Slide

  6. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ։ൃظؒɿ̍೥ʙ̏೥
    ։ൃ༧ࢉɿ਺ԯʙ਺ेԯ
    ։ൃن໛ɿ਺ेਓʙඦਓ

    View Slide

  7. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ήʔϜ։ൃʹσεϚʔν
    ͦΜͳ࿩΋Α͘ฉ͖·͢

    View Slide

  8. ήʔϜۀք
    ࢒ࠅ෺ޠ

    View Slide

  9. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ྫ͑͹

    View Slide

  10. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ̎೥͔͚ͨ
    ׬੒ؒۙͷλΠτϧ
    ϓϩδΣΫτதࢭ

    View Slide

  11. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ൃച͚ͨ͠ΕͲ
    όά͕ଟ͗ͯ͢
    ϨϏϡʔ͕ࢄʑ

    View Slide

  12. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    Α͏΍͘׬੒
    ൃചޙϨϏϡʔΛΈΔͱ
    Ͳ͏΍ΒϢʔβʔ͞Μ͕
    ๬Μͩ΋ͷͰ͸ͳ͔ͬͨʜʜ

    View Slide

  13. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ࢮࢡྦྷʑ
    ͱ͍͏͜ͱ͸
    ௝͍͠࿩Ͱ͸͋Γ·ͤΜ

    View Slide

  14. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    Կނ͔ʁ

    View Slide

  15. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    Ϣʔβʔࢹ఺ͷܽ೗
    ࢼߦࡨޡͷෆ଍

    View Slide

  16. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    Ϣʔβʔࢹ఺ͷܽ೗
    ࣦഊͷଟ͘͸ɺ
    Ϣʔβʔ͕๬ΜͰ͍ͳ͍΋ͷΛ
    ఏڙ͍ͯ͠Δ
    ʮ։ൃऀ͕૑Γ͍ͨήʔϜΛ૑Δʯ
    ʮଘࡏ͠ͳ͍૝ఆϢʔβʔʯ

    View Slide

  17. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ࢼߦࡨޡͷෆ଍
    ࢓༷ॻʹ͸໘ന͘͢Δ࢓༷͸ॻ͍ͯͳ͍
    ʮ͍ͭ͜͸࠷ߴʹ໘ന͍ͧʂʯ
    ͱ͍͏࢓༷ॻΛॻ͍ͯ͘ΕΔ
    ήʔϜσβΠφʔ͸ଘࡏ͠ͳ͍
    Αͬͯɺࢼߦࡨޡ͕ඞਢͱͳΔ

    View Slide

  18. ٕज़Ͱ
    ͦ͜ʹͲ͏
    ཱͪ޲͔͏ͷ͔

    View Slide

  19. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ٕज़͕ͳ͚Ε͹
    ໘ന͍ήʔϜ͕૑Εͳ͍ʁ

    View Slide

  20. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    Ͱ͸ɺٕज़͕͋Ε͹
    ໘ന͍ήʔϜ͕
    ૑ΕΔͷͰ͠ΐ͏͔ʁ

    View Slide

  21. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE

    View Slide

  22. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ෳࡶͳٕज़
    ߴ౓ͳٕज़
    ৽͍ٕ͠ज़
    ͦΕ͸໘ന͞ͱ௚݁͠·ͤΜ

    View Slide

  23. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ͳΒɺ
    ٕज़͸ඞཁͳ͍ͷͰ͠ΐ͏͔ʁ

    View Slide

  24. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE

    View Slide

  25. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ˓˓ͱ͍͏
    ΞΠσΟΞ͕
    ͋ΔΜ͚ͩͲʜʜ

    View Slide

  26. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    無理
    いままでやったことないし……
    重すぎるし……
    時間ないし……
    前例ないし……
    ざわざわ……
    ざわざわ……
    ざわざわ……

    View Slide

  27. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ͜͏ͳΔͱ
    ΞΠσΟΞ͸
    ࣺͯΒΕͯ͠·͍·͢

    View Slide

  28. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ʮࣦഊΛڪΕɺϦεΫΛͱΒͳ͍ʯ
    ͜ΕΛଓ͚Δͱ
    ήʔϜ͕ࢮʹ·͢

    View Slide

  29. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ͱ͸͍͑ɺ
    ແܭըʹ
    ૿ங͍ͯ͘͠ͱʜʜ

    View Slide

  30. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    جຊγεςϜ
    ότϧ̖
    ότϧ̗
    ότϧ̘
    ·ΔͰ่Ε͔͚ͷδΣϯΨʜʜ
    ότϧ%
    ότϧ&
    ௥ՃγεςϜ
    ότϧ

    View Slide

  31. ඞཁͳٕज़ͱ͸ʁ

    View Slide

  32. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    มԽʹରԠ͍ͯ͘͠ྗ

    View Slide

  33. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ήʔϜ͸

    ΍Γ͍ͨ͜ͱʹ
    ݶք͕ͳ͍

    View Slide

  34. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ͋Ε΋΍Γ͍ͨ
    ͜Ε΋΍Γ͍ͨ
    ͜Μͳ͜ͱ͕Ͱ͖ͨΒʜʜ

    View Slide

  35. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    มԽʹڧ͍ઃܭΛ͢Δ

    View Slide

  36. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ։ൃத΋
    ͦͯ͠
    ϦϦʔεޙ΋

    View Slide

  37. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ࢼߦࡨޡΛॏͶΔͨΊͷ
    ٕज़ྗ

    View Slide

  38. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ࣦഊΛڪΕͣɺ
    ϦεΫΛͱΓɺ
    ͦΕΛΧόʔͰ͖Δྗ

    View Slide

  39. มԽʹߋ৽ͱ͸ʁ

    View Slide

  40. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ੲͷίϯιʔϧήʔϜͰ͸
    ʮ׬੒ͤ͞Ε͹ऴΘΓʯ
    ͱ͍͏ߟ͕͑͋Γ·ͨ͠

    View Slide

  41. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ͔͠͠ɺ
    ࠓຆͲͷήʔϜ͸
    Ξοϓσʔτͱ͍͏
    ֓೦͕͋Γ·͢

    View Slide

  42. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ̍೥ޙɺ̎೥ޙɺ̏೥ޙ
    ήʔϜ͕
    Ͳ͏ͳ͍ͬͯΔ͔͸
    ୭ʹ΋Θ͔Βͳ͍ͷͰ͢

    View Slide

  43. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ͳͷͰɺ
    ʮมԽΛલఏͱͨ͠ઃܭʯ
    ͕ඞਢʹͳΓ·͢

    View Slide

  44. ྑ͍ઃܭͱ͸ʁ

    View Slide

  45. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ήʔϜΛ໘ന͍ͨ͘͠ͱ͖ʹ
    अຐʹͳΒͣ
    ΑΓ໘ന͘Ͱ͖Δ
    ॊೈͳߏ଄ʹ͓ͯ͘͜͠ͱ

    View Slide

  46. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ήʔϜ։ൃͰඞͣى͜Δ
    ϑΟʔνϟʔɾΫϦʔϓ
    ͱ
    ࢓༷มߋ

    View Slide

  47. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ϑΟʔνϟʔɾΫϦʔϓͱ͸
    ػೳͷ௥Ճ͕Կ౓΋ߦΘΕ
    ͦͷ݁ՌɺෳࡶͰ
    ࢖͍ͮΒ͍΋ͷʹͳΔ͜ͱ

    View Slide

  48. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ήʔϜ͸৮ͬͯΈͳ͚Ε͹
    ༡ΜͰΈͳ͚Ε͹
    ໘ന͍͔Ͳ͏͔Θ͔Βͳ͍

    View Slide

  49. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ଈͪ
    มߋ͸ආ͚Δ͜ͱ͕Ͱ͖ͳ͍
    ʮ࠷ॳʹશ෦ܾΊͯԼ͍͞ʯ͸
    ήʔϜͰ͸Ͱ͖ͳ͍

    View Slide

  50. Ͳ͏ର߅͢Δ͔

    View Slide

  51. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ̑ͭͷॏཁͳࢦ਑ͱͳΔݪଇ

    View Slide

  52. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ͨͩ͠
    ݪଇओٛऀʹ
    ͳͬͯ͸͍͚ͳ͍͜ͱʹ
    ஫ҙ

    View Slide

  53. ୯Ұ੹೚ͷݪଇ
    ̍

    View Slide

  54. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ΫϥεΛมߋ͢Δཧ༝͸
    ̍ͭҎ্ଘࡏͯ͠͸ͳΒͳ͍ɻ
    ୯Ұ੹೚ͷݪଇ
    5IF4JOHMF3FTQPOTJCJMJUZ1SJODJQMF431

    View Slide

  55. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ໾ׂʢ੹೚ʣʹมߋཧ༝
    ଈͪ
    ΫϥεΛมߋ͢Δཧ༝͸
    ҰͭͰͳ͚Ε͹ͳΒͳ͍

    View Slide

  56. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ҰͭͷΫϥεʗϞδϡʔϧ͸
    Ұͭͷ੹೚͔͠
    ࣋ͬͯ͸ͳΒͳ͍

    View Slide

  57. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    class Programmer {
    // ԿͰ΋΍ΔϓϩάϥϚʔΫϥε
    public String Programming(); // ϓϩάϥϜΛ͢Δ
    public Document writeSpecification(); // ࢓༷ॻΛॻ͘
    public GanttChart getNewestProgressAll(); // શମਐḿ
    }
    ͜ͷྫͰ͸ɺϓϩάϥϚʹ͋·Γʹ΋ଟ͘ͷ੹೚Λ
    ෛΘ͍ͤͯ·͢ɻ
    ਐḿͷ΍Γํ͕มΘΕ͹͜ͷΫϥεΛมߋɺ
    ࢓༷ॻͷܗ͕ࣜมΘΕ͹͜ͷΫϥεΛมߋɺ
    Կ͔͋Δ౓ʹ͜ͷΫϥεΛ৮ΔӋ໨ʹͳΓ·͢ɻ

    View Slide

  58. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    class Programmer {
    public String Programming(); // ϓϩάϥϜΛ͢Δ
    }
    class GameDesigner {
    public Document writeSpecification(); // ࢓༷ॻΛॻ͘
    }
    class ProjectManager {
    public GanttChart getNewestProgressAll(); // શମਐḿ
    }
    ໾ׂΛม͑ͯ͋͛Δ͜ͱͰɺγϯϓϧʹͳΓ·͢ɻ
    ͨͩ͠ɺצҧ͍͠΍͍͢ͷͰ͕͢ɺ
    ҰͭͷΫϥε͸Ұͭͷػೳɺͱ͍͏ҙຯͰ͸͋Γ·ͤΜɻ

    View Slide

  59. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE

    View Slide

  60. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    Rectangle
    +Draw()
    +Area()
    Computational
    Geometry
    Application
    ジオメトリアプリ
    計算させようとする
    Graphical
    Application
    描画させようとする
    グラフィックアプリ
    GUI
    責任が二つ!!!
    ࢀߟɿϩόʔτɾ$ɾϚʔνϯʢʣʮΞδϟΠϧιϑτ΢ΣΞ։ൃͷԞٛʯ4#ΫϦΤΠςΟϒ

    View Slide

  61. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    Rectangle
    +Draw()
    Computational
    Geometry
    Application
    ジオメトリアプリ
    Graphical
    Application
    グラフィックアプリ
    GUI
    Geometric
    Rectangle
    +Area()
    責任を分解
    ࢀߟɿϩόʔτɾ$ɾϚʔνϯʢʣʮΞδϟΠϧιϑτ΢ΣΞ։ൃͷԞٛʯ4#ΫϦΤΠςΟϒ
    責任は一つ!

    View Slide

  62. ΦʔϓϯɾΫϩʔζυͷݪଇ
    ̎

    View Slide

  63. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ιϑτ΢ΣΞͷߏ੒ཁૉ
    ʢΫϥεɺϞδϡʔϧɺؔ਺ͳͲʣ͸

    ֦ுʹରͯ͠։͍͍ͯͯɺ
    मਖ਼ʹରͯ͠
    ด͍ͯ͡ͳ͚Ε͹ͳΒͳ͍ɻ
    ΦʔϓϯɾΫϩʔζυͷݪଇ

    5IF0QFO$MPTFE1SJODJQMF0$1

    View Slide

  64. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ֦ுʹରͯ͠։͔Ε͍ͯΔ
    ʹ࢓༷มߋʹڧ͍
    ༷ʑͳΞΠσΟΞʹରԠͰ͖Δ

    View Slide

  65. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    मਖ਼ʹରͯ͠ด͍ͯ͡Δ
    ʹΤϯόά͠ʹ͍͘
    Ұ෦௚ͨ͠ΒશମʹӨڹ͢Δ
    ͱ͍͏ͷ͸ઈରʹආ͚Δ

    View Slide

  66. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    10:00ग़ࣾ
    12:00MTG
    13:00ϥϯν
    19:00ؼ୐
    ྫͱͯ͠ͷ͋Δ̍೔ɿ

    ͜͏ͨ͠ߏ଄ʢྲྀΕʣͰ͋Ε͹ɺ
    ॱংΛ͍Ε͔͑ͨΓɺ
    ׂΓࠐΈΛ͢Δ͜ͱ͕Ͱ͖Δɻ
    ݸʑ͕ૄ݁߹ͱݴ͑Δɻ
    15:00MTG
    17:00ษڧձ

    View Slide

  67. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    10:00 ग़ࣾ
    10:30 A͞ΜͱMTG
    11:00 A͞ΜMTG౿·͑ͯB͞ΜͱMTG
    12:00 B͞ΜMTG౿·͑ͯεέδϡʔϧMTG
    13:00 εέδϡʔϧMTG౿·͑ͯλεΫMTG
    14:00 λεΫMTG౿·͑ͯΞαΠϯMTG
    15:00 ΞαΠϯMTG౿·͑ͯ࠾༻MTG
    ྫͱͯ͠ͷ͋Δ̍೔ɿ

    ͜͏ͨ͠ྲྀΕʢߏ଄ʣ͸ɺ
    Կ͔Λલఏʹಈ͍͍ͯΔͨΊɺ
    ඇৗʹ༥௨͕ར͖ͮΒ͍ɻ
    Ұ͕ͭϦεέ͞ΕΔ͚ͩͰɺ
    ଞͷ.5(͕։࠵Ͱ͖ͳ͔ͬͨΓɺ
    ҙຯ͕ͳ͘ͳͬͯ͠·͏ɻ
    ݸʑ͕ີ݁߹ʹͳ͍ͬͯΔɻ

    View Slide

  68. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE

    View Slide

  69. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    Client
    具体的に実装されたClientがServerを利用している
    =オープン・クローズドの原則に反している
    Server
    Clientが別のServerを使いたいとき、

    Clientクラスを変更しなければならない
    ࢀߟɿϩόʔτɾ$ɾϚʔνϯʢʣʮΞδϟΠϧιϑτ΢ΣΞ։ൃͷԞٛʯ4#ΫϦΤΠςΟϒ

    View Slide

  70. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    Client
    Client Interfaceという抽象クラスをつくる
    これはServerが実装するClientが使う口である
    ClientはServerとではなくInterfaceと会話する
    <>
    Client Interface
    Server
    Clientは
    Serverが別物になっても
    気がつくことはない
    ࢀߟɿϩόʔτɾ$ɾϚʔνϯʢʣʮΞδϟΠϧιϑτ΢ΣΞ։ൃͷԞٛʯ4#ΫϦΤΠςΟϒ

    View Slide

  71. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ଈͪ
    ʮ։͍͍ͯΔʯͱ͸ɺ
    ৼΔ෣͍Λ֦ுͰ͖Δ͜ͱ
    ʮด͍ͯ͡Δʯͱ͸ɺ
    ଞʹӨڹΛ༩͑ͳ͍͜ͱ

    View Slide

  72. Ϧείϑͷஔ׵ݪଇ
    ̏

    View Slide

  73. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ೿ੜܕ͸
    ͦͷجຊܕͱ
    ஔ׵ՄೳͰͳ͚Ε͹ͳΒͳ͍ɻ
    -JTLPWͷஔ׵ݪଇ
    5IF-JTLPW4VCTUJUVJPO1SJODJQMF-41

    View Slide

  74. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    -JTLPWʢϦείϑʣ͸
    ਓͷ໊લͳͷͰؾʹ͠ͳ͍

    View Slide

  75. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    جຊܕʹͰ͖Δ͜ͱ͕
    ೿ੜܕͰ
    Ͱ͖ͳ͘ͳͬͯ͸͍͚ͳ͍

    View Slide

  76. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ʮਖ਼ํܗ͸௕ํܗͰ͋Δʯ

    View Slide

  77. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    class Rectangle {
    // ௕ํܗ
    public Rectangle(int x, int y, int width, int height) { … }
    public void SetWidth(int width) { … }
    public void SetHeight(int height) { … }
    }
    class Square : Rectangle {
    // ௕ํܗΛܧঝͯ͠ਖ਼ํܗ
    public Square(int x, int y, int width, int height) { … }
    public void SetWidth(int width) { … }
    public void SetHeight(int height) { … }
    }
    ྫ͑͹ɺ௕ํܗΛܧঝͯ͠ਖ਼ํܗΛͭ͘Δ
    ͦΕ͸ਖ਼͍͔͠ʁ

    View Slide

  78. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ౴ɿਖ਼͘͠ͳ͍
    ਖ਼ํܗ͸ৗʹ
    8JEUIʢ෯ʣ)FJHIUʢߴ͞ʣ
    Λຬͨ͢ඞཁ͕͋Δ

    View Slide

  79. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    Αͬͯɺਖ਼ํܗͷ
    4FU8JEUI4FU)FJHIU͸ɺ
    ௚ײʹ൓͢Δಈ࡞Λ͢Δ
    ͦͷͨΊɺਖ਼ํܗ͸௕ํܗͱ
    ஔ͖׵͑Δ͜ͱ͕Ͱ͖ͳ͍

    View Slide

  80. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ਖ਼ํܗ͸௕ํܗͱ
    ஔ͖׵͑Δ͜ͱ͕Ͱ͖ͳ͍
    ͱ͍͏͜ͱ͸
    ܧঝͯ͠͸͍͚ͳ͍

    View Slide

  81. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ஔ͖׵͑Δ΋ͷ͕
    Ͱ͖ͳ͍΋ͷΛ
    ಉҰͷ΋ͷͱͯ͠
    ѻͬͯ͸͍͚ͳ͍

    View Slide

  82. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE

    View Slide

  83. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    Shape
    ShapeType
    Circle
    +Draw()
    Square
    +Draw()
    void DrawShape(Shape& s)
    {
    switch(s.type) {
    case Square:
    ((Square&)s).Draw();
    break;
    case Circle:
    ((Circle&)s).Draw();
    break;
    }
    これではCircleやSquareは

    Shapeの代わりに使えない。
    ࢀߟɿϩόʔτɾ$ɾϚʔνϯʢʣʮΞδϟΠϧιϑτ΢ΣΞ։ൃͷԞٛʯ4#ΫϦΤΠςΟϒ
    Draw()

    がない

    View Slide

  84. ґଘؔ܎ٯసͷݪଇ
    ̐

    View Slide

  85. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    B ্ҐͷϞδϡʔϧ͸

    ԼҐͷϞδϡʔϧʹ

    ґଘͯ͠͸ͳΒͳ͍ɻ

    ͲͪΒͷϞδϡʔϧ΋

    ʮந৅ʯʹґଘ͢΂͖Ͱ͋Δɻ
    ґଘؔ܎ٯసͷݪଇ

    5IF%FQFOEFODZ*OWFSTJPO1SJODJQMF%*1

    View Slide

  86. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    C ʮந৅ʯ͸࣮૷ͷৄࡉʹ

    ґଘͯ͠͸ͳΒͳ͍ɻ

    ࣮૷ͷৄࡉ͕

    ʮந৅ʯʹґଘ͢΂͖Ͱ͋Δɻ
    ґଘؔ܎ٯసͷݪଇ

    5IF%FQFOEFODZ*OWFSTJPO1SJODJQMF%*1

    View Slide

  87. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ্ҐͷϞδϡʔϧ͸
    ԼҐͷϞδϡʔϧʹ
    ґଘͯ͠͸͍͚·ͤΜ
    ͲͪΒ΋
    ʮந৅ʯʹґଘ͢΂͖Ͱ͢

    View Slide

  88. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ʮந৅ʯ͸
    ࣮૷ͷৄࡉʹ
    ґଘͯ͠͸͍͚·ͤΜ
    ࣮૷ͷৄࡉ͕
    ʮந৅ʹʯґଘ͢΂͖Ͱ͢

    View Slide

  89. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    Ͳ͏͍͏͜ͱͰ͠ΐ͏͔ʁ

    View Slide

  90. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ൶ΛΠϝʔδ͠·͢

    View Slide

  91. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    υΞʹ͸υΞͦͷ΋ͷͱ
    υΞϊϒ͕͋Γ·͢
    υΞ͕ϊϒʹґଘ͍ͯ͠Δͷ͔ʁ
    ϊϒ͕υΞʹґଘ͍ͯ͠Δͷ͔ʁ
    ͲͪΒͰ͠ΐ͏͔ʁ

    View Slide

  92. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ྫ͑͹۩ମతʹଘࡏ͢Δ

    ʮమͷυΞʯʮ伴ͷ͔͔Δϊϒʯ

    ͸ʮ࣮૷ʯͰ͢
    ʮந৅ʯͰ͋ΔʮυΞʯʮϊϒʯ

    ʹ໨Λ޲͚·͢

    View Slide

  93. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ͦ͏Ͱ͢
    ࣮૷Ͱ͋ΔʮమͷυΞʯ͸
    ந৅Ͱ͋ΔʮυΞʯʹґଘ͍ͯ͠·͢
    ࣮૷Ͱ͋Δʮ伴ͷ͔͔Δϊϒʯ͸
    ந৅Ͱ͋Δʮϊϒʯʹґଘ͍ͯ͠·͢

    View Slide

  94. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE

    View Slide

  95. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    Lamp
    +TurnOn()
    +TurnOff()
    Button
    +Poll()
    ButtonはPollでメッセージを受け取ると
    ボタンの状態からLampのTurnOn/TurnOffを呼び出し
    明かりを灯すか消します。
    これは何故間違っているのでしょうか?
    ButtonはLampに直接依存しているので、
    他のスイッチを制御できません。
    ࢀߟɿϩόʔτɾ$ɾϚʔνϯʢʣʮΞδϟΠϧιϑτ΢ΣΞ։ൃͷԞٛʯ4#ΫϦΤΠςΟϒ

    View Slide

  96. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    <>

    ButtonServer
    +TurnOn()
    +TurnOff()
    Button
    +Poll()
    Lamp
    上位とは何か?

    それは即ち「抽象」です。
    Buttonが依存するのは、
    ButtonServerというInterfaceで

    あるべきで、LampはButtonServerを

    実装すれば良いので依存が逆転します。
    ࢀߟɿϩόʔτɾ$ɾϚʔνϯʢʣʮΞδϟΠϧιϑτ΢ΣΞ։ൃͷԞٛʯ4#ΫϦΤΠςΟϒ

    View Slide

  97. ΠϯλʔϑΣΠε෼཭ͷݪଇ
    ̑

    View Slide

  98. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ΫϥΠΞϯτʹɺ

    ΫϥΠΞϯτ͕ར༻͠ͳ͍

    ϝιου΁ͷґଘΛ

    ڧ੍ͯ͠͸ͳΒͳ͍ɻ
    ΠϯλʔϑΣʔε෼཭ͷݪଇ

    5IF*OUFSGBDF4FHSFHBUJPO1SJODJQMF*41

    View Slide

  99. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ؔ৺ͷ෼཭
    ͱ΋ݴΘΕ·͢

    View Slide

  100. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ՄೳͳݶΓ
    ॏෳ͕ͳ͍
    ෳ਺ͷػߏʹ෼཭͢Δ͜ͱ

    View Slide

  101. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ྫ͑͹
    ΧʔυೖΕΛ૝૾͠·͢
    ෳ਺ͷϙέοτΛ࣋ͬͨΧʔυೖΕ
    ༷ʑͳΧʔυ͕ೖΓ·͢

    View Slide

  102. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    Ͱ͸ɺศརͦ͏͔ͩΒͱ
    ʮͲΜͳΧʔυͰ΋ೖΔΧʔυೖΕʯ
    Λઃܭͨ͠ΒͲ͏Ͱ͠ΐ͏͔ʁ

    View Slide

  103. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    B社の名刺
    どんなカードでも入る

    カード入れ
    A社の名刺
    会員証
    チケット
    ݶΓ͕ͳ͍΋ͷʹରԠ͢Δͱ
    ԿͰ΋ೖΔʹංେԽͨ͠ޱ
    Λ૑Β͟ΔΛಘ·ͤΜ
    ݱ࣮Ͱ͸Χʔυͷ࢓༷ͱ͍͏ͷ͸ܾ·͍ͬͯ·ͤΜ

    View Slide

  104. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ৽͍͠ن֨ɺαΠζͷΧʔυ͕
    ొ৔͢Δͨͼʹ
    ଞͷશͯͷΧʔυΛೖΕ͍ͯͨޱ͕
    ӨڹΛड͚Δ͜ͱʹͳΓ·͢

    View Slide

  105. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE

    View Slide

  106. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    Door
    Timed Door
    <>
    Timer Client
    +Lock()
    +Unlock()
    +IsOpen()
    + TimeOut()
    Timer
    Doorから、一定時間開放されていると

    警報が鳴るTimed Doorを作りましたが……。
    DoorというInterfaceがTimeOutという口を使う羽目に。
    Doorを汚染
    ࢀߟɿϩόʔτɾ$ɾϚʔνϯʢʣʮΞδϟΠϧιϑτ΢ΣΞ։ൃͷԞٛʯ4#ΫϦΤΠςΟϒ

    View Slide

  107. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    Door
    Timed Door
    <>
    Timer Client +Lock()
    +Unlock()
    +IsOpen()
    + TimeOut()
    Timer
    + TimeOut()
    Door Timer

    Adapter
    + TimeOut()
    TimerClientから
    派生する

    Adapterを作成
    具体的処理は
    TimedDoorに委譲
    ࢀߟɿϩόʔτɾ$ɾϚʔνϯʢʣʮΞδϟΠϧιϑτ΢ΣΞ։ൃͷԞٛʯ4#ΫϦΤΠςΟϒ

    View Slide

  108. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    Door
    Timed Door
    <>
    Timer Client +Lock()
    +Unlock()
    +IsOpen()
    + TimeOut()
    Timer
    + TimeOut()
    多重継承に近いことができるなら
    こうした設計も考えられる
    ࢀߟɿϩόʔτɾ$ɾϚʔνϯʢʣʮΞδϟΠϧιϑτ΢ΣΞ։ൃͷԞٛʯ4#ΫϦΤΠςΟϒ

    View Slide

  109. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ઃܭͷݪଇ͸
    ݱ࣮తͳ໰୊Λ
    ղܾ͢Δ͜ͱʹ΋
    ౰ͯ͸·Γ·͢

    View Slide

  110. ήʔϜ։ൃͷ
    ϙΠϯτ

    View Slide

  111. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ݴΘΕͯͳ͍͜ͱͰ΋
    ༧ଌ͓ͯ͘͠

    View Slide

  112. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ϓϩάϥϚʮ͜Εͬͯɺ̍छྨͰ͢ΑͶʁʯ
    σΟϨΫλʔʮͦ͏ͩͶɺࠓͷͱ͜Ζ͸ʯ

    View Slide

  113. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ൒೥ޙʜʜ

    View Slide

  114. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    σΟϨΫλʔʮ͋Ε૿΍͍ͨ͠Μ͚ͩͲɺ
    ɹɹɹɹɹɹɹ͍͚Δʁʯ

    View Slide

  115. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    @
    Ωλʔ

    View Slide

  116. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ϓϩάϥϚʮແཧͰ͢ɻ

    ɹɹɹɹɹɹͩͬͯɺ૿΍͞ͳ͍ͬͯ
    ɹɹɹɹɹɹ͍ͬͨ͡Όͳ͍Ͱ͔͢ʯ

    View Slide

  117. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    Կઍճ
    Կສճͱ
    ܁Γฦ͞Εͨ
    ͜ͷ΍ΓͱΓʜʜ

    View Slide

  118. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ࢥ͍ͩͦ͏
    ԿͷҝʹήʔϜΛ

    ૑͍ͬͯΔͷ͔ʁ

    View Slide

  119. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    Ϣʔβʔ͞Μ͕
    ໘ന͍ͱײͯ͘͡ΕΔͨΊʹ
    ૑͍ͬͯΔ
    ໨త͸׬੒ͤ͞Δ͜ͱ
    ऴΘΒͤΔ͜ͱͰ͸ͳ͍

    View Slide

  120. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ίϯηϓγϣϯ ϓϩτλΠϓ ΞϧϑΝ ϕʔλ Ϛελʔ

    ֬


    ߴ
    ௿
    σόοά
    ήʔϜ։ൃͷϑΣΠζͱ
    ෆ࣮֬ੑͷཧ૝తͳ૬ؔਤ

    View Slide

  121. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ෆ࣮֬ੑΛ
    ঃʑʹɺ࣮ͦͯ֬͠ʹ
    ௵͍ͯ͘͠ͷ͕
    ϓϩάϥϚͷ੹຿Ͱ͋Δ

    View Slide

  122. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    εέδϡʔϧ্
    ίϯηϓτ ϓϦϓϩμΫγϣϯ
    ڥ໨͕͋ΔΑ͏ʹݟ͑Δ
    ϓϩμΫγϣϯ
    ϙετ

    ϓϩμΫγϣϯ

    View Slide

  123. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ݱ࣮ͷਐḿ
    ܾఆ
    ະܾఆ
    Ծܾఆ
    ະܾఆ
    ܾఆ
    ࣮ࡍͷ։ൃʹ͸ͦ͜·Ͱ໌֬ͳڥ໨͸ͳ͍
    ࣮૷ࡁΈ
    Ծ࣮૷
    ະܾఆ
    ࣮૷ࡁΈ
    ࣮૷ࡁΈ
    ܾఆ
    ະܾఆ
    Ծܾఆ

    View Slide

  124. ·ͱΊ

    View Slide

  125. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    มԽʹରԠ͢Δٕज़
    ͦΕ͕໘ന͞ʹۙͮͨ͘Ίʹ
    Ͳ͏ͯ͠΋ඞཁͳ͜ͱ

    View Slide

  126. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ଈͪͦΕ͕ɹ

    ٕज़͕ͳ͚Ε͹

    ໘ന͍΋ͷ͕
    ૑Εͳ͍ཧ༝

    View Slide

  127. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE
    ͝੩ௌ͋Γ͕ͱ͏͟͝·ͨ͠

    View Slide