オプション2は、手順コードを確実に導きます。
開発は簡単かもしれませんが、維持するのがずっと難しくなります。現実の世界では今
これは
「管理」タスクは、プライベートとパブリック、完全に「domain`ish」アクションを介して起動する必要があり、純粋な管理タスクです。好ましくは、まだドメインから推し進められる分かりやすいコードで書かれています。
私が見ているように、問題は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;
}
}
私は個人的に「ステータス」の使用を嫌うが、それらは自動的にそれらを使用するすべてのものに共有されている - 私はそのunnecessary couplingとしてを参照してください。注文の状態変化が、最善の策はそうdomain eventsと呼ばれる使用するとき
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();
}
}
}
注文があまりにも巨大に成長した場合、あなたはエリック・エヴァンスが言うようbounded contextsは(何であるかをチェックすることをお勧めします - 彼は彼の本を書いた機会があった場合再び、彼は有界の文脈を始めに移すだろう)。
要するに、それはドメインによって引き起こされる分解の形式です。
アイデアは比較的単純です。さまざまな観点から別のコンテキストを持つ複数のオーダーを持つことは問題ありません。
など。 - ショッピングコンテキストからの注文、会計コンテキストからの注文。
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などのエキスパート用語から、分解のためのアンカーとして活用できることが分かるかもしれません。
注意:あなたのドメインについての理解は全くありません。
私が使用している動詞は完全に奇妙なものです。
遅い返答をおかけして申し訳ありません、このような詳細でよく考えられた応答を提供していただきありがとうございます。おそらく誰かが私に提供してくれたより良い答えの1つです。 –
お客様が注文をキャンセルした場合、次のビジネスルールがあります:1)カートから注文を取り除く、2)店舗で予約を取り除く、3)顧客のお金を補償する(既に支払い済みの場合)?それらが 'Order.Cancel'メソッドにあるとは想像できません。 – Lightman