ドメイン駆動設計の練習!!サンプルプログラム実装編|ドメインサービス作成

はじめに

データベーススペシャリストの過去問(2021年秋午後Iの問1)を例に、

ドメイン駆動設計でモデリングをしてリポジトリのサンプルプログラムとテストコードを

作成したので(Java + Springで作成)、

 

ドメインモデル図をベースにドメインサービスを実装していく際に感じたことや気付き、

僕のドメインサービスに対する役割の解釈などについて、

本記事にまとめました。

 

>>モデリング結果(drawio)

>>モデリング対象(データベーススペシャリスト2021秋午後I問1)

 

ドメイン駆動設計の練習モデリング編についてはこちらにまとめています。

ドメイン駆動設計の練習!!モデリング編

 

MEMO

本記事では、

松岡さんの「サンプルコード&FAQ」、「モデリング/実装ガイド」を参考にさせて頂きました。

サンプルプログラムの作成及びテストコードの作成は本をなぞった形になります。

(その点お含みおきください)

 

2022/03/22追記

ドメイン駆動設計でモデリング〜コーディング〜テストコード作成

までのまとめ記事を作ったので興味がある方は是非みてください。

ドメイン駆動設計の練習!!モデリング〜サンプルプログラム・テストコード作成(まとめ記事)

 

ドメインサービスとは

ドメインサービスについて本ではこのように述べられていました。

「モデルをオブジェクトとして表現すると無理なもの」の表現に使います。

例えば、集合に対する操作などです。

ドメイン駆動設計 モデリング/実装ガイド(松岡 幸一郎)

 

本ではユーザがメールアドレスを更新する際の既に登録済みメールアドレスでないことのチェック

を例に説明されていました。

ユーザエンティティは自分のメールアドレスを持つが、

既に登録済みチェックは全ユーザのメールアドレスに対してチェックをする必要があり、

1オブジェクトがその役割を果たすには無理がある。ということでした。

 

一方、僕が作成したサンプルを例に挙げると、

支払というエンティティとユーザというエンティティが存在し、

支払時に利用する利用ポイントがユーザの所有するポイント残高を超えていないか

チェックをする際にドメインサービスを利用しました。

 

エンティティをまたぐチェックのため、1オブジェクトがこの役目を果たすには無理があると

判断しました。

 

 

 

ドメインモデル図からドメインサービスの実装〜テストコード作成

作成したドメインサービスとテストコードについてポイントに絞って紹介します。

 

利用ポイント超過チェックドメインサービス

>>該当ソース(github)

ドメイン層パッケージの中に作成しました。

 

支払エンティティとユーザエンティティを受け取って利用ポイントが残ポイントを超えていたら

DomainExceptionをスローするだけです。

 

Serviceが登場すると、なんでもできちゃう神クラスに昇格してしまうことがあるので、

クラス名はドメインサービスの役割の名前をつけ、

メソッドも1つのexecuteしか持たないようにしています。

 

エンティティ丸ごと渡すかチェックに必要なものだけ渡すか迷ったのですが、

僕は大体こういうチェックって判断条件が色々増えてめんどくさいので丸っと渡す癖が。。。

(関係ないものは極力渡さないほうがいいのかもしれませんが)

 

 

利用ポイント超過チェックドメインサービスのテストコード

>>該当ソース(github)

テストコードでは正常系で例外が発生しないパターンと、

例外が発生するパターンと2通りのケースを作成しました。

 

本で紹介されていたテスト用インスタンス生成オブジェクトを作ればテストコードがシュッとするのですが、

本のサンプルのようなKotlinのデフォルト引数がJavaでは使えず。。。放置してます

(そこだけKotlinで書いてやろうかなとも思ったのですがビルドも遅くなってごちゃごちゃしたのでやめました)

 

ドメインサービスのサンプルコードを作成してみた感想や気付き

本でも述べられていましたが、

極力使わないようにして、どうしても必要な時だけサービスの利用目的を明記する形で作成。

とすることで、

なんでもやってしまってビジネスルールなども持ってしまう最強サービスを作ってしまわないように

意識することが重要だと改めて理解しました。

 

サービスになんでも書いちゃう方式に僕は今までの現場で慣れてしまっていたので、

気を抜くとそっちに行っちゃいます。。。

 

逆にこの考え方で設計されて作られたシステムの保守などを社会人一発目の現場でできてたら・・・

悪い癖はつかなかっただろうなとも思いました。

(だから新卒にいきなりDDDを教えるとかって話が出たりするのかな)

 

そういえば、、

現場ではよくUtilクラス的なのを作っていろんな今回のチェックみたいなのを全部そこでやってたなぁ。。。

 

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください