ユーザーがフォームに記入するはずの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();
}
質問は? –
BigNastyMethodからロジックを引き出す方法はありますか?デザインパターンは役に立ちますか?どちら? – Chris