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

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

Honya
May 18, 2019

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

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

Honya

May 18, 2019
Tweet

Other Decks in Technology

Transcript

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

    View Slide

  2. ຊ୩ɹ྄հ

    View Slide

  3. ෳࡶੑͱͷઓ͍

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  11. ֦ுੑ
    มߋ༰қੑ

    ҡ࣋͢Δͷ͕೉͍͠ʂ

    View Slide

  12. Ͳ͏ͯ͜͠͏ͳΔʁ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  16. ResultDto
    Data
    doExecute

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  20. υϝΠϯۦಈઃܭ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  35. ௒ॏཁ
    1. ͓٬͞Μͷۀ຿ͷษڧ
    2. γεςϜԽର৅ྖҬͷ֓೦ͷ੔ཧ
    3. ॏཁͳ֓೦͔ΒϞσϧΛ࡞੒
    ๏ γεςϜԽର৅ྖҬ͚ͩͰ͸ͳ͘ɺͦͷपลͷ஌ࣝ΋ؚΊΔ
    ๏ γεςϜʹஔ͖׵͑ͨΒͲ͏ͳΔ͔ʁ͸ߟ͑ͳ͍Α͏ʹ͢Δ
    ๏ ໊ࢺɺಈࢺΛத৺ʹ
    ๏ ʮ΋ͷʯ͚ͩͰͳ͘ɺϓϩηεʹ΋ண໨͢Δ
    ๏ ͍͖ͳΓ׬ᘳͳϞσϧ͸ग़ͯ͜ͳ͍ͱׂΓ੾Δ͜ͱ͕େ੾

    View Slide

  36. ᶄઃܭύλʔϯͷద༻

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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Λ༻͍ͯ
    ಉҰੑΛൺֱ͢Δ
    ϝιου

    View Slide

  42. ஋ΦϒδΣΫτ
    ಉ஋ੑΛ࣋ͬͨϞσϧཁૉʹద༻
    ଐੑ͚ͩͰಉҰͳͷ͔
    ൺֱͰ͖Δੑ࣭

    View Slide

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

    View Slide

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

    }
    public boolean isSameValueAs(NumberOfPages otherValueObject) {
    return this.number == otherValueObject.number;
    }
    }
    ϑΟʔϧυͷ஋Λ࢖༻͠
    ಉ஋ੑΛൺֱ͢Δϝιου
    ҰҙʹͳΔID͸࣋ͨͳ͍

    View Slide

  45. αʔϏε
    υϝΠϯ಺ͷखଓ͖Λදݱ͢Δ
    ಛఆͷ֓೦ʹඥ͔ͮͣɺ
    ϓϩηεͷΈʹؔ৺͕͋Δ

    View Slide

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

    View Slide

  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;
    }
    }
    Ϋϥεϝιου
    ͱ࣮ͯ͠૷͠ಛఆͷ֓೦͔Β෼཭

    View Slide

  48. ᶅ υϝΠϯ૚ͷ࡞੒

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  53. ۀ຿Λද͢ίʔυ

    View Slide

  54. fintan.jp

    View Slide

  55. ݁ՌͲ͏ͩͬͨʁ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  66. ࠓ·Ͱ
    ཁٻͷมԽ

    ίʔυʹͲΜͳӨڹ͕ग़ΔͩΖ͏͔ʁ

    View Slide

  67. υϝΠϯۦಈઃܭಋೖޙ
    ཁٻͷมԽ

    զʑ͕ଊ͍͑ͯΔۀ຿Ϟσϧ͸
    Ͳ͏มԽ͢ΔͷͩΖ͏͔ʁ

    View Slide

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

    View Slide

  69. fintan.jp

    View Slide

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

    View Slide