業務フローリファクタリングで見える化を実現業務フローリファクタリング(前編)(3/3 ページ)

» 2009年08月31日 12時00分 公開
[今田忠博, 菅野裕,@IT]
前のページへ 1|2|3       

並列分岐(Parallel Split)パターン

 1つのパスから並行した複数のパスに分岐します。トークンは複数のパスに分けられ、同時に複数のパスに流れます。主に複数のタスクを同時に行う場合に使用できます。また、それぞれのパス上のタスクがお互いに依存しない場合に使用できます。

 並列分岐パターンで分かれたパスは、どこかの地点でマージされます。マージには、トークンを待ち合わせる同期(Synchronization)パターン、トークンを弁別する構造化された弁別器(Structured Discriminator)パターン、パスだけを合流させてトークンをコントロールしない複数マージ(Multi-Merge)パターンなどの方法があります。

別名:AND分岐(AND-split)、並列経路(parallel routing)、フォーク(fork)

ビジネスプロセス図

ALT 図6 3種類の並列分岐パターンの表現『BPMN図』

 BPMNでは、並列分岐の表現として3種類の方法があります。図6の3つの図はすべて同じように並列分岐を意味しています。Aが完了すると、トークンはBとCにそれぞれ流れ、たがいに独立に並列して実行されます。

 図6の左のように、アクティビティやイベントから複数の出力フローを持たせると、ゲートウェイで制御されないため、並列でフローが流れます。

 図6の中のように明示的に並列ゲートウェイを使うこともできます。図6左と同じ効果を持つため、並列ゲートウェイを使わなくても問題ありませんが、意図的に並列であることを示したい場合には効果的な表記になります。

 また、より視覚的に並列を表現する方法として、図6右のように並列ボックスを使うことができます。並列ボックスは、展開されたサブプロセスを用いてアクティビティをグループ化したものです。この場合、並列で実行されたタスクの完了は暗黙的に同期されます。並列分岐パターンと同期パターンの組み合わせと考えることもできます。

実例: 旅行代理店における旅行予約システムのフローを例にとります。

ALT 図7 並列分岐パターン例『旅行予約』 (クリックで拡大)

 旅行予約システムは、顧客から旅行の申し込みを受け付け、旅行に必要になる一連の予約を行います。予約のタスクには、航空券の予約、ホテルの予約、レンタカーの予約があります。それぞれの予約タスクは互いに依存しないため、並列に実行可能です。例えば、ホテル予約サービスの応答にしばらく時間がかかるとしても(ホテル予約サービスの中では人が動いているかもしれません)、航空券やレンタカーの予約を待つ必要がありません。

 この例では、並列に分かれたフローは待ち合わせ(同期)たうえでマージしています。航空券、ホテル、レンタカーのすべての予約が完了するまでは旅程確認書を送付することはできません。

注意点:

並列に分岐したプロセスが互いに情報を共有する場合は、配置したタスクがその情報を更新する可能性がないように注意する必要があります。

関連するパターン

・同期(Synchronization)

複数のパスに分かれたトークンをすべて同期させる場合に使います。並列分岐の最も一般的なマージ方法です。

・単純マージ(Simple Merge)

複数のパスに分ける点で並列分岐と似ていますが、条件に従って排他的にパスを選択しトークンが流れる点が異なります。

・複数選択(Multi-Choice)

パスを複数に分け、トークンも並列で流れうる点で並列分岐と似ていますが、複数選択パターンはフローの出力に条件をつけます。

・複数マージ(Multi-Merge)

分かれたパスを1本に合流させる際に使います。ただし、トークンはマージさせません。

・構造化された弁別器(Structured Discriminator)

分かれたパスを1本に合流させる際に使います。ただし、最初のトークンのみ流し、1つ以外はすべてブロックします。

業務フローリファクタリング例:その2(月末処理)

 次も簡単な例です。よくある社内の月末処理を題材にします。

 社内の月末処理は、交通費精算処理と勤怠実績処理・給与計算処理、明細からなり、バッチ処理で起動されます。

ALT 図8 月末処理フロー『リファクタリング前』 (クリックで拡大)

 現在のフローは、交通費精算処理と勤怠実績処理・給与計算処理が終わってから明細を出力するようになっています。交通費精算処理はかなり早く終わることが分かっていますが、いまのフローでは給与計算処理との待ち合わせになっているため、それが終わるまでは先に進めません。

 そのため、先に終わった交通費精算処理の明細を見たくても、勤怠実績処理・給与計算処理の終了を待たなければいけませんでした。

待ち合わせをなくして効率化

 これをリファクタリングしたのが、以下の図9のフローです。

ALT 図9 月末処理フロー『リファクタリング後』 (クリックで拡大)

 「2つの処理を本当に待ち合わせる必要があるのか?」という部分を検討したところ、明細の出力を2つに分割することができることが分かりました。そうすることで、交通費精算処理が終わったあとに交通費精算の明細を出力し、終了できるようになりました。

 今回はタスクの「並列化」の例でした。ワークフローパターンの「暗黙的な終了(Implicit Termination)」を使って待ち合わせが必要なタスクを並列化し、フロー自体を分けることで無駄のないフローにすることができました。


 今回は業務リファクタリングの概要を解説し、実際のケーススタディとして「直列のフローを並列化して効率化」する方法や、「並列分岐のパターン」などを紹介しました。後編となる次回は、「暗黙的な終了パターン」などを詳しく解説します。

筆者プロフィール

今田 忠博(いまだ ただひろ)

株式会社豆蔵 BS事業部。SIの現場でSE、PMなどを経験。SI現場で悲惨な体験をし、開発現場を効率的にしたいと2004年に豆蔵に移籍。SIプロジェクトのアーキテクトやフレームワークの設計・実装、PM支援、要件定義コンサルタントなどの業務を経験。そもそも要求が間違っていると、そのあといくらがんばっても幸せになれないと理解する。現在、要求から設計、実装をつなぐ方法を模索中。著書に『Trac入門』(共著/技術評論社)、記事に『5分で絶対に分かるプロジェクト管理』(@IT)などがある。

菅野 裕(すがの ゆたか)

株式会社豆蔵 BS事業部。SIベンダにて業務システムの設計・構築に携わった後、2004年より現職。システム開発の現場でアーキテクチャの構築や新技術導入の支援、エンジニアの育成などに従事している。著書に『Trac入門』(共著/技術評論社)、『Rubyによるデザイン・パターン』(共訳/ピアソン・エデュケーション)がある。


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ