少なくともあなたは正しい道を進んでいます。典型的な間違いは、パターンだけを見ることです。
ドメインとは、あなたが扱っている問題を意味します (電子商取引、医療、会計などのサポート)。ドメイン モデルは、私たちのメンタル モデルにできるだけ近いコードで表される問題の解決策です。
一般的な e コマースの例を見てみましょう。顧客が商品を閲覧し、カートに追加し、注文します。注文フルフィルメント担当者が注文を発送します。
あなたの例では、次のようなものから始めます。
class Product { }
class Customer
{
Cart Cart;
void PlaceAnOrder()
{
order = new Order(Cart.Products);
Orders.Add(order);
Cart.Empty(); //if needed
}
Orders Orders;
Orders UnfulfilledOrders()
{
Orders.Where(order => !order.IsFilled);
}
}
class Cart
{
void AddProduct(product)
{
Products.Add(product);
}
void Empty()
{
Products.Clear();
}
}
class Order
{
bool IsFilled;
void Order(products)
{
Products = products;
IsFilled = false;
}
void Fill()
{
IsFilled = true;
//TODO: obviously - more stuff needed here
}
Money TotalPrice()
{
return Products.Sum(x => x.Price);
}
}
class System
{
void Main()
{
SimulateCustomerPlacingAnOrder();
SimulateFulfillmentPeople();
}
void SimulateCustomerPlacingAnOrder()
{
customer = new Customer();
customer.Cart.AddProduct(allProducts.First());
allCustomers.Add(customer);
}
void SimulateFulfillmentPeople()
{
foreach (var customer in allCustomers)
{
foreach (var order in customer.UnfulfilledOrders())
order.Fill();
}
}
}
最初は、これはやり過ぎのように思えます。手続き型コードを使用すると、少数のコレクションと少数の for ループで同じことが実現できます。しかし、ドメイン駆動設計の考え方は、本当に複雑な問題を解決することです。
オブジェクト指向プログラミングはうまく適合します - それにより、前に進むときに重要ではないものを抽象化できます。また、あなた (およびあなたのドメインの専門家 (問題を理解している人)) が何年経ってもコードを理解できるように、それに応じて名前を付けることが重要です。コードだけでなく、ユビキタスな言語で話すことも必要です。
私は電子商取引のドメインと、あなたが解決しようとしている問題の種類を知らないことに注意してください. これが、ドメイン モデリングの教育が非常に混乱し、難しい理由の 1 つです。また、私の理解によれば、CSの学位を取得するための主な要件ではない抽象的思考の優れたスキルが必要です.
境界付けられたコンテキストについては親切です。しかし、それらの間で翻訳が必要になることを覚えておく必要があります。それらは複雑さを追加し、いつものように、複雑なソリューションは複雑な問題にのみ適しています (これは ddd 自体にも当てはまります)。そのため、ドメイン エンティティの意味が重複しない限り、スパムを避ける必要があります。2番目の理由(「自然」ではない)は、分解の強い必要性です。
Psエヴァンスの本を読んでください。2回...意味がわかるまで... :)