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

モデル駆動型開発によるビジネスをソフトウェアに落し込む1つのやり方

 モデル駆動型開発によるビジネスをソフトウェアに落し込む1つのやり方

BPStudy#141〜DDD(Domain Driven Design)実践の現場
https://bpstudy.connpass.com/event/128410/
にてお話した際のプレゼン資料です。

最近、ドメイン駆動設計を活用して開発を実施されている所が増えているのではないかと思いますが、まだまだ事例等の情報が少ないと思います。

株式会社アクティア は、「モデル駆動開発でソフトウェア開発を効率化しよう!」 をキーワードにモデリングを活用したソフトウェア開発を実現させようという企業です。

我々は、モデル駆動開発を進めていく中で、ドメイン駆動設計や増田さんに出会いました。

現在、我々の開発方法の中にはドメイン駆動設計の考え方が組み込まれ、活用しながら日々ソフトウェア開発を実施していま す。

ドメイン駆動設計の実践例として、我々のやり方が1つの参考になればと思いますので、ご紹介いたします。

#モデル駆動型開発 #ドメイン駆動設計 #DDD #ユビキタス言語 #ドメインモデル貧血症

KentaroTakasaki

May 29, 2019
Tweet

More Decks by KentaroTakasaki

Other Decks in Programming

Transcript

  1. ϏδωεΛ
    ιϑτ΢ΣΞ
    Ϟσϧۦಈܕ։ൃ
    ʹΑΔ
    ΍Γํ
    ̍
    ͭ
    ʹམ͠ࠐΉ
    ͷ

    View Slide

  2. 増田流

    %%%





    View Slide

  3. ޻ۀత
    Ͱ͸ͳ͘ɺ

    View Slide

  4. ޻ܳత

    View Slide

  5. υϝΠϯ஌ࣝ


    ਪ͠ͷϢχϑΥʔϜΛ
    ணͯొஃ͢Δ͜ͱ

    View Slide

  6. ߴ

    ݈


    גࣜձࣾΞΫςΟΞɹ$00
    %%%"MMJBODFओ࠵
    ঊक़ɹक़௕
    Ϟσϧϕʔειϑτ΢ΣΞ։ൃίϛϡχςΟओ࠵
    Α͜͸·Ϋϥ΢υษڧձओ࠵
    ,FOUBSP5","4",*
    ̘ 0 ̤

    View Slide

  7. ɹഎܠ
    ɹݴ༿Λڞ༗
    ɹශ݂ͱͷઓ͍

    View Slide

  8. 背景

    View Slide

  9. υϝΠϯͷഎܠΛ஌Δ

    View Slide

  10. A c t i e r
    A c t i e r גࣜձࣾΞΫςΟΞ
    ॴࡏ஍ɹɹɹɿɹ౦ژ౎தԝ۠೔ຊڮງཹொ
    ઃཱɹɹɹɹɿɹ೥ɹ݄

    ϗʔϜϖʔδɿɹIUUQXXXBDUJFSDPKQ
    ैۀһ਺ɹɹɿɹ໊ʢऔక໾ؚΉʣ
    ΍ͬͯΔ͜ͱɿɹϞσϧۦಈܕ։ൃ΍%%%Λ׆͔ͨ͠
    ιϑτ΢ΣΞ։ൃ

    View Slide

  11. A c t i e r
    A c t i e r גࣜձࣾΞΫςΟΞ
    +BWB✕%%%
    ͷೱ͍؀ڥ
    ࣾһืूதʂ

    View Slide

  12. 世 界
    大炎上

    View Slide

  13. ͳͥɺ
    ϓϩδΣΫτ
    ͸
    Ԍ্͢Δͷ͔ʁ

    View Slide

  14. ૊৫΍ਓ
    Ϛωδϝϯτͷࣦഊ
    ϓϩηε
    ϦεΫίϯτϩʔϧͷܽ೗
    ιϑτ΢ΣΞͷෳࡶੑ
    มԽ΁ͷରԠ
    ʲ༷ʑͳཧ༝ʳ
    FUD

    View Slide

  15. ෳࡶ
    ʲٕज़తʹରԠͰ͖ΔॴΛɺ෼͔Γ΍͘͢ʳ
    γϯϓϧ

    View Slide

  16. ʲϞσϦϯάʳ
    ސ٬
    ސ٬*%

    ސ٬໊
    ஫จ
    ஫จ*%

    ஫จ೔
    ܾࡋ
    ΫϨδοτΧʔυ ݱۚ
    ͋Δ෺ମ΍ࣄ৅ʹ͍ͭͯண໨͍ͯ͠Δಛ௃΍ɺಉछͷෳ਺ͷର৅ʹڞ௨͢Δੑ࣭Λநग़͠ɺ
    ࠣ຤ͳࡉ෦Λ؆ུԽͨ͠ந৅తͳ໛ܕʢϞσϧʣΛ࡞੒͢Δ͜ͱɹʢF8PSETΑΓʣ
    Ϋϥεਤ
    ϞσϧΛ࡞Δ͜ͱͰ෼͔Γ΍͘͢͢Δ

    View Slide

  17. ʲ৭ʑͳϞσϦϯάʳ
    ϦϨʔγϣϯۦಈཁ݅ఆٛʢ3%3"

    &3ਤ
    ϏδωεϞσϧɾΩϟϯόε

    View Slide

  18. Ϗδωε

    ཁٻ
    ʢυϝΠϯʣ
    ʲϏδωεͱιϑτ΢ΣΞͷဃ཭ʳ
    ιϑτ΢ΣΞ
    ʢιʔείʔυʣ
    Ϣʔβͷཁٻͱίʔυͷ
    ڑ཭͸ඇৗʹԕ͍ɻ
    ΤϯυϢʔβʹίʔυ͸ཧղͰ͖ͳ͍
    Ϗδωε

    ཁٻ
    ʢυϝΠϯʣ
    ιϑτ΢ΣΞ
    ʢιʔείʔυʣ
    தؒ
    ੒Ռ෺
    தؒ੒Ռ෺͕͋ΔͱϢʔβ΋ཧղ͠΍͘͢
    ࠷ऴతͳΠϝʔδΛڞ༗͠΍͍͢

    View Slide

  19. ʲϏδωε͔Βܨ͕ͬͨ։ൃΛʳ

    View Slide

  20. υϝΠϯ༻ޠΛཧղ͢Δ

    View Slide

  21. ʲϞσϧۦಈܕ։ൃ .%"
    ஌ͬͯ·͢ʁʳ
    .%"

    View Slide

  22. Ϟσϧۦಈܕ։ൃ .%"
    ͱ͸ʁ
    ɾϞσϦϯάݴޠΛ୯ͳΔσβΠϯͰ͸ͳ͘ɺϓϩάϥϛϯάݴޠʹ͍ۙܗͰ࢖͏
    ɾϞσϧத৺Ͱ։ൃ͢Δ͜ͱͰɺੜ࢈ੑ޲্ɺ඼࣭޲্ɺઃܭͷ࠶ར༻ͱ͍ͬͨ͜ͱʹ

    ɹΞϓϩʔν͢Δख๏
    $*.

    $PNQVUBUJPO*OEFQFOEFOU.PEFM

    1*.

    1MBUGPSN*OEFQFOEFOU.PEFM
    14.

    1MBUGPSN4QFDJpD.PEFM

    14.

    1MBUGPSN4QFDJpD.PEFM

    $0%&
    $0%&
    $*.
    ίϯϐϡʔλγεςϜ͔Βಠཱͨ͠Ϟσϧɻ
    ϏδωεϞσϧ΍ސ٬ཁٻͳͲͷϞσϧɻ
    1*.
    ϓϥοτϑΥʔϜಠཱϞσϧɻ
    $*.ΛγεςϜͱ࣮ͯ͠ݱ͢ΔͨΊʹ෼ੳ΍ઃܭ
    ΛߦͬͨϞσϧɻ
    14.
    ϓϥοτϑΥʔϜݻ༗Ϟσϧɻ
    1*.ʹϓϩάϥϛϯάݴޠɺϛυϧ΢ΣΞͳͲʹ
    ಛԽͨ͠ઃܭɺ࣮૷ʹ͍ۙཁૉΛೖΕͨϞσϧɻ
    $0%&
    ࣮ߦ͞ΕΔϓϩάϥϛϯάɻ
    package jp.co.actier.mars.concept.m2m.d3.acceleo.lib;
    import org.eclipse.emf.common.util.BasicEList;

    import org.eclipse.emf.common.util.EList;
    public class Uml2Util {
    public EList attributeAll(Class clazz) {
    EList attributes = new BasicEList();
    if (clazz.getSuperClasses() != null)
    for (Class parent : clazz.getSuperClasses())
    attributes.addAll(attributeAll(parent));
    attributes.addAll(clazz.getOwnedAttributes());
    return attributes;
    }
    }
    Ϟ

    σ

    ϧ

    ʹ

    ू




    Խ
    ʹ
    Α
    Δ

    ॿ
    ΞΧ΢ϯτ
    σΟϥʔ
    受付୲౰
    企ը୲౰

    View Slide

  23. ʲݴޠͷྺ࢙͸ந৅౓্͕͕͍ͬͯΔʳ
    ࣌ؒͱϓϥοτϑΥʔϜ
    ந

    ৅


    Ϛγϯޠ

    ͱͷූ߸
    ΞηϯϒϦݴޠ

    Ξηϯϒϥ
    ୈੈ୅ݴޠ

    $0#0-

    $

    ΦϒδΣΫτࢦ޲

    ୈੈ୅ݴޠ

    +BWBɹ$

    3VCZɹ1ZUIPO

    Ϟσϧۦಈ։ൃ

    ϝΠϯϑϨʔϜͷ࣌୅ 1$ͷ࣌୅ Πϯλʔωοτͷ࣌୅ Ϋϥ΢υͷ࣌୅
    ɾΑΓίϯϐϡʔλ͔Βਓؒܥ΁
    ɾϓϥοτϑΥʔϜ͕ෳࡶʹͳΔதɺϓϥοτϑΥʔϜͱͷ෼཭͕ඞཁ

    View Slide

  24. ʲۜͷ஄ؙ͸ͳ͍ʂʳ
    υϝΠϯۦಈઃܭͩͬͯ
    ͦ͏
    1IPUPDSFEJUNPOFZNFUBMTPO7JTVBMIVOU$$#:

    View Slide

  25. ഇΕΔ
    1IPUPDSFEJUTBUHVSVPO7JTVBMIVOU$$#:

    View Slide

  26. ʲͳͥɺഇΕͨʳ
    ࢓༷͕ϑϫοͱ͍ͯͨ͠
    ཧ૝తա͗ͯϑϫοͱ͍ͯͨ͠

    ֤ϕϯμʔ͝ͱͰ࣮૷͕ϑϫο
    ͱ͍ͯͨ͠

    View Slide

  27. े೥
    Ұੲ

    View Slide

  28. ʲ"*ͷϒʔϜ΋Կճ͔ʳ


    ୈҰ࣍"*ϒʔϜ
    ʢਪ࿦ɾ୳ࡧʣ
    ୈೋ࣍"*ϒʔϜ
    ʢ஌ࣝ޻ֶʣ
    ୈࡾ࣍"*ϒʔϜ
    ʢػցֶशɾදݱֶशʣ
    &-*;"
    %FFQ#MVF "MQIB(P
    4JSJ
    %FFQ.JOE
    8BUTPO
    σΟʔϓϥʔχϯά
    ػցֶश
    Ϗοάσʔλ
    ΢Σϒ
    ΤΩεύʔτγεςϜ
    .ZDJO
    %FOESBM
    ϒʔϜͷͨͼʹਐԽ͍ͯ͠Δ

    View Slide

  29. υϝΠϯۦಈઃܭ΍ΦϒδΣΫτࢦ޲͕
    ࠶ͼ΍͖͍ͬͯͯΔʁ


    6.-
    ϒʔϜ
    υϝΠϯۦಈઃܭϒʔϜ
    དྷͯΔͰ͠ΐʂʂ
    #14UVEZ
    ʙ%%% %PNBJO%SJWFO%FTJHO

    ɹ࣮ફͷݱ৔
    ໊௒͑Ͱ
    ձ৔มߋʂ

    View Slide

  30. ʲϞσϧۦಈܕ։ൃͷ͍͍ͱ͜Ζʳ
    Ϗδωεཁ݅ͱϓϩάϥϜͷ෼཭
    ϓϩάϥϜͷۉ࣭Խ

    ࣗಈੜ੒ʹΑΔੜ࢈ੑ޲্

    View Slide

  31. NBST
    ਓྨ͕࣍ʹ౸ୡ͢ΔͰ͋Ζ͏੕

    View Slide

  32. ʲΞΫςΟΞ೥දʳ


    ˒
    ೥݄
    ΞΫςΟΞ஀ੜ
    A c t i e r
    A c t i e r
    ˒
    ೥݄
    ߴ࡚ࢀը
    ઌۦऀͱͷܨ͕ΓΛ
    ͔͚Δ͘ΜʹͯυϝΠϯۦಈઃܭ࣮ݧ
    %%%"MMJBODFओ࠵
    ˒
    ೥݄ࠒ
    ૿ా͞Μͱܨ͕Δ

    NBSTΛ࢖͍֤छҊ݅ͰɺεϞʔϧΦϒδΣΫτઃܭ΍υϝΠϯۦಈઃܭͱϞσϧۦಈΛ׆༻
    Ϟσϧϕʔειϑτ΢ΣΞ։ൃίϛϡχςΟओ࠵

    View Slide

  33. ৭ʑͳϊ΢ϋ΢΍ߟ͑ํΛ
    Ϟσϧۦಈ։ൃͷதʹ
    औΓࠐΜͰ͍ͬͨ
    ·ͨɺͭͳ͕Γ΋Ͱ͖ͨ
    ʲઌۦऀͱܨ͕ΔதͰֶͼΛʳ

    View Slide

  34. ʲ౰ॳऔ૊ΜͰ͍ͨϞσϧۦಈ։ൃʳ
    ސ٬
    ސ٬*%

    ސ٬໊
    ஫จ
    ஫จ*%

    ஫จ೔
    ܾࡋ
    ΫϨδοτΧʔυ ݱۚ
    6.-Ϋϥεਤ
    ࣗಈੜ੒
    ιʔείʔυ
    ɾάϥϑΟΧϧͩͱύοͱݟͰ෼͔Γ΍͍͕͢ɺࠩ෼؅ཧ͕೉͍͠
    ɾ੩తߏ଄͸දݱ͠΍͍͕͢ɺಈతߏ଄ʢৼΔ෣͍ʣ͕දݱ͠ʹ͍͘

    View Slide

  35. ͍͍
    ઃܭ
    ͬͯɺͳΜͩΖ͏ʁ
    ʲϑϫοͱͤ͞ͳ͍ͨΊʹʳ

    View Slide

  36. ʲϞσϧۦಈܕ։ൃͷ࣮ݱੑΛߴΊΔʳ
    औΓೖΕͨυϝΠϯۦಈઃܭ

    View Slide

  37. ʲ෼ੳɾઃܭͷτϨʔχϯάΛఏڙʳ
    $






    $


    %!
    $


    $


    $

    %!

    $
    "#
    A c t i e r
    A c t i e r
    ૿ా͞Μͱڞʹʲ෼ੳɾઃܭʳΛ௥ٻ

    View Slide

  38. ʲ͍͍ઃܭʳ
    ਐԽͱ
    ੒௕Λଓ͚ΒΕΔ
    มߋ͕
    ָͰ
    ҆શ
    ෳࡶ͞
    ʹཱͪ޲͔͑Δ

    View Slide

  39. ʲݱஈ֊ͷNBSTʳ
    ϓϨθϯςʔγϣϯ૚
    ΞϓϦέʔγϣϯ૚
    σʔλιʔε૚
    υϝΠϯ૚
    ɾ%4-ͱͯ͠ϞσϧΛهड़
    ɾυϝΠϯʹϑΥʔΧε࣮ͯ͠૷
    ɾ%4-͔ΒυΩϡϝϯτ΋ੜ੒
    ɾ+BWBɺTQSJOHͰͷੜ੒
    ɾ֊૚͸௨ৗϓϩάϥϛϯά
    ˰কདྷతͳτϥΠϙΠϯτ

    View Slide

  40. ʲ%4-Πϝʔδʳ
    /**
    * ঎඼(ࢴ)
    */
    package jp.xx.xxx.xxx.domain.model.item.paper
    /** ঎඼ʢࢴʣ */
    listType PaperItems
    /** ࢴ঎඼ϦϏδϣϯ */
    longType Revision
    /** ࢴ঎඼ */
    object PaperItem {
    ItemCode itemCode
    ChartType chartType {required}
    ItemDescription itemDescription
    Revision revision
    Publication publication
    SalesUnitPrice salesUnitPrice
    StockControl stockControl
    def ItemCode itemCode(){
    return itemCode
    }
    def SalesUnitPrice salesUnitPrice() {
    salesUnitPrice
    }
    %4-
    ύοέʔδߏ੒΍ιʔε
    ϘΠϥʔςϯϓϨʔτͳ
    ίʔυΛҙࣝͤͣʹࡁΉ
    ʢίϐϖΛແ͘͠ਓతϛεΛݮΒ͢ʣ

    Α͋͘Δࣗಈੜ੒ܥͱͷࠩผԽͱͯ͠
    Մಡੑͷ͋Διʔεʹ߆Δ
    ϞσϦϯάͱͯ͠
    ਓ͕஫ྗ͢΂͖ͱ͜Ζ͚ͩ
    ࣗಈੜ੒

    View Slide

  41. ʲυΩϡϝϯτΠϝʔδʳ
    ϢʔεέʔεͷҰཡʹΑΓ
    ͲΜͳػೳ͕͋Δͷ͔ɺ
    ͲΜͳϝιου΍ґଘؔ܎͕෼͔Δ͜ͱͰ
    ၆ᛌͯ͠ػೳΛ೺ѲͰ͖Δ
    VTFDBTFɺSFQPTJUPSZͱ͍ͬͨ

    ΩʔϫʔυʹΑͬͯΫϥεͷ໾ׂΛ໌֬ʹ͢Δͱ
    ڞʹΞϊςʔγϣϯͳͲͷ
    ϘΠϥʔςϯϓϨʔτͳίʔυ͸ࣗಈੜ੒
    Ϟσϧʢ%4-ʣ͔Β
    ੜ੒͞ΕΔ͜ͱͰ
    ௠෗Խ͠ͳ͍
    usecase
    repository

    View Slide

  42. 言葉

    共有

    View Slide

  43. ௨͡ͳ͍ࢥ͍

    View Slide

  44. ϢϏΩλεݴޠ
    ίϯςΩετϚοϓ
    ஋ΦϒδΣΫτ
    ίΞυϝΠϯ
    ڥք͚ͮΒΕͨίϯςΩετ
    ू໿
    ɾɾɾ
    ϦϙδτϦ
    ʲ%%%΋ݴ༿͕ͨ͘͞Μʳ

    View Slide

  45. ʲݴ༿ͷဃ཭ʳ
    Ϗδωε
    υϝΠϯ
    ιϑτ΢ΣΞ
    ʢιʔείʔυʣ
    Ϟσϧ
    υϝΠϯΤΩεύʔτ͸ɺ
    ιϑτ΢ΣΞ։ൃʹ͓͚Δٕज़తͳઐ໳༻ޠͷ͜ͱ͸෦෼తʹ͔͠ཧղͤͣɺ
    ୅ΘΓʹࣗ෼ͷಘҙ෼໺ͷઐ໳༻ޠΛ࢖༻͢Δ
    υϝΠϯ
    ΤΩεύʔτ
    ։ൃऀ͸ɺ
    γεςϜΛཧղͯٞ͠࿦͢Δࡍʹɺػೳʹؔ͢Δઆ໌తͳ༻ޠΛ༻͍Δ͔΋͠
    Εͳ͍͕ɺ͜͏ͨ͠༻ޠ͸υϝΠϯΤΩεύʔτͷݴޠ͕͍࣋ͬͯͨҙຯΛܽ
    ͍ͯ͠·͍ͬͯΔɻ͋Δ͍͸ɺ։ൃऀʹΑΔந৅Խ͸ɺࣗ෼ͨͪͷઃܭΛࢧ͑
    ͯ͸͍ͯ΋ɺυϝΠϯΤΩεύʔτʹ͸ཧղ͞Εͳ͍͔΋͠Εͳ͍
    ։ൃऀ
    ݴ༿ͷؒʹ͸ʲஅઈʳ͕͋Δ

    View Slide

  46. ʲஅઈ͕͋Δ͜ͱͰͷฐ֐ʳ
    Ϗδωε
    υϝΠϯ
    ιϑτ΢ΣΞ
    ʢιʔείʔυʣ
    Ϟσϧ
    υϝΠϯ
    ΤΩεύʔτ
    ։ൃऀ
    ݴ༿͕௨༷ͨ͡Ͱ௨͍ͯ͡ͳ͍
    ٞ࿦ͷ༻ޠͱίʔυͷ༻ޠ͕Ұக͠ͳ͍

    ௨༁͢Δͷʹ༨෼ͳ࿑ྗ͕͋Δ

    View Slide

  47. ʲϢϏΩλεݴޠʳ
    Ϗδωε
    υϝΠϯ
    ιϑτ΢ΣΞ
    ʢιʔείʔυʣ
    Ϟσϧ
    υϝΠϯ
    ΤΩεύʔτ
    ։ൃऀ
    ϞσϧΛݴޠͷࠎ֨ͱ͢Δ
    ͢΂ͯͷίϛϡχέʔγϣϯͱίʔυʹɺͦͷݴޠΛ
    ݫ֨ʹ༻͍Δ

    ݴޠʹ໰୊͕͋Ε͹୅ΘΓͱͳΔݴ༿Λ୳͠ɺϞσϧ
    Λ৽ͯ͘͠͠ίʔυΛϦϑΝΫλϦϯά͢Δ
    ݴޠʢݴ༿ʣ
    Ұ؏ͨ͠ݴޠʢݴ༿ʣͰڞ༗

    View Slide

  48. ʲΑ͘ߟ͑Δͱʳ
    ϢϏΩλεݴޠ
    ༻ޠू
    ʺ

    View Slide

  49. ʲ࣮ྫʳ
    ϢϏΩλεݴޠ
    ΍Β͔ͪ͠·ͬͨ
    ͋Δ͋Δ

    View Slide

  50. ༻ޠूʹͯ͠
    ϝϯς
    ͞Εͣɻɻɻ
    ʲ࣮ྫᶃʳ

    View Slide

  51. ʲ࣮ྫᶄʳɹνʔϜߏ੒
    όοννʔϜ
    ը໘νʔϜ
    ސ٬

    View Slide

  52. όοννʔϜ
    ը໘νʔϜ
    ސ٬
    υϝΠϯ
    ʲυϝΠϯΛूΊͯڞ༗͍ͨ͠ʳ

    View Slide

  53. ʲนҰ໘ͷϢϏΩλεݴޠʁʳ
    http://www.flickr.com/photos/vfsdigitaldesign/5396094193
    ˞ࣸਅ͸ΠϝʔδͰ͢
    ϝϯς
    ͞Εͣɻɻɻ

    View Slide

  54. υϝΠϯΤΩεύʔτ΍

    νʔϜϝϯόͱͷ
    ର࿩ʹΑΓ
    Λ࢈Έग़͢
    ϢϏΩλεݴޠ

    View Slide

  55. ର࿩ͰϢϏΩλεݴޠ

    View Slide

  56. ʲର࿩Λ͢ΔͨΊʹʳ
    ۀछͦͷ΋ͷΛֶͿ
    ސ٬ͷυϝΠϯΛֶͿ
    Ұൠۀ຿஌ࣝΛֶͿ

    View Slide

  57. ൢച؅ཧ

    View Slide

  58. ʲ෼͔Βͳ͍ݴ༿Λ੔ཧʳ
    Ұൠۀ຿஌ࣝΛֶͿ
    8FCͰௐ΂Δ

    View Slide

  59. "7$4
    ച্
    ిࢠւਤ
    ݟੵ
    ೲೖઌ
    &/$
    ɾɾɾ
    "%1
    ʲݴ༿͕ͨ͘͞Μʳ
    ધओ
    ધ۩঎
    ધഫ؅ཧձࣾ
    6,)0
    $IBSU$P
    ࢴւਤ
    ॻ੶
    ਫ࿏௨ใ

    View Slide

  60. ʲ෼͔Βͳ͍ݴ༿Λ੔ཧʳ
    ۀछͦͷ΋ͷΛֶͿ
    8FCͰௐ΂Δ
    ࣮෺Λ௖͍ͯ೺Ѳ͢Δ

    View Slide

  61. ʲ෼͔Βͳ͍ݴ༿Λ੔ཧʳ
    Ϗδωεͷ֎؍Λଊ͑Δ
    ۀ຿Λ੔ཧ͢Δ
    ސ٬ͷυϝΠϯΛֶͿ

    View Slide

  62. ʲۀ຿Λ੔ཧ͢Δ࣌ͷख๏ʳ

    View Slide

  63. ʲݴ༿Λ੔ཧ͢ΔதͰؾΛ͚ͭͨϙΠϯτʳ
    ɾʮݴ༿ʯʹ߆Δ
    ɾ൪߸΍໊લͱ͍ͬͨΞΠσϯςΟςΟͷൃݟ
    ɾ࣠ʢίΞʣͱͳΔ΋ͷͷީิͷൃݟ
    ɾίϨΫγϣϯͷൃݟ
    ɾ۠෼ͷൃݟ
    ɾҰ඼෺Λ࡞Δ

    View Slide

  64. ʲ࣮ྫɿ۠෼Λൃݟʳ
    ݴޠ*%
    +1ɺ+#ɺ64ɺ*.ɺ,3ɺ05ɺ
    $.ɺ&/$ɺ"7$4ɺ"%1ɺ
    F/1ɺ$$ɺɾɾɾ

    View Slide

  65. ʲ࣮ྫɿ۠෼Λൃݟʳ
    ݴޠ*%
    +1ɺ+#ɺ64ɺ*.ɺ,3ɺ05ɺ
    $.ɺ&/$ɺ"7$4ɺ"%1ɺ
    F/1ɺ$$ɺɾɾɾ
    ࠃʁ
    ঎඼ʁ
    ࢓ೖઌʁ

    View Slide

  66. ʲ݁Ռɿ۠෼Λൃݟʳ
    ݴޠ*%
    +1ɺ+#ɺ64ɺ*.ɺ,3ɺ05ɺ
    $.ɺ&/$ɺ"7$4ɺ"%1ɺ
    F/1ɺ$$ɺɾɾɾ
    Ϗδωε
    υϝΠϯ
    ιϑτ΢ΣΞ
    ʢιʔείʔυʣ
    Ϟσϧ
    υϝΠϯ
    ΤΩεύʔτ
    ։ൃऀ
    ݴޠ*%
    ϢϏΩλεݴޠ
    ͱͳͬͨ

    View Slide

  67. ʲ࣮ྫɿϢϏΩλεݴޠͷબ୒ϛεʳ
    ސ٬ ધओ
    Photo credit: ukCWCS on VisualHunt.com / CC BY Photo on VisualHunt.com

    ʁ ʁ

    View Slide

  68. ʲ࣮ྫɿϢϏΩλεݴޠͷબ୒ϛεʳ
    ސ٬ ધओ
    Photo credit: ukCWCS on VisualHunt.com / CC BY Photo on VisualHunt.com

    View Slide

  69. ʲ࣮ྫɿϢϏΩλεݴޠͷબ୒ϛεʳ
    ސ٬ ધओ
    Photo credit: ukCWCS on VisualHunt.com / CC BY Photo on VisualHunt.com

    View Slide

  70. ʲ஋ΦϒδΣΫτʳ
    ͋ΔϞσϧཁૉʹ͍ͭͯɺͦͷଐੑ͔ؔ͠৺ͷର৅ͱͳΒͳ͍ͷͰ͋Ε͹ɺ

    ͦͷཁૉΛ஋ΦϒδΣΫτͱͯ͠෼ྨ͢Δ͜ͱ
    ϢϏΩλεݴޠ͸ɺ

    ஋ΦϒδΣΫτʹͳΔ
    ࣗ෼͕఻͑ΔଐੑͷҙຯΛදݱͤ͞ɺؔ܎ͨ͠ػೳΛ༩͑Δ͜ͱ
    ෆมͳ΋ͷͱͯ͠ѻ͏͜ͱ
    ಉҰੑΛ༩͑ͣɺΤϯςΟςΟΛҡ࣋͢ΔͨΊʹඞཁͱͳΔෳࡶͳઃܭΛ
    ආ͚Δ͜ͱ

    View Slide

  71. ʲNBSTͰ஋ΦϒδΣΫτʳ
    longType
    integerType
    decimalType
    stringType
    enum
    enumType
    stringType CustomerId
    ܕ αϯϓϧ
    integerType SignedAmount {
    max: 100
    min: -100
    }
    enum Lang(String label) {
    JA("Japanese")
    EN('English')
    }
    enumType LangType {
    def boolean isJapanese() {
    this.value == Lang.JA
    }
    def boolean isEnglish() {
    this.value == Lang.EN
    }
    }
    listType
    ϑΝʔετΫϥείϨΫγϣϯΛؚΊ
    ஋ΦϒδΣΫτΛύλʔϯԽ
    object
    dateType
    dateType QuotationDate {
    format: 'yyyy-MM-dd'
    def static QuotationDate ofThreeMonthAgo(){
    new
    QuotationDate(LocalDate.now.minusMonths(3))
    }
    }

    View Slide

  72. /** ݴޠʢͨͩ͠ɺʮݴޠʯ͸௨ৗͷݴ༿ͱ͍͏ҙຯͰ͸ແ͍ͷͰ஫ҙɻࠃ΍঎඼෼ྨΛ૯শͨ͠΋ͷʣ */
    package jp.xx.xxx.xxx.domain.model.classification.language
    /** ݴޠID༻ͷྻڍࢠ */
    enum LanguageIdValue(঎඼छྨࣝผࢠ identifier, String description) {
    JP(঎඼छྨࣝผࢠ.ࢴ, "೔ຊ൛ͷࢴւਤɾॻ੶ʢൃߦݩɿ೔ຊਫ࿏ڠձ/ւ্อ҆ி/ւ্อ҆ڠձʣ")
    JB(঎඼छྨࣝผࢠ.ࢴ, "೔ຊ൛ͷࢴւਤɾॻ੶ʢൃߦݩɿJPҎ֎ʣ")
    US(঎඼छྨࣝผࢠ.ࢴ, "ถࠃ൛ͷࢴւਤɾॻ੶")
    IM(঎඼छྨࣝผࢠ.ࢴ, "IMOͷࢴւਤɾॻ੶ɾిࢠ")
    KR(঎඼छྨࣝผࢠ.ࢴ, "ؖࠃ൛ͷࢴւਤɾॻ੶")
    OT(঎඼छྨࣝผࢠ.ࢴ, "ͦͷଞͷࢴւਤɾॻ੶")
    CM(঎඼छྨࣝผࢠ.σδλϧ, “C-MAPిࢠւਤ")
    ENC(঎඼छྨࣝผࢠ.σδλϧ, "೔ຊ൛ిࢠւਤ")
    AVCS(঎඼छྨࣝผࢠ.σδλϧ, "UKHOిࢠւਤ")
    ADP(঎඼छྨࣝผࢠ.σδλϧ, "UKHOిࢠॻ੶")
    eNP(঎඼छྨࣝผࢠ.σδλϧ, "UKHOిࢠॻ੶")
    CC(঎඼छྨࣝผࢠ.σδλϧ, "ChartCo঎඼")
    def boolean isPaper() {
    this.identifier == ঎඼छྨࣝผࢠ.ࢴ
    }
    def boolean isDigital() {
    this.identifier == ঎඼छྨࣝผࢠ.σδλϧ
    }
    def boolean isAvcs() {
    this == AVCS
    }
    def boolean isAdp() {
    this == ADP
    }
    def boolean isEnp() {
    this == eNP
    }
    }
    /** ݴޠID */
    enumType LanguageId {
    def boolean isPaper() {
    value.isPaper()
    }
    def boolean isDigital() {
    value.isDigital()
    }
    def boolean isAvcs() {
    if (value === null) return false
    value.isAvcs
    }
    def boolean isAdp() {
    if (value === null) return false
    value.isAdp
    }
    def String name() {
    value.name
    }
    }
    listType LanguageIds {
    def static LanguageIds values() {
    var list = Arrays.asList(LanguageIdValue.values)
    var languageIds = list.map[id | new LanguageId(id)]
    new LanguageIds(languageIds)
    }
    def LanguageIds paper() {
    if (empty) return new LanguageIds
    var newList = list.filter[isPaper].toList
    new LanguageIds(newList)
    }
    def LanguageIds digital() {
    if (empty) return new LanguageIds
    var newList = list.filter[isDigital].toList
    new LanguageIds(newList)
    }
    ʲ࣮ྫɿݴޠ*%ΛNBSTͰදݱʳ
    Ϗδωε
    υϝΠϯ
    ιϑτ΢ΣΞ
    ʢιʔείʔυʣ
    Ϟσϧ
    υϝΠϯ
    ΤΩεύʔτ
    ։ൃऀ
    ݴޠ*%

    View Slide

  73. ʲϢϏΩλεݴޠΛදݱ͢Δ͜ͱͰʳ
    ֓೦΍༻ޠ͕ιʔεʹͳΓ

    ސ٬ͱΤϯδχΞͷؒͰ࿩͕௨͡΍͘͢ͳͬͨ
    ୯Ұ੹೚ʹͳΓ΍͘͢ιʔείʔυ͕؆ૉԽ͞ΕΔ
    ސ٬ͱର࿩͕ີʹͳΔ͜ͱͰɺސ٬ͷ৴པੑ΋޲্͠
    ϓϩδΣΫτӡӦʹ΋͍͍ӨڹΛ༩͑ͨ
    ΈΜͳ͕ݴ༿ʹ߆ΔΑ͏ʹͳͬͨ

    View Slide

  74. 貧血
    との
    戦い

    View Slide

  75. ൈ͚ΒΕͳ͍છΈ͍ͭͨ΍Γํ

    View Slide

  76. ʲ࣮ྫʳ
    υϝΠϯϞσϧ
    ΍Β͔ͪ͠·ͬͨ
    ͋Δ͋Δ

    View Slide

  77. ʲτϥϯβΫγϣϯεΫϦϓτʹͳΓ͕ͪʳ
    ϓϨθϯςʔγϣϯ૚
    ΞϓϦέʔγϣϯ૚
    σʔλιʔε૚
    υϝΠϯ૚
    ػೳຖʹ
    εΫϦϓτͷ༷ʹ
    ೖͬͯ໭ΔྲྀΕΛ
    ϕʔεʹ࡞ͬͯ͠·͏
    ঎඼ొ࿥ ച্ೖྗ ࢓ೖೖྗ
    ؔ৺ࣄ͕ೖग़ྗʹΑͬͨ

    ݁ՌɺυϝΠϯ૚͸
    ͨͩͷೖΕ෺ʹͳΓ͕ͪ

    View Slide

  78. ʲσʔλʢςʔϒϧઃܭʣ͔Β΍ͬͯ͘Δͱ

    ɹσʔλͷثʹͳΓ͕ͪʳ
    ϓϨθϯςʔγϣϯ૚
    ΞϓϦέʔγϣϯ૚
    σʔλιʔε૚
    υϝΠϯ૚
    ঎඼*% ঎඼໊ ఆՁ ࡏݿ؅ཧ
    +1 ೔ຊۙւ ͢Δ
    +1 ೔ຊԊ؛෦ ͢Δ
    #" ӳࠃۙւ ͠ͳ͍
    #" ӳࠃԊ؛෦ ͠ͳ͍
    ঎඼ςʔϒϧ
    طଘϓϩδΣΫτ͔Βͷ
    ϦϓϨΠεͩͱ
    ಛʹةͳ͍

    View Slide

  79. ʲ࣮ྫʳ
    ݁Ռ

    View Slide

  80. ʲυϝΠϯϞσϧශ݂঱ʳ
    ύοͱݟɺυϝΠϯϞσϧʹݟ͑Δ
    Θ͔ͣͳৼΔ෣͍͔͠ͳ͍

    ɹʹϏδωεϧʔϧ͕ॻ͔Ε͍ͯͳ͍

    ΦϒδΣΫτࢦ޲ઃܭͷجຊ֓೦

    ʢσʔλͱॲཧΛҰॹʹ͢Δʣͷਅٯ

    View Slide

  81. ʲࣦഊΛྐʹʳ
    ؕΓͬͺͳ͠͡Ό͍͚ͳ͍͕ɺ
    ɹɹɹɹɹɹɹɹͦΕ΋௨Δಓ

    View Slide

  82. Ϗδωεϧʔϧʹूத͢Δ

    View Slide

  83. ʲෳࡶ͞ɾ೉͠͞͸Ϗδωεϧʔϧʹ͋Δʳ







    ۀ຿ΞϓϦέʔγϣϯ։ൃͷෳࡶ͞ɾ೉͠͞͸ɺϏδωεϧʔϧʹ͋Δɻ
    ϏδωεՁ஋Λ࣮ݱ͢ΔͨΊʹϛογϣϯ΍ઓུɺ࣮ߦܭըΛܦͯઓज़͔Β

    ࣮ߦ΁ͱམͱ͠ࠐΜͰ͍͘தͰɺߦಈํ਑΍൑அج४ͱͳΔϧʔϧ͕

    ϏδωεϙϦγʔ΍Ϗδωεϧʔϧͱͯ͠Լࢧ͍͑ͯ͠·͢ɻ
    ͦͷϧʔϧͷൃݟɾ෼ੳɾ࣮૷ʹ࣠Λஔ͘͜ͱͰΞϓϦέʔγϣϯ੔ཧ͕

    ༰қʹͳΓ·͢ɻ
    ϏδωεϧʔϧΛൃݟɾ෼ੳ͠ɺ
    υϝΠϯϞσϧͱ࣮ͯ͠૷͍ͯ͘͠

    View Slide

  84. ʲҙࣝతʹυϝΠϯʹूதͯ͠ಠཱʳ
    ϓϨθϯςʔγϣϯ૚
    ΞϓϦέʔγϣϯ૚
    σʔλιʔε૚
    υϝΠϯ૚
    υϝΠϯ͚ͩͰ
    ϏδωεϧʔϧΛ
    ·ͱΊΔྗΛ͚ͭΔ
    ෦඼Խ

    View Slide

  85. ʲNBSTͰυϝΠϯʹूதʳ
    ϓϨθϯςʔγϣϯ૚
    ΞϓϦέʔγϣϯ૚
    σʔλιʔε૚
    υϝΠϯ૚
    πʔϧɺݴޠ͕ҧ͏͜ͱͰ
    υϝΠϯΛҙࣝ͠΍͍͢

    View Slide

  86. ʲ࣮ྫɿݟੵ఻ථϞσϧʳ
    ݟੵ໌ࡉϦετ
    ݟੵ
    ݟੵ໌ࡉ
    ఆՁ
    ਺ྔ
    ໌ࡉֹۚ

    View Slide

  87. ʲ࣮ྫɿ஋Ҿ΍֎՟ʳ
    ݟੵ໌ࡉϦετ
    ݟੵ
    ݟੵ໌ࡉ
    ఆՁ
    ਺ྔ
    ໌ࡉֹۚ
    ஋Ҿϧʔϧ
    ஋Ҿ཰
    ൢച஋Ҿܖ໿
    ҝସϨʔτ
    ҝସద༻
    ൢച༻֎ࠃҝସ
    ൢച௨՟

    View Slide

  88. ʲ࣮ྫɿίΞͳϞσϧͱͯ͠஫ྗʳ

    View Slide

  89. ʲ࣮ྫɿίΞͳϞσϧͱͯ͠஫ྗʳ
    Ϗδωεϧʔϧ͕·ͱ·Γ෼͔Γқ͘ͳΓ

    ࠶ར༻΍มߋ͠΍͍͢ߏ଄ͱͳͬͨ

    View Slide

  90. ʲϏδωεϧʔϧΛͲ͕࣋ͭ͜ͷ͔ʁʳ
    ݟੵ໌ࡉϦετ
    ݟੵ
    ݟੵ໌ࡉ
    ఆՁ
    ਺ྔ
    ໌ࡉֹۚ
    ໌ࡉֹۚʁ

    View Slide

  91. ʲ࣮ྫɿ͜͏ϝιουݺͼग़͍ͨ͠͠ʳ
    ݟੵ໌ࡉϦετ
    ݟੵ
    ݟੵ໌ࡉ
    ఆՁ
    ਺ྔ
    ໌ࡉֹۚ
    ໌ࡉֹۚ
    ໌ࡉֹۚ߹ܭ
    ૯߹ܭ

    View Slide

  92. ʲ࣮ྫɿ਺ྔ͔ఆՁ͕ϧʔϧΛ࣋ͭʳ
    ݟੵ໌ࡉϦετ
    ݟੵ
    ݟੵ໌ࡉ
    ໌ࡉֹۚ
    ໌ࡉֹۚ
    ਺ྔ ✕
    SFUVSO
    ϏδωεϧʔϧΛ஌͍ͬͯΔͷ͸
    ਺ྔͳͷ͔ʁఆՁͳͷ͔ʁ
    ఆՁ
    ਺ྔ΍ఆՁ͕໌ࡉֹۚʹ
    ґଘ͢Δͷ͸Կ͔ඍົ

    View Slide

  93. ʲ࣮ྫɿ਺ྔ͔ఆՁ͕ϧʔϧΛ࣋ͭʳ αϯϓϧ
    /** ݟੵ໌ࡉ */
    object PaperQuotationDetail impl Detail {
    SalesPaperItem item {
    no-validation
    }
    Quantity quantity
    SalesUnitPrice salesUnitPrice
    DiscountRate discountRate
    ɹɹɹɾɾɾ
    def DetailAmount amount() {
    return quantity.calculateAmount(salesUnitPrice, voucherForeignExchange.voucherCurrency)
    }
    }
    /** ໌ࡉ਺ྔ */
    integerType Quantity {
    assert("") lessThanMaxQuantity {
    value < 10000
    }
    def boolean isMinus(){
    if(value < 0)
    return true
    return false
    }
    ɹɹɹɾɾɾ
    def DetailAmount calculateAmount(SalesUnitPrice salesUnitPrice, SalesCurrency salesCurrency) {
    new DetailAmount(new BigDecimal(value).multiply(salesUnitPrice.decimalValue()))
    }
    }
    ϏδωεϧʔϧΛ஌͍ͬͯΔͷ͸
    ਺ྔͳͷ͔ʁఆՁͳͷ͔ʁ
    ໌ࡉֹۚ
    ਺ྔ΍ఆՁ͕໌ࡉֹۚʹ
    ґଘ͢Δͷ͸Կ͔ඍົ

    View Slide

  94. ʲ࣮ྫɿ໌ࡉֹ͕ۚϧʔϧΛ࣋ͭʳ
    ݟੵ໌ࡉϦετ
    ݟੵ
    ݟੵ໌ࡉ
    ໌ࡉֹۚ
    ໌ࡉֹۚ
    ఆՁ ਺ྔ

    SFUVSO ໌ࡉֹۚͷίϯετϥΫλͰ
    ఆՁͱ਺ྔΛ౉ͯ͠
    ஋ͷऔಘ࣌ʹܭࢉ
    ໌ࡉֹۚͷதʹϏδωεϧʔϧΛ

    ؅ཧ͢Δߏ଄ͱͳͬͨ
    ఆՁͱ਺ྔΛֻ͚Δࡍʹ
    ͦΕͧΕ͔ΒܭࢉՄೳͳ஋Λ
    औಘ͢Δඞཁ͕ग़͖ͯͨ

    View Slide

  95. ʲ࣮ྫɿ໌ࡉֹ͕ۚϧʔϧΛ࣋ͭʳ
    /** ݟੵ໌ࡉ */
    object PaperQuotationDetail impl Detail {
    SalesPaperItem item {
    no-validation
    }
    Quantity quantity
    SalesUnitPrice salesUnitPrice
    DiscountRate discountRate
    ɹɹɹɾɾɾ
    def DetailAmount amount() {
    return new DetailAmount(quantity, salesUnitPrice, voucherForeignExchange.voucherCurrency)
    }
    }
    /** ݟੵ໌ࡉֹۚ */
    object DetailAmount impl ApplicableAmount, ExchangeBaseAmount {
    Quantity quantity
    SalesUnitPrice salesUnitPrice
    SalesCurrency voucherCurrency
    init(Quantity quantity, SalesUnitPrice salesUnitPrice, SalesCurrency voucherCurrency) {
    this.quantity = quantity
    this.salesUnitPrice = salesUnitPrice
    this.voucherCurrency = voucherCurrency
    }
    ɹɹɹɾɾɾ
    def BigDecimal decimalValue() {
    if (salesUnitPrice.empty) return BigDecimal.ZERO
    if (quantity.empty) return salesUnitPrice.decimalValue
    return salesUnitPrice.decimalValue().multiply(new BigDecimal(quantity.intValue()))
    }
    }
    ໌ࡉֹۚͷதʹϏδωεϧʔϧΛ

    ؅ཧ͢Δߏ଄ͱͳͬͨ
    ໌ࡉֹۚͷίϯετϥΫλͰ
    ఆՁͱ਺ྔΛ౉ͯ͠
    ஋ͷऔಘ࣌ʹܭࢉ
    ఆՁͱ਺ྔΛֻ͚Δࡍʹ
    ͦΕͧΕ͔ΒܭࢉՄೳͳ஋Λ
    औಘ͢Δඞཁ͕ग़͖ͯͨ
    ໌ࡉֹۚ
    αϯϓϧ

    View Slide

  96. ʲগͣͭ͠લ΁ɺઓ͍͸ଓ͘ʳ
    ශ݂ͱ

    Ϗδωεϧʔϧͱ
    ೔ʑ֨ಆ

    View Slide

  97. ·ͱΊ

    View Slide

  98. ʲϞσϧۦಈܕ։ൃͰͷυϝΠϯۦಈઃܭʳ
    Ϟσϧۦಈܕ։ൃͰ

    Ϗδωεͱιϑτ΢ΣΞΛܨ͛Δ
    ϢϏΩλεݴޠͰҰ؏ͨ͠ݴ༿Λ

    ڞ༗͠ͳ͕Βࣗಈੜ੒ΛབྷΊͯ։ൃ
    ࠷ॳ͸ශ݂Ͱ΋ɺঃʑʹҭͯΔ

    View Slide

  99. 燃えていいのは
    ドメイン駆動の

    魂だけだ
    プロジェクトの炎は
    消してやる!

    View Slide

  100. A c t i e r
    A c t i e r גࣜձࣾΞΫςΟΞ
    +BWB✕%%%
    ͷೱ͍؀ڥ
    ࣾһืूதʂ
    େࣄͳͷͰɺ΋͏Ұ౓

    View Slide

  101. ׬

    View Slide