Save 37% off PRO during our Black Friday Sale! »

俺たちのドメイン駆動設計はこれからだ!

51be5bc5c2fd89fa5dae93377efa3bdd?s=47 Honya
May 18, 2019

 俺たちのドメイン駆動設計はこれからだ!

ドメイン駆動設計に取り組んだ事例をもとに以下の点について説明しました。
1. ドメイン駆動設計とは一体何か?
2. どんなメリットがあるのか?
3. ドメインモデルについて
4. 設計パターンについて
5. ドメイン層の隔離について

51be5bc5c2fd89fa5dae93377efa3bdd?s=128

Honya

May 18, 2019
Tweet

Transcript

  1. Զͨͪͷ υϝΠϯۦಈઃܭ͸ ͜Ε͔Βͩʂ

  2. ຊ୩ɹ྄հ

  3. ෳࡶੑͱͷઓ͍

  4. όοΫΤϯυ ϑϩϯτΤϯυ σʔλϕʔε

  5. όοΫΤϯυ ϑϩϯτΤϯυ DTO DTO DTO DTO DTO σʔλϕʔε

  6. όοΫΤϯυ ϑϩϯτΤϯυ DTO DTO DTO DTO DTO DTO DTO DTO

    DTO DTO σʔλϕʔε
  7. όοΫΤϯυ ϑϩϯτΤϯυ DTO DTO DTO DTO DTO DTO DTO DTO

    DTO DTO ϩδοΫ σʔλϕʔε ϩδοΫ ϩδοΫ
  8. όοΫΤϯυ ϑϩϯτΤϯυ DTO DTO DTO DTO DTO DTO DTO DTO

    DTO DTO ϩδοΫ σʔλϕʔε ϩδοΫ ϩδοΫ ෳࡶʹͳͬͯ͘Δ…
  9. όοΫΤϯυ ϑϩϯτΤϯυ DTO DTO DTO DTO DTO DTO DTO DTO

    DTO DTO ϩδοΫ σʔλϕʔε ϩδοΫ ϩδοΫ ࢓༷มߋ ෳࡶʹͳͬͯ͘Δ…
  10. όοΫΤϯυ ϑϩϯτΤϯυ DTO DTO DTO DTO DTO DTO DTO DTO

    DTO DTO ϩδοΫ σʔλϕʔε ϩδοΫ ϩδοΫ ࢓༷มߋ ෳࡶʹͳͬͯ͘Δ…
  11. ֦ுੑ มߋ༰қੑ … ҡ࣋͢Δͷ͕೉͍͠ʂ

  12. Ͳ͏ͯ͜͠͏ͳΔʁ

  13. ίʔυΛݟ͚ͨͩͰ͸ ҙਤ͕ݟ͑ͯ͜ͳ͍ʂ

  14. ࢓༷ॻ ʢͲͷΑ͏ʹʣ ۀ຿஌ࣝ ʢͳͥʣ

  15. ίʔυ ର৅ۀ຿ʢυϝΠϯʣ ͷݴ༿

  16. ResultDto Data doExecute

  17. ෼͔ΓͣΒ͍ίʔυͷ׬੒

  18. ٕज़͕ෳࡶ͔ͩΒʁ

  19. ର৅ۀ຿ʢυϝΠϯʣ ͕ෳࡶ͔ͩΒʂ

  20. υϝΠϯۦಈઃܭ

  21. ଟ͘ͷΞϓϦέʔγϣϯʹ͓͍ͯɺ࠷΋ॏཁͳෳࡶ͞ ͸ɺٕज़తͳ΋ͷͰ͸ͳ͍ɻ Eric Evans

  22. ෳࡶͳ΋ͷ͸υϝΠϯͦͷ΋ͷɺ͢ͳΘͪɺ Ϣʔβͷ׆ಈ΍ϏδωεͳͷͰ͋Δɻ Eric Evans

  23. Ϗδωε͕࣋ͭෳࡶੑͱ ઓ͏ಓ۩

  24. ΍ͬͨ͜ͱ υϝΠϯۦಈઃܭʢຊʣ͔Β Ͱ͖ͦ͏ͳͱ͜ΖΛϐοΫΞοϓ ঃʑʹϓϩδΣΫτʹద༻

  25. 1. υϝΠϯϞσϧͷߏங 2. ઃܭύλʔϯͷద༻ 3. υϝΠϯ૚ͷ࡞੒

  26. ᶃ υϝΠϯϞσϧΛߏங

  27. υϝΠϯϞσϧͱ͸ʁ

  28. զʑ͕ର৅ϏδωεΛ ͲͷΑ͏ʹଊ͑ͯɺ ͲͷΑ͏ʹγεςϜԽ͢Δ͔ Λදݱ͢ΔϞσϧ

  29. ਤॻؗͷۀ຿Λ૝૾ͯ͠ॻ͍ͨྫ ※͋͘·ͰྫͳͷͰਤॻؗͷۀ຿͕ ͢΂ͯ͜ͷϞσϧʹͳΔΘ͚Ͱ͸ͳ͍

  30. ϞσϧΛ࢖͏ࣄͰԿ͕خ͍͠ͷ͔ʁ υϝΠϯϞσϧΛݩʹ࣮૷͢ΔࣄͰ ίʔυ͕ۀ຿ͷ ஌ࣝɾ֓೦ͱରԠͮ͘

  31. υϝΠϯϞσϧ ιʔείʔυ υϝΠϯ ʢෳࡶͳϢʔβʔͷ׆ಈɾۀ຿஌ࣝʣ ஌ࣝΛબͼൈ͖ɺந৅Խ υϝΠϯϞσϧΛݩʹઃܭ มߋͷϑΟʔυόοΫ

  32. ιʔείʔυ υϝΠϯ ʢෳࡶͳϢʔβʔͷ׆ಈɾۀ຿஌ࣝʣ ରԠ͢Δ

  33. υϝΠϯϞσϧͱ͸ಛఆͷਤͰ͸ͳ͘ɺ ਤ͕఻͑Α͏ͱ͍ͯ͠Δߟ͑ํͰ͋Δ Eric Evans ஫ҙʂʂ

  34. υϝΠϯϞσϧ͸UMLΫϥεਤ ։ൃͷ࠷ॳʹҰؾʹ࡞ͬͯऴΘΓ Α͋͘Δޡղ

  35. ௒ॏཁ 1. ͓٬͞Μͷۀ຿ͷษڧ 2. γεςϜԽର৅ྖҬͷ֓೦ͷ੔ཧ 3. ॏཁͳ֓೦͔ΒϞσϧΛ࡞੒ ๏ γεςϜԽର৅ྖҬ͚ͩͰ͸ͳ͘ɺͦͷपลͷ஌ࣝ΋ؚΊΔ ๏

    γεςϜʹஔ͖׵͑ͨΒͲ͏ͳΔ͔ʁ͸ߟ͑ͳ͍Α͏ʹ͢Δ ๏ ໊ࢺɺಈࢺΛத৺ʹ ๏ ʮ΋ͷʯ͚ͩͰͳ͘ɺϓϩηεʹ΋ண໨͢Δ ๏ ͍͖ͳΓ׬ᘳͳϞσϧ͸ग़ͯ͜ͳ͍ͱׂΓ੾Δ͜ͱ͕େ੾
  36. ᶄઃܭύλʔϯͷద༻

  37. υϝΠϯϞσϧ ιʔείʔυ ϞσϧͷҙਤΛ ίʔυʹ൓өͤ͞Δ ઃܭύλʔϯͱ͸…

  38. 1. ΤϯςΟςΟ 2. ஋ΦϒδΣΫτ 3. αʔϏε

  39. ΤϯςΟςΟ ಉҰੑΛ࣋ͬͨϞσϧཁૉʹద༻ ର৅ͷଐੑ͚ͩͰ͸ ൺֱͰ͖ͳ͍ੑ࣭

  40. ར༻ऀ ໊લ΍೥ྸΛൺֱͯ͠΋ ಉҰਓ෺͔൑ఆͰ͖ͳ͍

  41. public class User { private final Long id; private String

    firstName; private String lastName; public Person(Long id, String firstName, String lastName) { … } public boolean isIdentifiedBy(Person otherPerson) { return this.id == otherPerson.id; } } ҰҙʹͳΔID IDΛ༻͍ͯ ಉҰੑΛൺֱ͢Δ ϝιου
  42. ஋ΦϒδΣΫτ ಉ஋ੑΛ࣋ͬͨϞσϧཁૉʹద༻ ଐੑ͚ͩͰಉҰͳͷ͔ ൺֱͰ͖Δੑ࣭

  43. ϖʔδ਺ දݱ͍ͯ͠Δ஋ͷΈͰ ಉҰͳͷ͔൑ఆͯ͠΋໰୊ͳ͍ 10ϖʔδ == 10ϖʔδ true 10ϖʔδ == 20ϖʔδ

    false
  44. public class NumberOfPages { private final int number; public NumberOfPages(int

    value) { … } public boolean isSameValueAs(NumberOfPages otherValueObject) { return this.number == otherValueObject.number; } } ϑΟʔϧυͷ஋Λ࢖༻͠ ಉ஋ੑΛൺֱ͢Δϝιου ҰҙʹͳΔID͸࣋ͨͳ͍
  45. αʔϏε υϝΠϯ಺ͷखଓ͖Λදݱ͢Δ ಛఆͷ֓೦ʹඥ͔ͮͣɺ ϓϩηεͷΈʹؔ৺͕͋Δ

  46. ି͠ग़͠ ಛఆͷ֓೦ʹඥ͔ͮͣ ϓϩηεͷΈΛද͢

  47. public class RentalService { // ૹۚ public static Rental rentalBook(

    User rentalUser, Book rentalBook) { // ି͠ग़ͤΔ͔֬ೝ if (!RentalPolicy.canRental(rentalUser, rentalBook)) throw new IllegalArgumentException(); // ି͠ग़͢ Rental rental = rentalUser.rental(rentalBook); return rental; } } Ϋϥεϝιου ͱ࣮ͯ͠૷͠ಛఆͷ֓೦͔Β෼཭
  48. ᶅ υϝΠϯ૚ͷ࡞੒

  49. ෳࡶͳϏδωεΛදݱ͢Δίʔυ͕ ଞͷٕज़ཁૉͷίʔυͱࠞ͟Δ

  50. Θ͔Γʹ͍͘ίʔυͷग़དྷ্͕Γ ௿ڽू౓ɺີ݁߹...

  51. υϝΠϯϞσϧʹΑΓಋ͖ग़͞ΕΔ ίʔυΛଞͷٕज़ྖҬ͔Βִ཭

  52. ϔΩαΰφϧΞʔΩςΫνϟ

  53. ۀ຿Λද͢ίʔυ

  54. fintan.jp

  55. ݁ՌͲ͏ͩͬͨʁ

  56. ᶃ ཧղ͠΍͍͢ίʔυ

  57. ର৅ۀ຿ʢυϝΠϯʣ ͷݴ༿ ίʔυ

  58. ҙਤΛදݱ͢Δίʔυ

  59. ։ൃ଎౓޲্ ෆ۩߹ൃੜΛ཈੍

  60. ᶄίϛϡχέʔγϣϯίετͷ௿ݮ

  61. ϝϯόશһ͕ ಉ͡υϝΠϯϞσϧΛݩʹ ։ൃ͢Δ

  62. ϝϯόશһ͕ ଊ͍͑ͯΔۀ຿Ϟσϧ͕ ಉ͡

  63. ݴ༿ɾߟ͑ํ͕ ཧղͰ͖Δ

  64. ίʔυʹԿΛՃ͑ͨͷ͔ʁ ίʔυΛͲ͏มߋͨ͠ͷ͔ʁ ͳͥͦΕΛ΍ͬͨͷ͔ʁ ϚʔδϦΫΤετ ·ΔͰࣗ෼͕࡞ۀͨ͠ͷ͔ͷΑ͏ʹ ෼͔Δ

  65. ᶅ มߋͷӨڹൣғ͕͙͢ʹ෼͔Δ

  66. ࠓ·Ͱ ཁٻͷมԽ ⬇ ίʔυʹͲΜͳӨڹ͕ग़ΔͩΖ͏͔ʁ

  67. υϝΠϯۦಈઃܭಋೖޙ ཁٻͷมԽ ⬇ զʑ͕ଊ͍͑ͯΔۀ຿Ϟσϧ͸ Ͳ͏มԽ͢ΔͷͩΖ͏͔ʁ

  68. ΩϟϦΞ࠾༻ͷ ͓஌Βͤ

  69. fintan.jp

  70. ͋Γ͕ͱ͏ ͍͟͝·ͨ͠ʂ