2009-03-09 15 views
0

ユーザーがフォームに記入するはずのWebアプリケーションがあるとし、バックエンドワークフローエンジンにチケットを作成するとします。このフォームは引き続き、顧客が何が起こっているかを見るためのポータルです。チケットの作成にはいくつかのフォームがあります。他人はチケットを発行する前に他の人の承認を得なければならず、拒否することもできます。これは、電子メールを送信し、フォームの質問に対する回答を追跡し、アップロードされた添付ファイルを追跡し、フォームの状態を変更するためのさまざまなアクションが行われたときに「更新」を記録します。リファクタリングの楽しみ:複雑な状態を扱う

フォームが最初に送信または保存されたときに何をすべきかを決定するビジネスロジックは、毛深くなり始めており、私はそれをリファクタリングする方法を検討しています。私は州/戦略のパターンを見始めましたが、結局のところ、すべてのロジックがまとめてまとめて1つの場所にまとめておく必要があるようです。さらに、回答/添付ファイル/ログエントリに依存するすべてのもので、それは追跡する必要があるので、模擬テストを挿入するのが複雑になります。

ここでフォームオブジェクトの「保存」機能の擬似コードレイアウトが簡略化されています。これは厄介なものになり始めています。私は何とかそれをきれいにすることができるかどうかを確認しようとしています。

if(this.isvalid) 
{ 
    if(isNewForm && !this.needsApproval) //just created, so start up a ticket 
    { 
     CreateTicket(); 
    } 

    if(!isNewForm && justApproved) //pulled from the DB earlier, and was just approved 
    { 
     CreateTicket(); 
    } 

    if(!isNewForm && justDenied) //pulled from the DB earlier, and was just denied 
    { 
     this.needsApproval = false; 
     this.closed = true; 
    } 

    if(isNewForm) 
    { 
     SendNewFormEmail(); 
     if(this.NeedsApproval) 
     { 
      SendNeedsApprovalEmail(); 
     } 

     this.CommentEntries.Add("Request submitted."); 
    } 
    else if(justApproved) 
    { 
     SendApprovalEmail(); 
     this.CommentEntries.Add("Request approved."); 
    } 
    else if(justDenied) 
    { 
     SendDenialEmail(); 
     this.CommentEntries.Add("Request denied."); 
    } 

    this.Save(); 

    this.Answers.Save(); 
    this.Attachments.Save(); 
    this.CommentEntries.Save(); 
} 
+0

質問は? –

+0

BigNastyMethodからロジックを引き出す方法はありますか?デザインパターンは役に立ちますか?どちら? – Chris

答えて

2

私は最近州立機械について多くのことを考えており、次の提案が非常に有望であることが分かりました。私はそれが本当に素晴らしいことを伝えることができればいいと思うが、私はまだそれを得ていない。私はそれが私がこれまでに試みたどの解決策よりも見栄えが良いと言うことができます。

switch (FormState) { 
case JustApproved: 
    .... 
case JustDenied: 
    .... 
} 

その擬似コード、それが動作するかどう言って一生懸命:ここHierarchical State Machine

0
if (isNewForm) { 

    if (JustDenied) { 
     ... 
    } 

    if (JustApproved) { 
     .... 
    } 

} else { 
    ... not a new form ... 
} 

私は、おそらくあなたの取扱いがJustDeniedかわからないんだけど、...]リンクです。しかし、はい、私はあなたが投稿したものがパスタに似て始めていることに同意します。

0

これはWorkflow Foundationの優れた候補者だと思います。

問題は複雑なステートマシンを書くのではなく、ビジネスのダイナミックスを扱うことです(パスタのように見えることもあります)。ルールは変わり、コードを変更する必要があります。あなた自身がこれを見つけたので、保守性はここで悪夢になりやすいです...

関連する問題