ドメインには、エンティティだけでなくビジネスの機能やルールも含む。
積み荷をブッキングするアプリケーションでは、次のようなコードが現れるだろう。
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. }
しかしこれでは、
そこで、デザインを変更して
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); }
とすれば、
(オーバーブッキングのルールはポリシーであり、このデザインはSTRATEGYデザインパターンとしても知られている。)
Knowledge-Richなデザインとは、「Knowledge(ここではオーバブッキング)をあらわにしてドメインにリッチに出現させる」デザインって事??
つっこみお願いします。