DDD / Knowledge-Rich Design


Knowledge-Rich Design (17)

要約

ドメインには、エンティティだけでなくビジネスの機能やルールも含む。

"航海(Voyage)"における"積み荷(Cargo)"のブッキングの例

積み荷をブッキングするアプリケーションでは、次のようなコードが現れるだろう。

public int makeBooking(Cargo cargo, Voyage voyage){
  // get confirmation, and add the cargo to the voyage.
}

しかし、商船業界においては、最終的にキャンセルされる積み荷が出ることが多いため、"オーバーブッキング" と呼ばれる方法をとっている。オーバーブッキングとは、「その船が積める最大量よりも多く積み荷を受け入れる事」である。

このオーバーブッキングの実装は、よく次のように書かれる。

public int makeBooking(Cargo cargo, Voyage voyage){
  double maxBooking = voyage.capacity() * 1.1;
  if((voyage.bookedCargoSize() + cargo.size()) > maxBooking)
    return -1;
  
  // get confirmation, and add the cargo to the voyage.
}

しかしこれでは、

  1. ビジネスエキスパートはルールが満たされているか確かめにくい
  2. 開発者は要求とコードを結びつける事が難しい

そこで、デザインを変更して

public int makeBooking(Cargo cargo, Voyage voyage){
  if(!overbookingPolicy.isAllowed(cargo, voyage)) return -1;
  
  // get confirmation, and add the cargo to the voyage.
}

Overbooking Policyクラスのメソッドは

public boolean isAllowed(Cargo cargo, Voyage voyage){
  return (cargo.size() + voyage.bookedCargoSize()) <= (voyage.capacity() * 1.1);
}

とすれば、

  1. 開発者含め皆が、オーバーブッキングが大事なビジネスルールだと認識できる。
  2. プログラマがビジネスエキスパートに実装した事を見せる事ができる。

(オーバーブッキングのルールはポリシーであり、このデザインはSTRATEGYデザインパターンとしても知られている。)

担当者のつぶやき

Knowledge-Richなデザインとは、「Knowledge(ここではオーバブッキング)をあらわにしてドメインにリッチに出現させる」デザインって事??

つっこみお願いします。

みんなの突っ込み

  • 「Knowledge-Richなデザイン」ですが、この例みたいにドメインに関する知識を設計・実装レベルに落ちるまで表現して設計する、ということだと思います。例だと、Policyというドメインを切り出すことによって、Policyが実装サンプルどおりサービス的にSTRATEGYパターンで実装するのが望ましいかとか、Voyageかそのサブクラスの型によって決まるものなのか、Cargoに対して決まるものなのか、あるいは状態によって決まるかとか、対応するとして多重度はどうなるのかとか、、ルールをどう設計するか(ドメインがどういうものなのかというknowledge)についてより深い理解ができるようになっていると思います。 -- 古山? 2008-07-03 (木) 01:34:16


まとめ (議事録)