yodai.qrunch.io読者になる5ドメイン駆動設計にチャレンジ(ドメインのモデル、エンティティ部分の実装)ドメイン駆動設計DDD投稿日:2019-08-29最終更新:2019-08-29筆者のブログで記事をみるドメイン駆動設計で、今までやってきたことをもとにちまちまコード書いていたのですが・・・まあ、こんなものなのかなーというところまできました。ドメインの中核をどんな感じで表せば良いのかな?という目的でソースを書いたので、application,repository,serviceは全然書いていません。今まで書いてきたこととあっていない部分もあります。今回はまあ自分の目的を果たせたので、とりあえずはこんなものかな、と思い、今回はここで打ち止めにしておきます。パッケージ構成パッケージ構成は、applicationmodelmodel.specificationserviceinfrastractureとなっています。中心となるのはmodelパッケージになります。modelパッケージの中に、集約ルートのエンティティとなるEntryFrame.javaがあり、ファクトリとしてEntryFrameCapacity.java、リポジトリのインターフェースIEntryFrameReposotory.javaがあります。model.specificationパッケージは、検証の仕様を表すためのIEntryFrameContdition.javaインターフェースと生成の仕様を表すためのIEntryFrameRequires.javaインターフェースがあり、業務ルールを実現する上で必要な仕様があるときは、これらのインターフェースを実装します。ドメインの中核となるEntrytryFrame.javaEntityFrame.javaの元になるクラス図は以下となります。EntityFrame.javaは、エントリ枠の集約ルートとしています。エンティティでもあります。privateにしました。}変数名が長いですが、、、IDE力任せでやってしまったので。(!participantAcceptanceCategorySpecification.isSatisfiedBy())のif文は、エントリの状態が「募集中」で、エントリ枠が「先着順」で、まだ定員に達していない、という業務ルールを満たしているか、を判定しています。(!participantAcceptanceMemberSpecification.isSatisfiedBy())は、参加希望者がすでにエントリ枠に参加申し込みを行っていないか、他のエントリ枠に存在しないかという業務ルールを満たしているか、を判定しています。それぞれのif文、というか、仕様を表すクラスなのですが、関連するようないくつかのルールを1つのクラスにまとめたりしてしまったので、イマイチかもしれません。仕様パターンを使えば良いかと思いましたが、とりあえずはこんな感じにしました。ちなみに、participantAcceptanceMemberSpecificationクラスの中はこんな風になっています。参加申し込み時に会員の参加条件の仕様を表す。}あんまり大したことはしていませんが、エントリ枠が持つ参加希望者の集合に、参加を申し込もうとしている会員がいないか、あとは他のエントリ枠にすでに参加申し込みをしていないかを確認しています。participants.addParticipant(participant);参加申し込み日の値オブジェクトを作成して、会員を表す値オブジェクトとともに参加希望者の値オブジェクトを作成し、参加希望者の集合であるparticipantsに追加しています。particitapntsはファーストクラスコレクションとしています。Participants..javaは、こんな感じになっています。参加希望者のリストを表す。参加希望者を追加する。参加済みの場合は参加希望者に追加しない。参加希望者の人数を返却する。参加希望者がすでに参加していないか確認する。}Listでもいいかなーと思ったのですが、ファーストクラスコレクションにしてみました。ファーストクラスコレクションですが、呼び元、ここではEntryFrameの参加申し込みのメソッドですが、Listという生のデータ構造ではなく、参加希望者の集合として表すことにより、ソースの見通しがよくなり、より業務ルールをコードで表現できるようになったのではないか、と感じました。次は抽選のメソッドです。}メソッドの先頭でやっているのは参加申し込みのメソッド同様、抽選ができるかを確認しています。entryFrameCapacity);ですが、実際の参加者確定処理は先着順抽選区分を表すenumで行っています。先着順抽選区分を表す。区分値:先着順を表す。参加希望者から、参加者を確定する。}区分オブジェクト、というやつですね。先着順状態区分を表すenumで参加者確定の抽象メソッドを定義し、各区分値にて参加者の確定をどうやるか実装しています。Architecture読み始めたので、読み終わったらapplicationやservice、repositoryあたりをもうちょっと踏み込んで実装してみようかな?と考えています。yodai.qrunch.ioソフトウェア開発に関する技術や読書メモのブログです。Qrunch.netサーバー提供フィードバックを送信する。