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 #ユビキタス言語 #ドメインモデル貧血症

Bdf238cad055e8962ef711d788cfbf9a?s=128

KentaroTakasaki

May 29, 2019
Tweet

More Decks by KentaroTakasaki

Other Decks in Programming

Transcript

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

  2. 増田流 派 %%% ア ク テ ィ ア

  3. ޻ۀత Ͱ͸ͳ͘ɺ

  4. ޻ܳత

  5. υϝΠϯ஌ࣝ ਖ਼ ૷ ਪ͠ͷϢχϑΥʔϜΛ ணͯొஃ͢Δ͜ͱ

  6. ߴ ࡚ ݈ ଠ ࿠ גࣜձࣾΞΫςΟΞɹ$00 %%%"MMJBODFओ࠵ ঊक़ɹक़௕ Ϟσϧϕʔειϑτ΢ΣΞ։ൃίϛϡχςΟओ࠵ Α͜͸·Ϋϥ΢υษڧձओ࠵

    ,FOUBSP5","4",* ̘ 0 ̤
  7. ɹഎܠ ɹݴ༿Λڞ༗ ɹශ݂ͱͷઓ͍

  8. 背景

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

  10. A c t i e r A c t i

    e r גࣜձࣾΞΫςΟΞ ॴࡏ஍ɹɹɹɿɹ౦ژ౎தԝ۠೔ຊڮງཹொ ઃཱɹɹɹɹɿɹ೥ɹ݄  ϗʔϜϖʔδɿɹIUUQXXXBDUJFSDPKQ ैۀһ਺ɹɹɿɹ໊ʢऔక໾ؚΉʣ ΍ͬͯΔ͜ͱɿɹϞσϧۦಈܕ։ൃ΍%%%Λ׆͔ͨ͠ ιϑτ΢ΣΞ։ൃ
  11. A c t i e r A c t i

    e r גࣜձࣾΞΫςΟΞ +BWB✕%%% ͷೱ͍؀ڥ ࣾһืूதʂ
  12. 世 界 大炎上

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

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

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

  16. ʲϞσϦϯάʳ ސ٬ ސ٬*%
 ސ٬໊ ஫จ ஫จ*%
 ஫จ೔ ܾࡋ ΫϨδοτΧʔυ ݱۚ

    ͋Δ෺ମ΍ࣄ৅ʹ͍ͭͯண໨͍ͯ͠Δಛ௃΍ɺಉछͷෳ਺ͷର৅ʹڞ௨͢Δੑ࣭Λநग़͠ɺ ࠣ຤ͳࡉ෦Λ؆ུԽͨ͠ந৅తͳ໛ܕʢϞσϧʣΛ࡞੒͢Δ͜ͱɹʢF8PSETΑΓʣ Ϋϥεਤ ϞσϧΛ࡞Δ͜ͱͰ෼͔Γ΍͘͢͢Δ
  17. ʲ৭ʑͳϞσϦϯάʳ ϦϨʔγϣϯۦಈཁ݅ఆٛʢ3%3" &3ਤ ϏδωεϞσϧɾΩϟϯόε

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


    ཁٻ ʢυϝΠϯʣ ιϑτ΢ΣΞ ʢιʔείʔυʣ தؒ ੒Ռ෺ தؒ੒Ռ෺͕͋ΔͱϢʔβ΋ཧղ͠΍͘͢ ࠷ऴతͳΠϝʔδΛڞ༗͠΍͍͢
  19. ʲϏδωε͔Βܨ͕ͬͨ։ൃΛʳ

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

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

  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<Property> attributeAll(Class clazz) { EList<Property> attributes = new BasicEList<Property>(); if (clazz.getSuperClasses() != null) for (Class parent : clazz.getSuperClasses()) attributes.addAll(attributeAll(parent)); attributes.addAll(clazz.getOwnedAttributes()); return attributes; } } Ϟ
 σ
 ϧ
 ʹ
 ू
 த ࣗ ಈ Խ ʹ Α Δ ิ ॿ ΞΧ΢ϯτ σΟϥʔ 受付୲౰ 企ը୲౰
  23. ʲݴޠͷྺ࢙͸ந৅౓্͕͕͍ͬͯΔʳ ࣌ؒͱϓϥοτϑΥʔϜ ந
 ৅
 ౓ Ϛγϯޠ
 ͱͷූ߸ ΞηϯϒϦݴޠ
 Ξηϯϒϥ ୈੈ୅ݴޠ


    $0#0-
 $
 ΦϒδΣΫτࢦ޲
 ୈੈ୅ݴޠ
 +BWBɹ$
 3VCZɹ1ZUIPO
 Ϟσϧۦಈ։ൃ
 ϝΠϯϑϨʔϜͷ࣌୅ 1$ͷ࣌୅ Πϯλʔωοτͷ࣌୅ Ϋϥ΢υͷ࣌୅ ɾΑΓίϯϐϡʔλ͔Βਓؒܥ΁ ɾϓϥοτϑΥʔϜ͕ෳࡶʹͳΔதɺϓϥοτϑΥʔϜͱͷ෼཭͕ඞཁ
  24. ʲۜͷ஄ؙ͸ͳ͍ʂʳ υϝΠϯۦಈઃܭͩͬͯ ͦ͏ 1IPUPDSFEJUNPOFZNFUBMTPO7JTVBMIVOU$$#:

  25. ഇΕΔ 1IPUPDSFEJUTBUHVSVPO7JTVBMIVOU$$#:

  26. ʲͳͥɺഇΕͨʳ ࢓༷͕ϑϫοͱ͍ͯͨ͠ ཧ૝తա͗ͯϑϫοͱ͍ͯͨ͠ 
 ֤ϕϯμʔ͝ͱͰ࣮૷͕ϑϫο ͱ͍ͯͨ͠

  27. े೥ Ұੲ

  28. ʲ"*ͷϒʔϜ΋Կճ͔ʳ       ୈҰ࣍"*ϒʔϜ ʢਪ࿦ɾ୳ࡧʣ ୈೋ࣍"*ϒʔϜ

    ʢ஌ࣝ޻ֶʣ ୈࡾ࣍"*ϒʔϜ ʢػցֶशɾදݱֶशʣ &-*;" %FFQ#MVF "MQIB(P 4JSJ %FFQ.JOE 8BUTPO σΟʔϓϥʔχϯά ػցֶश Ϗοάσʔλ ΢Σϒ ΤΩεύʔτγεςϜ .ZDJO %FOESBM ϒʔϜͷͨͼʹਐԽ͍ͯ͠Δ
  29. υϝΠϯۦಈઃܭ΍ΦϒδΣΫτࢦ޲͕ ࠶ͼ΍͖͍ͬͯͯΔʁ        6.-

    ϒʔϜ υϝΠϯۦಈઃܭϒʔϜ དྷͯΔͰ͠ΐʂʂ #14UVEZ ʙ%%% %PNBJO%SJWFO%FTJHO  ɹ࣮ફͷݱ৔ ໊௒͑Ͱ ձ৔มߋʂ
  30. ʲϞσϧۦಈܕ։ൃͷ͍͍ͱ͜Ζʳ Ϗδωεཁ݅ͱϓϩάϥϜͷ෼཭ ϓϩάϥϜͷۉ࣭Խ 
 ࣗಈੜ੒ʹΑΔੜ࢈ੑ޲্

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

  32. ʲΞΫςΟΞ೥දʳ       ˒ ೥݄ ΞΫςΟΞ஀ੜ

    A c t i e r A c t i e r ˒ ೥݄ ߴ࡚ࢀը ઌۦऀͱͷܨ͕ΓΛ ͔͚Δ͘ΜʹͯυϝΠϯۦಈઃܭ࣮ݧ %%%"MMJBODFओ࠵ ˒ ೥݄ࠒ ૿ా͞Μͱܨ͕Δ   NBSTΛ࢖͍֤छҊ݅ͰɺεϞʔϧΦϒδΣΫτઃܭ΍υϝΠϯۦಈઃܭͱϞσϧۦಈΛ׆༻ Ϟσϧϕʔειϑτ΢ΣΞ։ൃίϛϡχςΟओ࠵
  33. ৭ʑͳϊ΢ϋ΢΍ߟ͑ํΛ Ϟσϧۦಈ։ൃͷதʹ औΓࠐΜͰ͍ͬͨ ·ͨɺͭͳ͕Γ΋Ͱ͖ͨ ʲઌۦऀͱܨ͕ΔதͰֶͼΛʳ

  34. ʲ౰ॳऔ૊ΜͰ͍ͨϞσϧۦಈ։ൃʳ ސ٬ ސ٬*%
 ސ٬໊ ஫จ ஫จ*%
 ஫จ೔ ܾࡋ ΫϨδοτΧʔυ ݱۚ

    6.-Ϋϥεਤ ࣗಈੜ੒ ιʔείʔυ ɾάϥϑΟΧϧͩͱύοͱݟͰ෼͔Γ΍͍͕͢ɺࠩ෼؅ཧ͕೉͍͠ ɾ੩తߏ଄͸දݱ͠΍͍͕͢ɺಈతߏ଄ʢৼΔ෣͍ʣ͕දݱ͠ʹ͍͘
  35. ͍͍ ઃܭ ͬͯɺͳΜͩΖ͏ʁ ʲϑϫοͱͤ͞ͳ͍ͨΊʹʳ

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

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

     $   %! $    $    $  %!  $ "#  A c t i e r A c t i e r ૿ా͞Μͱڞʹʲ෼ੳɾઃܭʳΛ௥ٻ
  38. ʲ͍͍ઃܭʳ ਐԽͱ ੒௕Λଓ͚ΒΕΔ มߋ͕ ָͰ ҆શ ෳࡶ͞ ʹཱͪ޲͔͑Δ

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

    ˰কདྷతͳτϥΠϙΠϯτ
  40. ʲ%4-Πϝʔδʳ /** * ঎඼(ࢴ) */ package jp.xx.xxx.xxx.domain.model.item.paper /** ঎඼ʢࢴʣ */

    listType PaperItems<PaperItem> /** ࢴ঎඼ϦϏδϣϯ */ 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- ύοέʔδߏ੒΍ιʔε ϘΠϥʔςϯϓϨʔτͳ ίʔυΛҙࣝͤͣʹࡁΉ ʢίϐϖΛແ͘͠ਓతϛεΛݮΒ͢ʣ 
 Α͋͘Δࣗಈੜ੒ܥͱͷࠩผԽͱͯ͠ Մಡੑͷ͋Διʔεʹ߆Δ ϞσϦϯάͱͯ͠ ਓ͕஫ྗ͢΂͖ͱ͜Ζ͚ͩ ࣗಈੜ੒
  41. ʲυΩϡϝϯτΠϝʔδʳ ϢʔεέʔεͷҰཡʹΑΓ ͲΜͳػೳ͕͋Δͷ͔ɺ ͲΜͳϝιου΍ґଘؔ܎͕෼͔Δ͜ͱͰ ၆ᛌͯ͠ػೳΛ೺ѲͰ͖Δ VTFDBTFɺSFQPTJUPSZͱ͍ͬͨ
 ΩʔϫʔυʹΑͬͯΫϥεͷ໾ׂΛ໌֬ʹ͢Δͱ ڞʹΞϊςʔγϣϯͳͲͷ ϘΠϥʔςϯϓϨʔτͳίʔυ͸ࣗಈੜ੒ Ϟσϧʢ%4-ʣ͔Β

    ੜ੒͞ΕΔ͜ͱͰ ௠෗Խ͠ͳ͍ usecase repository
  42. 言葉 を 共有

  43. ௨͡ͳ͍ࢥ͍

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

  45. ʲݴ༿ͷဃ཭ʳ Ϗδωε υϝΠϯ ιϑτ΢ΣΞ ʢιʔείʔυʣ Ϟσϧ υϝΠϯΤΩεύʔτ͸ɺ ιϑτ΢ΣΞ։ൃʹ͓͚Δٕज़తͳઐ໳༻ޠͷ͜ͱ͸෦෼తʹ͔͠ཧղͤͣɺ ୅ΘΓʹࣗ෼ͷಘҙ෼໺ͷઐ໳༻ޠΛ࢖༻͢Δ υϝΠϯ

    ΤΩεύʔτ ։ൃऀ͸ɺ γεςϜΛཧղͯٞ͠࿦͢Δࡍʹɺػೳʹؔ͢Δઆ໌తͳ༻ޠΛ༻͍Δ͔΋͠ Εͳ͍͕ɺ͜͏ͨ͠༻ޠ͸υϝΠϯΤΩεύʔτͷݴޠ͕͍࣋ͬͯͨҙຯΛܽ ͍ͯ͠·͍ͬͯΔɻ͋Δ͍͸ɺ։ൃऀʹΑΔந৅Խ͸ɺࣗ෼ͨͪͷઃܭΛࢧ͑ ͯ͸͍ͯ΋ɺυϝΠϯΤΩεύʔτʹ͸ཧղ͞Εͳ͍͔΋͠Εͳ͍ ։ൃऀ ݴ༿ͷؒʹ͸ʲஅઈʳ͕͋Δ
  46. ʲஅઈ͕͋Δ͜ͱͰͷฐ֐ʳ Ϗδωε υϝΠϯ ιϑτ΢ΣΞ ʢιʔείʔυʣ Ϟσϧ υϝΠϯ ΤΩεύʔτ ։ൃऀ ݴ༿͕௨༷ͨ͡Ͱ௨͍ͯ͡ͳ͍

    ٞ࿦ͷ༻ޠͱίʔυͷ༻ޠ͕Ұக͠ͳ͍ 
 ௨༁͢Δͷʹ༨෼ͳ࿑ྗ͕͋Δ
  47. ʲϢϏΩλεݴޠʳ Ϗδωε υϝΠϯ ιϑτ΢ΣΞ ʢιʔείʔυʣ Ϟσϧ υϝΠϯ ΤΩεύʔτ ։ൃऀ ϞσϧΛݴޠͷࠎ֨ͱ͢Δ

    ͢΂ͯͷίϛϡχέʔγϣϯͱίʔυʹɺͦͷݴޠΛ ݫ֨ʹ༻͍Δ 
 ݴޠʹ໰୊͕͋Ε͹୅ΘΓͱͳΔݴ༿Λ୳͠ɺϞσϧ Λ৽ͯ͘͠͠ίʔυΛϦϑΝΫλϦϯά͢Δ ݴޠʢݴ༿ʣ Ұ؏ͨ͠ݴޠʢݴ༿ʣͰڞ༗
  48. ʲΑ͘ߟ͑Δͱʳ ϢϏΩλεݴޠ ༻ޠू ʺ

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

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

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

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

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

  54. υϝΠϯΤΩεύʔτ΍
 νʔϜϝϯόͱͷ ର࿩ʹΑΓ Λ࢈Έग़͢ ϢϏΩλεݴޠ

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

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

  57. ൢച؅ཧ

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

  59. "7$4 ച্ ిࢠւਤ ݟੵ ೲೖઌ &/$ ɾɾɾ "%1 ʲݴ༿͕ͨ͘͞Μʳ ધओ

    ધ۩঎ ધഫ؅ཧձࣾ 6,)0 $IBSU$P ࢴւਤ ॻ੶ ਫ࿏௨ใ
  60. ʲ෼͔Βͳ͍ݴ༿Λ੔ཧʳ ۀछͦͷ΋ͷΛֶͿ 8FCͰௐ΂Δ ࣮෺Λ௖͍ͯ೺Ѳ͢Δ

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

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

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

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

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

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

    υϝΠϯ ΤΩεύʔτ ։ൃऀ ݴޠ*% ϢϏΩλεݴޠ ͱͳͬͨ
  67. ʲ࣮ྫɿϢϏΩλεݴޠͷબ୒ϛεʳ ސ٬ ધओ Photo credit: ukCWCS on VisualHunt.com / CC

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

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

    BY Photo on VisualHunt.com ધ
  70. ʲ஋ΦϒδΣΫτʳ ͋ΔϞσϧཁૉʹ͍ͭͯɺͦͷଐੑ͔ؔ͠৺ͷର৅ͱͳΒͳ͍ͷͰ͋Ε͹ɺ
 ͦͷཁૉΛ஋ΦϒδΣΫτͱͯ͠෼ྨ͢Δ͜ͱ ϢϏΩλεݴޠ͸ɺ
 ஋ΦϒδΣΫτʹͳΔ ࣗ෼͕఻͑ΔଐੑͷҙຯΛදݱͤ͞ɺؔ܎ͨ͠ػೳΛ༩͑Δ͜ͱ ෆมͳ΋ͷͱͯ͠ѻ͏͜ͱ ಉҰੑΛ༩͑ͣɺΤϯςΟςΟΛҡ࣋͢ΔͨΊʹඞཁͱͳΔෳࡶͳઃܭΛ ආ͚Δ͜ͱ

  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<Lang> { 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)) } }
  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<LanguageIdValue> { 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<LanguageId> { 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Ͱදݱʳ Ϗδωε υϝΠϯ ιϑτ΢ΣΞ ʢιʔείʔυʣ Ϟσϧ υϝΠϯ ΤΩεύʔτ ։ൃऀ ݴޠ*%
  73. ʲϢϏΩλεݴޠΛදݱ͢Δ͜ͱͰʳ ֓೦΍༻ޠ͕ιʔεʹͳΓ
 ސ٬ͱΤϯδχΞͷؒͰ࿩͕௨͡΍͘͢ͳͬͨ ୯Ұ੹೚ʹͳΓ΍͘͢ιʔείʔυ͕؆ૉԽ͞ΕΔ ސ٬ͱର࿩͕ີʹͳΔ͜ͱͰɺސ٬ͷ৴པੑ΋޲্͠ ϓϩδΣΫτӡӦʹ΋͍͍ӨڹΛ༩͑ͨ ΈΜͳ͕ݴ༿ʹ߆ΔΑ͏ʹͳͬͨ

  74. 貧血 との 戦い

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

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

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

    ച্ೖྗ ࢓ೖೖྗ ؔ৺ࣄ͕ೖग़ྗʹΑͬͨ
 ݁ՌɺυϝΠϯ૚͸ ͨͩͷೖΕ෺ʹͳΓ͕ͪ
  78. ʲσʔλʢςʔϒϧઃܭʣ͔Β΍ͬͯ͘Δͱ
 ɹσʔλͷثʹͳΓ͕ͪʳ ϓϨθϯςʔγϣϯ૚ ΞϓϦέʔγϣϯ૚ σʔλιʔε૚ υϝΠϯ૚ ঎඼*% ঎඼໊ ఆՁ ࡏݿ؅ཧ

    +1 ೔ຊۙւ  ͢Δ +1 ೔ຊԊ؛෦  ͢Δ #" ӳࠃۙւ  ͠ͳ͍ #" ӳࠃԊ؛෦  ͠ͳ͍ ঎඼ςʔϒϧ طଘϓϩδΣΫτ͔Βͷ ϦϓϨΠεͩͱ ಛʹةͳ͍
  79. ʲ࣮ྫʳ ݁Ռ

  80. ʲυϝΠϯϞσϧශ݂঱ʳ ύοͱݟɺυϝΠϯϞσϧʹݟ͑Δ Θ͔ͣͳৼΔ෣͍͔͠ͳ͍
 ɹʹϏδωεϧʔϧ͕ॻ͔Ε͍ͯͳ͍ 
 ΦϒδΣΫτࢦ޲ઃܭͷجຊ֓೦
 ʢσʔλͱॲཧΛҰॹʹ͢Δʣͷਅٯ

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

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

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

      ۀ຿ΞϓϦέʔγϣϯ։ൃͷෳࡶ͞ɾ೉͠͞͸ɺϏδωεϧʔϧʹ͋Δɻ ϏδωεՁ஋Λ࣮ݱ͢ΔͨΊʹϛογϣϯ΍ઓུɺ࣮ߦܭըΛܦͯઓज़͔Β
 ࣮ߦ΁ͱམͱ͠ࠐΜͰ͍͘தͰɺߦಈํ਑΍൑அج४ͱͳΔϧʔϧ͕
 ϏδωεϙϦγʔ΍Ϗδωεϧʔϧͱͯ͠Լࢧ͍͑ͯ͠·͢ɻ ͦͷϧʔϧͷൃݟɾ෼ੳɾ࣮૷ʹ࣠Λஔ͘͜ͱͰΞϓϦέʔγϣϯ੔ཧ͕
 ༰қʹͳΓ·͢ɻ ϏδωεϧʔϧΛൃݟɾ෼ੳ͠ɺ υϝΠϯϞσϧͱ࣮ͯ͠૷͍ͯ͘͠
  84. ʲҙࣝతʹυϝΠϯʹूதͯ͠ಠཱʳ ϓϨθϯςʔγϣϯ૚ ΞϓϦέʔγϣϯ૚ σʔλιʔε૚ υϝΠϯ૚ υϝΠϯ͚ͩͰ ϏδωεϧʔϧΛ ·ͱΊΔྗΛ͚ͭΔ ෦඼Խ

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

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

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

    ҝସϨʔτ ҝସద༻ ൢച༻֎ࠃҝସ ൢച௨՟
  88. ʲ࣮ྫɿίΞͳϞσϧͱͯ͠஫ྗʳ

  89. ʲ࣮ྫɿίΞͳϞσϧͱͯ͠஫ྗʳ Ϗδωεϧʔϧ͕·ͱ·Γ෼͔Γқ͘ͳΓ
 ࠶ར༻΍มߋ͠΍͍͢ߏ଄ͱͳͬͨ

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

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

  92. ʲ࣮ྫɿ਺ྔ͔ఆՁ͕ϧʔϧΛ࣋ͭʳ ݟੵ໌ࡉϦετ ݟੵ ݟੵ໌ࡉ ໌ࡉֹۚ ໌ࡉֹۚ ਺ྔ ✕ SFUVSO ϏδωεϧʔϧΛ஌͍ͬͯΔͷ͸

    ਺ྔͳͷ͔ʁఆՁͳͷ͔ʁ ఆՁ ਺ྔ΍ఆՁ͕໌ࡉֹۚʹ ґଘ͢Δͷ͸Կ͔ඍົ
  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())) } } ϏδωεϧʔϧΛ஌͍ͬͯΔͷ͸ ਺ྔͳͷ͔ʁఆՁͳͷ͔ʁ ໌ࡉֹۚ ਺ྔ΍ఆՁ͕໌ࡉֹۚʹ ґଘ͢Δͷ͸Կ͔ඍົ
  94. ʲ࣮ྫɿ໌ࡉֹ͕ۚϧʔϧΛ࣋ͭʳ ݟੵ໌ࡉϦετ ݟੵ ݟੵ໌ࡉ ໌ࡉֹۚ ໌ࡉֹۚ ఆՁ ਺ྔ ✕ SFUVSO

    ໌ࡉֹۚͷίϯετϥΫλͰ ఆՁͱ਺ྔΛ౉ͯ͠ ஋ͷऔಘ࣌ʹܭࢉ ໌ࡉֹۚͷதʹϏδωεϧʔϧΛ
 ؅ཧ͢Δߏ଄ͱͳͬͨ ఆՁͱ਺ྔΛֻ͚Δࡍʹ ͦΕͧΕ͔ΒܭࢉՄೳͳ஋Λ औಘ͢Δඞཁ͕ग़͖ͯͨ
  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())) } } ໌ࡉֹۚͷதʹϏδωεϧʔϧΛ
 ؅ཧ͢Δߏ଄ͱͳͬͨ ໌ࡉֹۚͷίϯετϥΫλͰ ఆՁͱ਺ྔΛ౉ͯ͠ ஋ͷऔಘ࣌ʹܭࢉ ఆՁͱ਺ྔΛֻ͚Δࡍʹ ͦΕͧΕ͔ΒܭࢉՄೳͳ஋Λ औಘ͢Δඞཁ͕ग़͖ͯͨ ໌ࡉֹۚ αϯϓϧ
  96. ʲগͣͭ͠લ΁ɺઓ͍͸ଓ͘ʳ ශ݂ͱ
 Ϗδωεϧʔϧͱ ೔ʑ֨ಆ

  97. ·ͱΊ

  98. ʲϞσϧۦಈܕ։ൃͰͷυϝΠϯۦಈઃܭʳ Ϟσϧۦಈܕ։ൃͰ
 Ϗδωεͱιϑτ΢ΣΞΛܨ͛Δ ϢϏΩλεݴޠͰҰ؏ͨ͠ݴ༿Λ
 ڞ༗͠ͳ͕Βࣗಈੜ੒ΛབྷΊͯ։ൃ ࠷ॳ͸ශ݂Ͱ΋ɺঃʑʹҭͯΔ

  99. 燃えていいのは ドメイン駆動の
 魂だけだ プロジェクトの炎は 消してやる!

  100. A c t i e r A c t i

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