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

what is model?

3925ee6eaa41031bac799de0f4f528ec?s=47 to4iki
January 17, 2017

what is model?

"モデル"という言葉を様々な観点から考えてみる

3925ee6eaa41031bac799de0f4f528ec?s=128

to4iki

January 17, 2017
Tweet

Transcript

  1. Ϟσϧͱ͍͏ݴ༿͸ᐆດ shinjyuku.lt #3 @to4iki

  2. People • @to4iki • GANMA!ͱ͍͏ອըͷαʔϏεΛ࡞ͬͯ·͢ • iOSɺΞʔΩςΫνϟʹڵຯ͕͋Γ·͢ • ୆࿷ߦͧ͘ʂ(͓͢͢Ίڭ͑ͯ͘Ε) •

    ΫϦεϚεͲ͏͠Α͏ɻɻ(´ɾωɾ`)
  3. Agenda • ͸͡Ίʹ • ϞσϧΛ৭Μͳ؍఺͔Βߟ͑ͯΈΔ • ΦϒδΣΫτࢦ޲ɺDDD…

  4. എܠ

  5. Ϟσϧͱ͍͏ݴ༿͸ᐆດ • ҙຯ͕޿͗͢Δ • ͨͩͷσʔλΛ֨ೲ͢Δശͱͯ͠ଘࡏ͢Δέʔε΋୔ࢁΈ͖ͯͨ • ϏδωεϞσϧ • MVC, MVVM,

    MVP, DDD…ͰͷϞσϧ • αʔόʔαΠυͷϞσϧɺΫϥΠΞϯταΠυͷϞσϧ • ActiveRecord, DAO, DTO…
  6. “Ϟσϧͱ͸Կ͔”͕ڞ༗Ͱ͖͍ͯͳ͍

  7. ผͷྑ͍ݴ༿͕͋Ε͹ྑ͍Μ͚ͩͲɻ தʑݟ͔ͭΒͳ͍

  8. ϞσϧͷఆٛΛগ͠Ͱ΋ɺ ͸͖ͬΓͱ͍ͤͨ͞

  9. ༷ʑͳ੾Γޱ͔Βߟ͑ͯΈΔ • semantics: Ϟσϧͷҙຯ • expression: Ϟσϧͷදݱ • utility: Ϟσϧͷ༗ޮੑ

    • target: Ϟσϧͷର৅
  10. Ϟσϧͱ͸ (ࣗ෼ͳΓͷղऍͳͷͰؒҧͬͯΔՄೳੑ͕͋Γ·͕͢ɺ͓खॊΒ͔ʹ)

  11. ͍ͬͺ͍Ҿ༻ͨ͠ ؤுΔͧ

  12. ͱ͸͍͑ɺ ݀ͩΒ͚͔ͩΒࢗ͠ʹདྷͯ΄͍͠

  13. ݩདྷͷҙຯͰͷϞσϧ • ݟຊɺखຊɺ໛ൣɺ਽ܗ(ϞσϧϧʔϜ) • ੍࡞ͷૉࡐͷର৅(ਓ෺ըͷʙ) • ෳࡶͳݱ৅Λઆ໌͢ΔͨΊʹ༻͍ΒΕΔ୯७Խͨ͠ཧ࿦΍Ծઃ • খઆͳͲͷొ৔෺ͷૉࡐͱͳ࣮ͬͨࡏͷਓ෺ɺΞχϝͷ෣୆ •

    ϑΝογϣϯϞσϧͷུ ूӳࣾ ࠃޠࣙయ
  14. ͜Ε͕Ϟσϧͩʂ

  15. ࢥߟͱͯ͠ͷϞσϧ(1/2) • Ϟσϧ͸ҙਤΛઆ໌͢Δଘࡏ • ஌ࣝΛཁ໿ͨ͠γϯϓϧͰ෼͔Γ΍͍͢આ໌ • ෳࡶͳ΋ͷ͝ͱΛγϯϓϧʹදݱͨ͠΋ͷ(ܕ͕ Ϟσϧ) • ϞσϧΛ࡞Δͱࢥߟ͢Δͷ྆ྠΛճ͍ͯ͘͠ͷ͕

    ϞσϧԽ • ཁૉɾࣄ৅ΛͲͷΑ͏ʹ෼ׂ͢Δ͔ɺؔ܎ੑ͔Β ந৅Խɾ۩ମԽΛߟ͑ͲͷΑ͏ʹόϥ͍͔ͯ͘͠ɺ όϥͨ͠ཁૉ͔ΒͲͷΑ͏ʹશମΛద੾ʹઆ໌Ͱ ͖ΔΑ͏ʹͳΔ͔ͷԟ෮ӡಈ(ࢥߟ)͕ͦ͜Ϟσϧ ࡞Γͷຊ࣭
  16. ࢥߟͱͯ͠ͷϞσϧ(2/2) • ϞσϧΛ࡞Δͱɺ࿙Εͳ͘ɺॏͳΓͳ͘ ෺ࣄ͕੔ཧ͞Ε͍ͯΔ͜ͱ͕֬ೝ ͠΍͘͢ͳΔ • ແବͳ৘ใΛͦ͗མͱ͠෺ࣄΛγϯϓϧʹදݱͰ͖Δ == શମΛཧղ͠၆ ᛌ͢Δ͜ͱʹͭͳ͕Δ

    • ྨਪͯ͠࿈૝͢ΔࣄͰɺൃ૝Λ޿͛Δ͜ͱ͕Ͱ͖Δ
  17. OOͰͷϞσϧ(1/2) • OOP͸ਓؒͷਫ਼ਆΛ֦ுͨ͠΋ͷ • OO͸ਓʑͱͦͷϝϯλϧϞσϧʹؔ͢Δ΋ͷͰ͋ΓɺϙϦϞϑΟζϜ ΍݁߹ɾڽूʹؔ͢Δ΋ͷͰ͸ͳ͍ • OOPʹΑͬͯιϑτ΢ΣΞΛ࡞੒͢Δͱ͍͏͜ͱ͸ɺݴ͍׵͑Ε͹Ϟ σϧΛ࡞੒͢Δ͜ͱ =

    ϞσϧΛద੾ʹ࡞੒Ͱ͖͍ͯͳ͍ͷ͸OOPͱݺ ͹ͳ͍ • “σʔλ”ͱ”ৼΔ෣͍”Λ࣋ͭଘࡏ • ΦϒδΣΫτ͸ޓ͍ʹϝοηʔδΛૹΓ߹͏͜ͱͰɺޓ͍ͷৼΔ෣͍ Λ࣮ߦ͢Δ(ϝοηʔδύογϯά)
  18. OOPͷ৴৚ 1. ϝοηʔδύογϯά 2. ΦϒδΣΫτಉ࢜ͷִ཭(isolation) • ࢲͷϓϩάϥϜ͕͋ͳͨͷϓϩάϥϜΛഁյͯ͠͠·Θͳ͍ͱ͍͏͜ͱ 3. ϙϦϞϑΟζϜ •

    རศੑͷҝɺϝοηʔδͷૹΓํΛڞ௨ʹ͢Δ
  19. OOͱݱ࣮ੈք͸શવҧ͏ • ΦϒδΣΫτࢦ޲͸ݱ࣮ੈքΛͦͷ··ιϑτ΢ΣΞʹදݱ͢Δٕज़ͱ͍͏આ໌͸ؒ ҧ͍ 1. ݱ࣮ੈք͸ઌʹ۩ମతͳ΋ͷ͕͋ΓɺͦΕΛ༷ʑͳج४Ͱ෼ྨ͢Δ 2. ݱ࣮ੈք͸࣌ؒ࣠΍ίϯςΩετͰRole͕มԽ͍ͯ͘͠(OOPͰ͸1छྨͷΫϥ ε͔ΒΠϯελϯε͕࡞ΒΕΔ) 3.

    ݱ࣮ੈք͸ݸਓݸਓ͕ҙࢥΛ࣋ͬͯࣗ༝ʹಈ͘ɺOOPͷΠϯελϯε͸֎෦͔ Βͷࢦ͕ࣔͳ͍ݶΓࣗ෼͔Βಈ͘ࣄ͸ͳ͍ɺ͋Β͔͡ΊܾΊΒΕͨࣄΛͦͷ௨ Γʹ͔࣮͠ߦͰ͖ͳ͍ • ݱ࣮ੈքͷҰ෦Λݞ୅ΘΓ͢Δ͚ͩͰɺݱ࣮ੈքͦͷ΋ͷΛදݱ͢ΔΘ͚Ͱ͸ͳ͍ • ݱ࣮ΛදݱͰ͖Δͷ͸͋͘·Ͱ΋੩తϞσϧ(֓೦Ϟσϧ)·ͰͰ͋ΓɺಈతϞσϧ(෺ ཧϞσϧ)͸ݱ࣮ͱͷྨࣅੑ͸͋·Γͳ͍
  20. OOͰͷϞσϧ(2/2) • OO͸ɺ෼ੳʹجͮ͘Ϟσϧ(ʹղऍ)هड़ͷҰൠతख๏Λࢧԉ͢Δ • ର৅Λཧղ͢ΔͨΊʹɺཁૉΛ෼ղ • ߏ੒ཁૉ͕ΦϒδΣΫτ • ߏ੒ཁૉؒͷؔ܎͸ΦϒδΣΫτͷؔ࿈ •

    ֊૚ཧղ͸ΧϓηϧԽͱͯ͠ද͢ • ಈతͳৼΔ෣͍͸implementationʹԡ͠෇͚Δ(ղܾ͸Ͱ͖͍ͯͳ͍?) • OOͷϞσϧ͸ݱ࣮ੈքͷ֓೦(੩త)Λදݱͨ͠ଘࡏ
  21. MVC͔ΒݟͨϞσϧ • MVCͩΖ͏͕ɺMVP, MVVM, MVI…ͩΖ͏͕ϨΠϠʔΛ෼཭ͨ͠ΞʔΩςΫ νϟͷ໨తͷҰͭ͸ϞσϧΛִ཭͢Δͱ͍͏ࣄ • M͸ΞϓϦέʔγϣϯͷதͰͷϏδωεϩδοΫΛ୲౰͢Δɺ͍Θ͹ΞϓϦ έʔγϣϯͷຊମ෦෼ɺຊ࣭ʹ౰ͨΔ •

    M͸ೖग़ྗ΍දࣔͱ͍ͬͨॲཧΛߦ͏͜ͱ͸Ͱ͖ͳ͍ • M͸ٕज़ʹґଘ͠ͳ͍Plainͳଘࡏ(POJO, PORO)Ͱ͋Δ΂͖ • ActiveRecord ͸͡ΊORMͦΕࣗମ͸͋͘·Ͱ΋MΛࢧ͑Δ΋ͷͰ͋ͬͯ MͰ͸ͳ͍ • ۃ࿦ɺGUI/CUI/WebAppͰ΋มΘΒͳ͍ॲཧ͕͋ΔͳΒͦΕ͸Mͷ࢓ࣄ
  22. DDDͷࢹ఺

  23. DDDͱ͸ • Domain-Driven Design • υϝΠϯϞσϧΛத৺ʹߟ͑Δઃܭࢥ૝ • DDD͸ݴ༿Λେ੾ʹ͢Δઃܭࢥ૝ • XP(ΠϯΫϦϝϯλϧͳઃܭ)

    + OO(ΦϒδΣΫτࢦ޲) • OOͷຊҙΛܧঝͨ͠··࣮ફͨ͠ͷ͕DDD • ܾͯ͠৽͍͠΋ͷͰ͸ͳ͍ɺۜͷ஄ؙͰ΋ͳ͍ • ίϛϡχέʔγϣϯίετ͕ߴ͍(ਓ͕ଟ͍)ͱ͜͸DDD͕අ༻ରޮՌ͕ߴ ͍͔΋
  24. DDDͷ໨త͸ ιϑτ΢ΣΞͷ֩৺ʹ͋Δ ෳࡶੑͱಆ͏͜ͱ

  25. DDDͷҙٛ • ͜Ε·Ͱ͸ɺϞσϧͱ͸σʔλͷೖΕ෺ͰɺͦΕΛૢ࡞ͯ͠खଓ͖Λ࣮ݱ ͢ΔαʔϏεΛ࣮૷͢Δɺͱ͍͏ٕज़ۦಈͳߟ͑ํ͕த৺ͩͬͨ(τϥϯ βΫγϣϯεΫϦϓτ) • υϝΠϯۦಈͰ͸ɺυϝΠϯϞσϧ͕ࣔ͢ߟ͑ํΛ֩৺ʹ͢ΔɻDDDͰ͸ ͜ͷ੹຿Λ୲͏ΦϒδΣΫτ܈Λڧௐಈ࡞ͤ͞Δ͜ͱΛલఏͱ͍ͯ͠Δɻ • OOͷϞσϧ͸֓೦Λࣔ͢΋ͷɻDDDͰ͸ɺϞσϧ=ߟ͑ํͱίʔυΛΑ

    Γີ઀ʹ݁ͼ͚ͭͨιϑτ΢ΣΞΛ࣮ݱ͢Δ
  26. υϝΠϯͱ͸ • ιϑτ΢ΣΞΛར༻͢Δਓͨͪͷ”׆ಈ”ͱ”ؔ৺ࣄ" == ૊৫͕ߦ͏ࣄۀ΍ͦΕΛऔΓר͘ੈքͷ͜ͱ == ۀ຿ྖҬ • ։ൃऀͰ͸ͳ͘ར༻ऀͷݴ༿Ͱදݱ͢Δ •

    “ιϑτ΢ΣΞͷ֩৺͸υϝΠϯʹؔ܎ͨ͠໰୊Λ ϢʔβͷͨΊʹղܾ͢ΔೳྗͰ͋Δ”
  27. υϝΠϯϞσϧͱ͸ • υϝΠϯϞσϧ͸ಛఆͷਤͰ͸ͳ͘ɺਤ͕఻͑Α͏ͱ͢Δ ߟ͑ํͰ͋Δ • ͦͷ஌͕ࣝݫີʹߏ੒͞Εɺબͼൈ͔Εͯந৅Խ͞Ε ͨ΋ͷ • Ϟσϧͱ͸ɺϓϩδΣΫτʹܞΘΔਓʑͷ಄ͷதͰߏங͞ Εͨ֓೦ͷू·ΓͰ͋ΓɺυϝΠϯʹ͍ͭͯͷಎ࡯Λ൓ө

    ͨ͠ɺ༻ޠͱ֓೦ͷؔ܎ੑ͔ΒͰ͖͍ͯΔ • Ϟσϧͱ͸બͼൈ͔Εγϯϓϧʹ͞Εɺҙਤతʹ૊Έཱͯ ΒΕͨ஌ࣝͷදݱܗࣜͰ͋Δɻద੾ͳϞσϧ͸৘ใͷ࣋ͭ ҙຯΛ໌Β͔ʹ͠ɺͦͷ৘ใΛ໰୊ʹूதͤ͞Δ • υϝΠϯϞσϧ͸໰୊ྖҬΛදͨ͠΋ͷ(υϝΠϯϞσϧ ͚ͩͰ͸ػೳཁٻΛຬͨ͢͜ͱ͕Ͱ͖ͳ͍) • υϝΠϯϞσϧ͸ར༻ऀ(ϝϯλϧ)ͷؔ৺ຖͷ໛ܕ
  28. υϝΠϯϞσϧͷՁ஋ 1. Ϟσϧͱઃܭͷ֩৺͕૬ޓʹܗ੒͠߹͏ 2. Ϟσϧ͸νʔϜϝϯόશһ͕࢖༻͢Δݴޠͷج൫Ͱ͋Δ 3. Ϟσϧ͸ৠཹ͞Εͨ஌ࣝͰ͋Δ

  29. ϢϏΩλεݴޠ • ͍ͭͰ΋ɾͲ͜Ͱ΋ɾ୭Ͱ΋࢖͑Δݴ༿ • υϝΠϯΤΩεύʔτ΍ιϑτ΢ΣΞ։ൃऀΛؚΊͨνʔϜશମͰ࡞Γ্ ͛Δڞ༗ݴޠ • ϢϏΩλεݴޠͷޠኮ͸υϝΠϯϞσϧ΍ͦͷৼΔ෣͍ʹඥͮ͘Ұ؏ͨ͠ ݴޠΛఆٛͯ͠ɺ։ൃνʔϜ/PO/ސ٬ͱͷίϛϡχέʔγϣϯΪϟοϓΛ ຒΊΔ

    ϢϏΩλεݴޠ σβΠϯύλʔϯ ٕज़༻ޠ ઐ໳త Ϗδωε༻ޠ
  30. ڥք͚ͮΕͨίϯςΩετ(1/2) • υϝΠϯ͸໰୊ۭؒͱղܾۭؒΛ͍࣋ͬͯΔ • ໰୊ۭؒ: ղܾ͢΂͖Ϗδωεઓ্ུͷ՝୊Λු͖ ூΓʹ͢Δ΋ͷ • ղܾۭؒ: ιϑτ΢ΣΞΛͲͷΑ͏ʹ࣮૷ͯͦ͠ͷ

    ՝୊Λղܾ͢Δ͔ʹ஫໨͢Δ΋ͷ(ڥք෇͚ΒΕͨ ίϯςΩετ) • ڥք͚ͮΕͨίϯςΩετ͸໌ࣔతͳڥքͰ͋Γɺυϝ ΠϯϞσϧ͕Ͳ͜ʹଐ͢Δ͔Λද͢΋ͷ • ex. จ຺͕ந৅Խ͞Εͨ΋ͷ͕ه߸ɻจ຺͕ڞ༗͞Εͯ ͍ͳ͍ͱҙຯΛղऍͰ͖ͳ͍ɻͦͷจ຺͕ͦ͜ڥք෇͚ ΕͨίϯςΩετ
  31. ڥք͚ͮΒΕͨίϯςΩετ(2/2) • ݴ༿ͷڥքΛؾʹ͢Δ(จ຺ʹΑͬͯಉ͡ϞϊͰ΋ҙຯ͕ҧ͏) • ڥք͚ͮΒΕͨίϯςΩετͷओ໨త͸ɺϢϏΩλεݴޠ΍ͦͷυϝΠϯ ϞσϧΛΧϓηϧԽ͢Δ͜ͱ • DDDͰ͸ಉ໊͡લͰ΋BC͕ҟͳΕ͹ɺҟͳΔϞσϧͱͯ͠ఆٛ͢Δ

  32. Ϟσϧۦಈઃܭ(1/2) • ͔࣍Β࣍΁ͱػೳΛຬͨ͢ίʔυΛ࡞੒͢Δ͚ͩͷϓϩδΣΫτ͸ɺ஌ࣝ ͷטΈࡅ͖ͱίϛϡχʔέʔγϣϯʹ͓͚ΔԸܙΛ΄ͱΜͲड͚ͳ͍ • ໰୊͕ى͖Δͷ͸ɺϞσϧۦಈઃܭʹ͓͍ͯ݁ͼ͚ͭͯߟ͍͑ͯΔ2ͭͷ ࡞ۀɺϞσϦϯάͱ࣮૷Λ෼཭ͯ͠͠·ͬͨ࣌ • ઃܭ͕͋Δ͍͸ઃܭͷத৺ͱͳΔ෦෼͕ɺυϝΠϯϞσϧʹඥ͍͍ͮͯͳ ͍ͳΒ͹ɺͦͷϞσϧʹ΄ͱΜͲՁ஋͸ͳ͘ɺιϑτ΢ΣΞ͕ਖ਼֬Ͱ͋Δ

    ͔Ͳ͏͔΋ٙΘ͍͠ɻಉ͡Α͏ʹɺϞσϧͱઃܭ͞Εͨػೳͱͷඥ͚͕ͮ ෳࡶͩͱཧղ͢Δͷ͕೉͘͠ɺ࣮ࡍʹ͸ɺઃܭ͕มߋ͞Εͨ࣌ʹඥ͚ͮΛ ҡ࣋Ͱ͖ͳ͘ͳΔ
  33. Ϟσϧۦಈઃܭ(2/2) • ඥ෇͚͕໌Β͔ʹͳΔΑ͏ʹɺυϝΠϯϞσϧΛจࣈ௨ΓͷҙຯͰ஧࣮ʹ ൓өͤ͞Δ͜ͱɻϞσϧʹ͍ͭͯ࠶ݕ౼͠ɺΑΓࣗવʹιϑτ΢ΣΞʹ࣮ ૷͞ΕΔΑ͏ʹमਖ਼͢Δ͜ͱ • ίʔυ͸ϞσϧͷදݱͱͳΔ͔Βɺίʔυʹର͢Δมߋ͸Ϟσϧʹର͢Δ มߋʹͳΔ͔΋͠Εͳ͍ɻͦͷӨڹ͸ɺϓϩδΣΫτͷଞͷ׆ಈશମ΁ͱ దٓ఻Θ͍͔ͬͯͳ͚Ε͹ͳΒͳ͍

  34. TPS͔Β • શͯͷ࡞ۀऀ͕ੜ࢈ϥΠϯશମʹ੹೚Λ࣋ͭɻܽ ؕΛݟ͚ͭͨΒɺඥΛҾͬுͬͯɺϥΠϯΛࢭΊΔɻ ͦ͏ͯ͠ɺϥΠϯͷશһͰ໰୊ͷࠜຊݪҼΛൃݟ͠ ͦΕΛमਖ਼͢Δ

  35. Ϟσϧ(ۀ຿)ʹ੹೚Λ࣋ͱ͏ Ϟσϧ(ۀ຿)Λߟ͑ଓ͚Α͏

  36. ·ͱΊ • Ϟσϧ͸໰୊/ۀ຿ྖҬ • Ϟσϧ͸֓೦Λࣸ͠औΔखஈ • Ϟσϧ͸๲େͳ஌ࣝΛཁ໿ͨ͠γϯϓϧͰΘ͔Γ΍͍͢આ໌ • ࣗ෼͕ͨͪܞΘΔۀ຿ʹڵຯɺ੹೚ɺਅ݋ʹऔΓ૊Ή͜ͱͰɺΑΓྑ͍Ϟ σϧ͕ੜ·ΕΔ

  37. See also(links) • Ϟσϧͱ͸Կ͔ʁ http://dse.ssi.ist.hokudai.ac.jp/~onosato/lectures/DSE19/H19-Model.pdf • ΦϒδΣΫτࢦ޲ͱ10೥ઓͬͯΘ͔ͬͨ͜ͱ http://qiita.com/tutinoco/items/ 6952b01e5fc38914ec4e •

    ϨΠϠʔઃܭͱ͔ɺΦϒδΣΫτࢦ޲ͱ͔ɺDDDͱ͔ɺͦͷล http://mattun.hatenablog.com/ entry/2014/07/19/135320 • OO͸੩తߏ଄Λɺؔ਺ܕ͸ಈతৼΔ෣͍ΛϞσϧԽ͢Δͷʹ༗༻ͩͱ͍͏࿩ɹhttp:// tanakakoichi9230.hatenablog.com/entry/3741984190 • ʮMVCͷצҧ͍ʯʹ͍ͭͯɺ΋͏Ұ౓ߟ͑ͯΈΔ http://at-grandpa.hatenablog.jp/entry/2013/11/ 01/072636 • FiNC DDDୈҰճษڧձ http://www.slideshare.net/hirokishigemura9/ruby-ddd • ϞσϦϯά΋͠ͳ͍ͰXPͱ͸Կࣄͩ http://www.slideshare.net/iwaoRd/xp-20150912
  38. See also(links) • ϦΞΫςΟϒDDD https://speakerdeck.com/j5ik2o/riakuteibuddd?slide=23 • GANMA!ͰDDDΛ΍ͬͯΈ͔ͯΒ1೥͘Β͍ܦͬͨ http://www.slideshare.net/ yasuyukisugitani/septeni-scala3 •

    DCIΞʔΩςΫνϟʹ͍ͭͯޠͬͯΈΔΑ http://uehaj.hatenablog.com/entry/20100528/ 1275011951 • ͦͷޙͷJoe ArmstrongͷΦϒδΣΫτࢦ޲ʹର͢Δݟղ http://qiita.com/lambda-knight/ items/a33feffe947a958a2d3a • DCIΞʔΩςΫνϟͷཧ࿦ͱGrailsʹΑΔ࣮૷ http://d.hatena.ne.jp/digitalsoul/20101110/ 1289315452)
  39. See also(books) • εʔύʔϓϩάϥϚʔʹֶͿ ࠷ڧγϯϓϧࢥߟज़ • ΦϒδΣΫτࢦ޲Ͱͳͥͭ͘Δͷ͔ • ΤϦοΫɾΤϰΝϯεͷυϝΠϯۦಈઃܭ •

    ࣮ફυϝΠϯۦಈઃܭ • ΤΫετϦʔϜϓϩάϥϛϯά • τϤλੜ࢈ํࣜ
  40. Any Questions?