2009-06-09 8 views
4

私はビジネスプロセス管理アプリケーションを構築しています。それには次のようなエンティティがあります。課題とタスクは、互いに1つの問題として多くのタスクに関連しています。タスクと問題の両方は、独自の状態を持ち、状態の1つが別の状態に影響する可能性があります。2つの状態マシンを同期させる

たとえば、両方に「キャンセル」と「完了」の状態があります。問題の状態を「キャンセル」に変更すると、そのタスクはすべて「キャンセル」されます。すべてのタスクの状態を「完了」に変更すると、問題は自動的に「完了」になります。

両方のエンティティのステートがかなりあり、あるステートから別のステートへの遷移のロジックがあり、ステートの依存性が変わる場合、その状況を処理するためのデザインパターンやベストプラクティスはありますか?心に飛躍

答えて

2

デザインパターンは、このような状況のために、私はデータベースのテーブルを作成し、「ルール」;-)あなたが好む場合

か、換言すれば、コマンドパターン

、あります

ステータスが一致するように状態を更新するより複雑な場合には、この処理が役立つことがわかりました。

たとえば、1つのシステムでは、要求ドキュメントが複数の委員会審査ステーションを通過しなければならないワークフローがありました。これらの各審査ステーションは、ドキュメントを拒否したり、次のステージに渡したり、カスタムの副作用処理を行います。委員会組織、処理構造、および処理動作は、開発中にの3回、の展開の初年度で5回の大幅な変更となりました。

+0

これは、問題に応じてアクションを実行するサービスです。これはワークフローを管理するうえで最適なパターンですが、2つのステートマシンをきれいな透過的で保守可能な方法で同期させるのに役立つわけではありません。 – artemb

+0

は、 "同じステータスを作る"と同等のアクションがトリックをしないでしょうか? –

+0

私は本当にそのような行動を想像することはできません。たとえば、問題の状態を「キャンセル」に更新するCancelIssueActionがあります。その問題のタスクをすべてキャンセルしたい場合は、それをCancelIssueActionにコーディングする必要があります。これはあまり透明ではありません。 – artemb

2

私は、この種のもののオブザーバーパターンを好む:http://en.wikipedia.org/wiki/Observer_patternあなたが与えた例では、私はタスクでその問題を観察し、問題はタスクを観察していました。問題がキャンセルとマークされている場合、タスクはそれを見て自分自身をキャンセルします。タスクが完了したとマークされると、その問題はそれを見て、他のタスクが完了しているかどうかを確認します。

関連する問題