TechBlog株式会社ホワイトプラスのエンジニアによる開発ブログです。2019の18日目の記事です。はじめに最近入社した私は業務知識を短期間で習得するため、オンボーディングとしてベテランエンジニアとペアプロで開発を進めています。その時の様子はこちらの記事にまとめましたので、読んでいただくとペアプロの雰囲気を感じられると思います。ホワイトプラスが運営するリネットではドメイン駆動設計(DDD)を取り入れた開発をしており、今回私は初めてDDDを実践しました。開発を進める中でクラスにロジックをどのように持たせるのかが肝だと感じており、その基本的な考え方の一部をTodoアプリを例にまとめました。クラスに仕事を与えるTodoの登録時にタイトルと期限日を指定して登録する場合、それぞれを表現するクラスを用意します。(DueDateのプロパティであるDateクラスは日付を表現するクラス)期限日を指定しないで登録する際、DBにはnullではなく未定の日付形式を入れておきたいとします。DueDate(Date::distantFuture()));このときの未定の日付をクライアント側で生成すると、生成時にどんな値を入れるかを毎回意識しなければならないし、日付未定の値が変わった時に呼び出し元をすべて直さないといけなくなります。生成はDueDateクラスに任せます。}}クラスの仕事を考える今度はTodoの完了処理をする時、期限内に終えられたかどうかを判定する処理を書きます。完了日クラス(CompletedDate)を新たに作成し、与えられた期限日をもとに期限内かどうかを判定すると良さそうです。}}これだと「期限内かどうか」のロジックがCompletedDateクラスに書かれていて、DueDateクラスが仕事をしていません。DueDateクラスの仕事を考えた時に、期限日より前か後かを判定するのがメインになるので、「与えられた日付が期限内かどうか」はDueDateクラスに持たせ、CompletedDateクラスはそれを使うようにしたいです。}}クラスを用意した時にどんな仕事を持たせていくのかある程度想像しておくことが大事です。クラスの仕事を内部に閉じ込めるTodoの完了処理をサービスクラスに書きます。完了処理時点で期限日を過ぎていた場合は、過ぎた日数を記録しておきたいとします。}}差分を表すDateRangeクラスの生成ロジックがサービス側に流出してしまっています。DueDateとCompletedDateのgetterで必要な情報を抜き出して生成するのではなく、情報を持っているクラスに任せます。ここでは、完了した時に完了日と期限日の差分を取得するので、差分の生成はCompletedDateクラスで行うのが良さそうです。実際の業務をコードに落とし込むことができ、理解しやすいものになると感じています。ホワイトプラスではDDDを実践したいエンジニアを募集していますので、興味があればご応募してみてください。2019の17日目の記事です。Reservedスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。