オプション 2 は、確かに手続き型コードにつながります。
開発は簡単かもしれませんが、維持するのははるかに困難です。
現実の世界では、これは純粋な管理タスクです
「管理」タスクはプライベートであり、完全に「ドメインっぽい」パブリックなアクションによって呼び出される必要があります。できれば - ドメインから駆動される理解しやすいコードで書かれています。
私が見ているように、問題はUndoLastStatus
ドメインの専門家にはほとんど意味がありません。
注文の作成、キャンセル、注文の処理について話している可能性が高いです。
これらの線に沿ったものがより適しているかもしれません:
class Order{
void CancelOrder(){
Status=Status.Canceled;
}
void FillOrder(){
if(Status==Status.Canceled)
throw Exception();
Status=Status.Filled;
}
static void Make(){
return new Order();
}
void Order(){
Status=Status.Pending;
}
}
私は個人的に「ステータス」の使用が嫌いです。それらは、それらを使用するすべてのものに自動的に共有されます-不要な結合と見なします.
したがって、次のようなものがあります。
class Order{
void CancelOrder(){
IsCanceled=true;
}
void FillOrder(){
if(IsCanceled) throw Exception();
IsFilled=true;
}
static Order Make(){
return new Order();
}
void Order(){
IsPending=true;
}
}
注文状態が変化したときに関連するものを変更するには、いわゆるドメイン イベントを使用するのが最善の策です。
私のコードは次の行に沿って見えます:
class Order{
void CancelOrder(){
IsCanceled=true;
Raise(new Canceled(this));
}
//usage of nested classes for events is my homemade convention
class Canceled:Event<Order>{
void Canceled(Order order):base(order){}
}
}
class Customer{
private void BeHappy(){
Console.WriteLine("hooraay!");
}
//nb: nested class can see privates of Customer
class OnOrderCanceled:IEventHandler<Order.Canceled>{
void Handle(Order.Canceled e){
//caveat: this approach needs order->customer association
var order=e.Source;
order.Customer.BeHappy();
}
}
}
Order が大きくなりすぎた場合は、境界付けられたコンテキストとは何かを確認することをお勧めします (Eric Evans が言うように、彼が再び本を書く機会があれば、境界付けられたコンテキストを最初に移動するでしょう)。
要するに、これはドメインによって駆動される分解の形式です。
アイデアは比較的単純です。つまり、異なる視点 (コンテキスト) からの複数の Order を持つことは問題ありません。
例 - ショッピング コンテキストからの注文、会計コンテキストからの注文。
namespace Shopping{
class Order{
//association with shopping cart
//might be vital for shopping but completely irrelevant for accounting
ShoppingCart Cart;
}
}
namespace Accounting{
class Order{
//something specific only to accounting
}
}
しかし、通常、十分なドメイン自体は複雑さを回避し、十分に耳を傾ければ簡単に分解できます。たとえば、分解のアンカーとして利用できる OrderLifeCycle、OrderHistory、OrderDescription などの専門用語を聞くかもしれません。
注意: 覚えておいてください - 私はあなたのドメインについてまったく理解していません.
私が使っているこれらの動詞は、完全に奇妙なものである可能性が非常に高いです。