Open1

ドメイン駆動設計入門メモ

RoyRoy

第4章 ドメインサービス

サービスとは何か

一般的な意味だと以下

誰かのために何かを行うこと、他者の助けになること。無形の財や価値あるいは労役などを提供すること。奉仕。用役。尽力。提供。

https://www.weblio.jp/content/サービス

ソフトウェア開発の文脈で語られるサービスはクライアントのために何かを行うオブジェクトを示す。

ドメイン駆動におけるサービスとは

2つに文脈が分かられる。

  1. ドメインサービス: ドメインで扱う振る舞いで不自然になるものを扱う
  2. アプリケーションサービス: アプリケーション側の振る舞いを扱う

不自然さがあるドメインオブジェクト

以下はUserオブジェクト同士を比較して重複確認をしている。呼び出し側で不自然さが出ている

class User():
  def __init__(self, id: int, name: str, email: str) -> None:
    if id == 0:
        raise ValueError("id cannot be None.")
    if name == '':
        raise ValueError("Name cannot be None.")
    if email == '':
        raise ValueError("Email cannot be None.")
    self.id = id
    self.name = name
    self.email = email
  
  def Exists(self, checkUser: 'User') -> bool:
     if self.email == checkUser.email:
        return True
     return False
     
user1 = User(1, 'taro', 'email@example.com')
user2 = User(2, 'jiro', 'email@example.net')
# Emailの重複チェックをするのに、生成したUserオブジェクトを比較元と比較先を決めて指定している。結果はどちらの結果をもとに重複しているとするのかを見ただけで理解できるものになっていない
if user1.Exists(user2):
   raise ValueError('duplicate Object')