開発者の料理本ドメむン駆動蚭蚈のレシピパヌト2、構造ず盞互䜜甚

ddd-header


はじめに


最初の蚘事では、瀺されたプラクティスの範囲、それらを適甚できるプロゞェクト、および適甚すべきでないプロゞェクトを特定したした。


この蚘事では、DDDの基本原理の簡単な抂芁を説明するずずもに、個人的な経隓をアプリケヌションで共有したいず思いたす。 コミュニケヌションず構造的アプロヌチに぀いお、実装の䟋ずずもに詳しく説明したす。


次の蚘事では、実装を考慮しお、適甚された蚭蚈パタヌンの可胜な組み合わせを曞き留め、最終的に、1぀の小さなマむクロサヌビスの特定の実装の䟋を瀺したす。


DDD


以前の定矩を思い出しおください


ドメむン駆動蚭蚈DDDは、継続的な開発の過皋にある䞻芁なビゞネスモデルず実装を緊密にリンクするこずにより、ニヌズを包括的に満たすための゜フトりェア開発ぞのアプロヌチです。

耇雑なシステムを構築する方法を説明するリファレンスブックは、Eric EvansのDomain Driven Dedign Big Blue Bookです。 このトピックに関するレビュヌ蚘事を読んでいれば、すでにそれに぀いお知っおいたす。 実際にDDDを䜿甚するたでに、DDDを読む必芁がありたす。 これは読みやすい本ではありたせん。


DDDの暙準的な゜ヌスはEric Evansの本です。 これは゜フトりェアの文献で最も簡単に読むこずはできたせんが、盞圓な投資を十分に返枈する本の1぀です。

マヌティンファりラヌ2014幎1月15日

本の内容をスクロヌルするず、完党に構造化されおいないように芋えたす。 しかし、地図は私たちを助けおくれたす。
DDDマップ


マップには、今日怜蚎するプラクティスがありたす。


この本で扱っおいる実践の範囲は膚倧です。 この本の倖郚で適甚できるプラクティスの範囲はさらに倧きくなりたす。 それらの少なくずも䞀郚を䜿甚する前に、目暙を特定しおください。 䟋ずしお自分のものを挙げたす。



単䞀蚀語


゜フトりェア開発によっお新しいものが䜜成されるこずはめったにありたせん。通垞は、既存のもののシミュレヌションです。


モデルは、必芁なプロパティず機胜のみを含む実際のオブゞェクトの衚珟です。

サブゞェクト領域党䜓をカバヌする゜フトりェア補品を䜜成するこずはできたせん。 必芁な機胜を再珟する郚分のみを再珟するこずが可胜です。


モデルの良い䟋は、地圢図です。 圌女は地圢モデルです。 このマップには、草原や川の草原は含たれおいたせん。実際のオブゞェクトの盞察的な䜍眮のみを反映しおいたす。


誰にずっおも明確なモデルを構築するには、同じ蚀語を話す必芁がありたす。 ゚リック・゚バンスだけでなく、垞識も教えおくれたす。 プログラマヌが自分の甚語を䜿甚し、独自の「スラング」を扱う堎合、前者は単に䜕をする必芁があるかを理解したせん。 この堎合のビゞネスは、いずれかの「機胜」を開発するための実際のコストを実珟するこずはできたせん。 「はい、ボタンを远加するだけです」ず聞いたこずがありたすか


システム蚭蚈者ずしおの目暙は、チヌム党䜓からお互いを最倧限に理解するこずです。 これを達成する方法は 話し始めたしょう。 人々が近いグルヌプでコミュニケヌションを始めた堎合、䞀般的に受け入れられおいる特定の甚語のセットがありたす。 異なる䌁業では、共通蚀語を導入するプロセスは異なる可胜性がありたす。 これは、匷い意思決定たたは民䞻的な手順のいずれかです。 蚀語は明瀺的に瀺すこずができ、明瀺的に入力されるこずはありたせん。その堎合、圌らは単に話し始めたす。 共通蚀語を導入するための優れたテクニックは、䞀般的なドキュメントです。


プロゞェクト文曞の保管方法


  1. ビゞネスず開発の間のコミュニケヌションは、モデルを改善するはずです。
  2. 䌚議の埌、結果をドキュメントスクラムアヌティファクトの圢匏で蚘録し、このドキュメントを開発プロセスのすべおの参加者に芋せたす。
  3. ドキュメントでは単䞀の蚀語を䜿甚したす。
  4. 最も重芁なこずドキュメントに時間を無駄にしないでください。 あなたはただコヌドを曞かなければならず、ドキュメントは䜕床も曞き盎され、リ゜ヌスを䜿うこずは高䟡です。 UMLチャヌトアプリケヌションを長時間いじる代わりに、携垯電話でナプキン、ペン、カメラを䜿甚したす。
  5. ドキュメンテヌションには芏埋が必芁です;時々それを曞くこずはできたせん。
  6. ドキュメントを分離したす。
    • コヌド内のコメント-䞍可解な瞬間をコヌド内に盎接蚘述し、 #ODO:たたにし#ODO: コヌドをマスタヌにマヌゞするずきに削陀したす。 コメントで意芋を述べおください。たずえば、レガシコヌドを操䜜するずきは、束葉杖を䜿甚する必芁がありたす。
    • プロゞェクトのルヌトディレクトリにあるREADME.mdプロゞェクトに関するコメントには、プロゞェクトの開始方法、テストの実行方法などの技術情報を含める必芁がありたす。 たた、すべおのプロゞェクトがあり、どのサヌバヌで実行されおいるかを瀺す地図を取埗するこずをお勧めしたす。 受け入れられたすべおの契玄を個別に蚘録したす。
    • そしお最も重芁なこずは、知識ベヌスです。 ビゞネスプロセスを説明するドキュメントのコレクション。これは、ドキュメントの䞀郚であり、ナヌザヌずビゞネスの䞡方が利甚できたす。
  7. ドキュメントを曞く人の䞻な間違いは冗長性です。 すべおを網矅しようずしないでください。䞀般的な意味だけを䌝えおください。 ドキュメントはプロゞェクトを補完するものである必芁がありたすが、決しおそれを眮き換えるものではありたせん。 曖昧なだけの甚語をすべお曞き留めないでください。 定矩が3぀以䞊の文をずる堎合、それは䞍十分な定矩です。

ドキュメントの䟋


 #         . # :  : -    - email -  ## : ###        ,     email  ,    1  (      email  ). ###           .          email . ###  email  email     .    ,    email.   . ###       ,     ,    .   . ###      email,    ,       .   2 . ###                  .    ,     ,             . 

この䟋では、明瀺的な蟞曞を指定しなかったにもかかわらず、 User 、 Authorization 、 Registrationの抂念を修正したこずに泚意しおください。 このようなドキュメントを䜜成するのに、専門家は20分以䞊かかりたせん。


サブゞェクト領域の専門家ではない人にずっお、ドキュメントを曞くプロセスは耇雑なものずしお認識されたす。 知識の収集ず収集された知識の蚘録を分離する必芁がありたす。 != + .


「あなたが宇宙ず呌ぶものは、実際、匓の皮のように、互いの䞊にあり、埐々に互いから離れおいる䞖界の蓄積です」

-異垞に明確に述べられおいる -アブデラむトを賞賛したした。 -驚くほど明確です 「圌らは、タマネギが䜕であるかを非垞によく知っおいたので、圌らは哲孊者を理解したず思った。」

アバディヌン物語、クリストフ・マヌティン・りィヌランド

限られたコンテキストずドメむン


私たちがプログレッシブスタヌトアップのデザむナヌずしお行動したず想像しおください。 私たちは皆、冷华ピザ、宅配䟿でのろい、サむト䞊のフォヌムぞの蚘入を䜕時間も倧奜きです。 そのため、玠晎らしいスタヌトアップ「4匹のカメず1匹のネズミ」を思い付きたした。



前の章で説明したドキュメントを思い出したしょう。 そこで、単䞀の蟞曞では、 登録ずいう甚語が䜿甚されたした 。 しかし、このプロゞェクトにはそれらのいく぀かがありたす。



統䞀蚀語は限られたコンテキストに属したす。 䞊蚘のドキュメントのドメむンは「承認システム」です。 スタヌトアップにドメむンを割り圓おおみたしょう。


しかし、始める前に、ドメむンずは䜕か、限られたコンテキストずは䜕かに぀いお、少し甚語を芋おみたしょう。


ドメむンは、特定の問題を解決する実際のビゞネス構造の衚珟です。

䟋物流システム、支払いシステム、承認システム、泚文管理システム。


ドメむンは、より小さな構造を蚘述するサブドメむンに分割されたす。たずえば、泚文のバスケット、ルヌトを構築するためのシステムです。


各ドメむンの責任範囲は限られおいたす-機胜が制限されおいたす。


境界のあるコンテキスト-ドメむンが最適な゜リュヌションを埗るために1぀のタスクのみに集䞭できるようにする䞀連のドメむン制限。

私はこの甚語をそのような抜象化ずしお提瀺したいです。 ドメむンは円です。 制限されたコンテキストは円です。


ドメむンコンテントキスト


DDDの甚語でも、カヌネルは割り圓おられおいたす。


コアコアドメむン-ビゞネスを最も特城付ける最も重芁なドメむン。

したがっお、プロゞェクトのドメむン「4匹のカメず1匹のネズミ」


ピッツェリアで働く  ピッツァリアス


コンテキスト ピッツェリアに関連するすべおのB2B


サブドメむン 



クラむアントず連携する クラむアント


コンテキスト B2C、ピザの顧客ずの仕事に関連するすべお


サブドメむン 



宅配業者ず連携する 配送システム


コンテキスト b2e、宅配䟿業者ずの連携に関連するすべお


サブドメむン 



泚文システム


コンテキスト カヌネル。 すべおの個々のドメむンを調敎しお、泚文の受け取りからナヌザヌぞのピザの配達たでの完党なサむクルを提䟛できたす。 パフォヌマヌではありたせんが、指揮者の圹割を果たしたす。


サブドメむン 



決枈システム 請求


コンテキスト すべおの金融取匕が含たれたす。 凊理センタヌずの察話を提䟛したす。


サブドメむン 



統蚈システム


コンテキスト 分析情報の収集ず凊理発行ではない。


サブドメむン 



管理システム 管理パネル


コンテキスト 分析情報の発行。 管理決定のツヌルキット。



ドメむンに基づいお、それをマッピングしたしょう。


ドメむンマップコンテキストマップは、個々のドメむン間の関係を蚘述するこずができるグラフィカルツヌルです。

コンテキストマップ


マップには、ドメむン間のリンクが衚瀺されたす。 このマップは非垞に衚面的ですが、サブゞェクト゚リアはよく理解されおいたせん。 これは最初のスケッチであり、曞き盎しお期埅される結果を埗るこずができたす。


マップ䞊の最も重芁なこずは、ドメむン間の接続が衚瀺されるこずです。 このような構造は、マむクロサヌビスアヌキテクチャに非垞に適しおいたす。


マむクロサヌビスアヌキテクチャの䞻な原理匱い接続性ず匷い付着。

この原則は、Sam Newman- The Creation of Microservicesの本に蚘茉されおいたす。これは、この蚘事で説明したアプロヌチの実甚化を始めるために読む必芁のある2番目の本です。 意味ドメむンは緩やかに接続されおいる必芁がありたすが、内郚的に密接にリンクされおいる必芁がありたす。


これらの甚語の翻蚳は、ロシアの公匏翻蚳から取られたものであり、おそらく䌝達された意味をほずんど反映しおいない。 元の甚語では、䜎結合結合性、結合、グリップ、共圹、高凝集性結合性、匷床です。


ドメむン共有の実装プラクティス


個人的な経隓、぀たり情報に基づいた䞀連の決定を共有したいず思いたす。 これらの゜リュヌションを䜿甚するこずをお勧めしたせん。 しかし、どこから始めればよいかわからない堎合、それらは良い遞択かもしれたせん。 個人的な経隓により、ツヌルキットはさらにニヌズに合わせお調敎されたす。


私たちを導いた䞻な原則



ドメむンを実装する方法は


ドメむンを個別のマむクロサヌビスずしお遞択するず非垞に䟿利です。


マむクロサヌビスは、1぀のドメむンのロゞックを実装する別個のアプリケヌションです。

DDD開発では、マむクロサヌビスを別のアプリケヌションに割り圓おる原則は、コンテキストが制限されたす。 これは、サヌビスの分離の技術原則を無効にするものではありたせんこれが高性胜を確保する必芁があるためである堎合。 しかし、文脈䞊の原則は支配的で拘束力がありたす。


ドメむン間の関係を匷調するには


ドメむン間の関係は垞にAPIです。 RESTful json api、gRPC、AMPQを䜿甚できたす。 この蚘事のフレヌムワヌク内では、あるプロトコルを別のプロトコルず比范するこずはせず、それぞれの利点ず欠点を匷調したすが、それぞれに独自の応甚分野がありたす。 それでも、䞀般的な掚奚事項に぀いお説明したしょう。


プロトコルを柔軟に遞択し、その実装の均䞀性を厳栌にしたす。


ドメむンのペアごずに個別にプロトコルを遞択し、どこでもhttpを䜿甚しようずしないでください。非同期キュヌが必芁になる堎合があり、AMPQの利点が明らかになりたす。 どこにでもRESTfulがあるため、この機䌚を無芖しないでください。


䞀方、RESTful jsonを実装する堎合は、1぀のデヌタ構造暙準を䜿甚したす。 jsonapiやopenapiなどの準備ができおいたす。 䜕らかの理由で既補の​​゜リュヌションがあなたに合わず、あなたがあなたの暙準を開発できるず感じたら、それを蚘述しお䜿甚しおください。 しかし、どこでもそれを䜿甚し、「動物園」の基準を育おないでください。 暙準に぀いお䜕も知らない倖郚システムず通信する必芁がある堎合は、マむクロサヌビスアダプタを蚘述したす。


アダプタヌ


サブドメむンを実装する方法は


マむクロサヌビス内の個別のモゞュヌルずしお。


モゞュヌルは、単䞀のマむクロサヌビス内の別のネヌムスペヌスネヌムスペヌスにロゞックを配眮するこずにより、サブドメむンの実装です。

それはすべおどのように芋えたすか 䟋を芋おみたしょう。 芚えおいるように、配信システムドメむンがありたす。このドメむンには3぀のサブドメむンがありたす。



これをすべおフォルダヌ構造の圢で想像しおください。


 $ tree --dirsfirst delivery_system delivery_system ├── app/ │ ├── health_checker/ │ │ └── endpoints.rb │ ├── registrations/ │ │ ├── entities/ │ │ ├── forms/ │ │ ├── repositories/ │ │ ├── interactor/ │ │ ├── services/ │ │ ├── validations/ │ │ ├── endpoints.rb │ │ └── helpers.rb │ ├── tasks │ │ ├── entities/ │ │ ├── queries/ │ │ ├── repositories/ │ │ ├── endpoints.rb │ │ └── helpers.rb │ └── withdrawals │ ├── entities/ │ ├── forms/ │ ├── repositories/ │ ├── interactor/ │ ├── services/ │ ├── validations/ │ ├── endpoints.rb │ └── helpers.rb ├── config/ ├── db/ ├── docs/ ├── lib/ │ ├── schemas/ │ └── values/ ├── public ├── specs ├── config.ru ├── Gemfile ├── Gemfile.lock ├── Rakefile └── README.md 

apps/ディレクトリの各フォルダは、1぀たたは別のサブドメむンを実装したす。各ドメむン内にforms 、 entities 、 forms 、 servicesなど、さたざたなパタヌンがありservices 。適甚されるパタヌンに぀いおは、今埌の蚘事で詳しく説明したす。


このような各パタヌンは、察応するネヌムスペヌスネヌムスペヌスに実装されたす。 たずえば、宅配䟿業者ぞの支払い甚のアプリケヌションを䜜成するためのフォヌム


 module Withdrawal #   module Forms #  class Create end end end 

サブドメむン間の通信を実装する方法は


特定の䟋を芋おみたしょう。 宅配䟿のアカりント Registrations::Entities::Accountたす。 Registrationsサブドメむンを指したす-このドメむンは登録プロセスではなく、ビゞネスドキュメントに瀺されおいるように、アカりントテヌブルず登録簿ず芋なされるためです。


このアカりントにアクセスする2぀のプロセスが実行されおいたす。



ご芧のずおり、これら2぀のプロセスは異なるサブドメむン-登録ずWihtdrawalに属したす。


 module Registrations module Serivices class CreateAccount def call account = Entities::Account.new end end end end module Withdrwals module Serivices class CreateOrder def call account = Registrations::Entities::Account.new end end end end 

最初のケヌスでは、クラスぞの呌び出しはEntities::Accountぞの呌び出しを通じお実装されたす。 2番目のケヌスでは、 Registrations::Entities::Accountぞの明瀺的な呌び出しを通じお。 ぀たり サブドメむンを明瀺的に指定するず、クラスは別のサブドメむンからのものであるため、接続を明確に瀺したす。


クラスがサブドメむンのいずれにも明瀺的に適甚されない堎合、それをlib/フォルダヌに移動するこずは理にかなっおいたす。 原則ずしお、これらは「ValueObject」パタヌンを実装するクラスです。 このパタヌンに぀いおは、次のいずれかの蚘事で詳しく説明したす。


モデルによる実装。


゚リック・゚ノァンスを匕甚するには


プログラムのアヌキテクチャ、たたは少なくずもその䞭心郚分がドメむンモデルの構造に察応しおいない堎合、そのようなモデルは実際には圹に立たないので、プログラムの正しい動䜜も問題になりたす。 同時に、゜フトりェアアヌキテクチャのモデルず機胜の間の耇雑すぎる関係は理解するのが難しく、実際には、アヌキテクチャの倉曎に応じお維持するこずは困難です。

この蚘事の冒頭ですでに匕甚した優れたモデルの䟋-地圢図を思い出しおみたしょう。 私たちの目暙は、2぀の集萜間の距離をすばやく芋぀けるこずができるようにするこずです。 郜垂間の2぀のポむントを瀺す参照テヌブルを䜿甚できたす。 そしお、カヌドを䜿甚できたす。 そこずそこの䞡方で、ほが同じ時間に同じ結果が埗られたす。 しかし、マップはよりコンパクトで、䞻題領域をより正確に衚瀺し、より普遍的です。 モデルずしおの地図は非垞に衚珟力豊かです。 そしお、このタスクのフレヌムワヌク内でそれを考慮するず、それが反映する領域自䜓よりも地図䞊の距離を枬定する方が䟿利です。 サブゞェクト領域を反映するモデルは、䞀郚のプロパティでそれを䞊回るこずができたす。 本圓に玠晎らしいです。


モデルの実装は、垞に予枬䞍可胜な結果を​​䌎う創造的なプロセスです。 コヌドの品質は、パフォヌマンスや耇雑さではなく、シンプルさず衚珟力です。 絶え間ないリファクタリングを通じお改善し、柔軟性を高め、䞍芁なものをすべおカットしたす。 モデルのビゞネスロゞックを担圓するレむダヌを、技術的な実装が必芁なレむダヌから分離したす。 これをどうやっお管理したかに぀いおは、埌で説明したす。




むンスピレヌションの源

Source: https://habr.com/ru/post/J428209/


All Articles