ICONIX

ICONIX概要 ICONIXとは、ユースケース駆動開発の手法の一つです。決して最近の技法ではなくUMLが登場した頃に誕生した手法ですが、本質的でスモールセットな側面も相まって、今日でも依然として有用な手法となっています。 ICONIXの特徴は、ざっと纏めると以下の様になります。 ユースケース駆動で、ロバストネス図、シーケンス図へと動的モデルを詳細化すること 動的モデル導出の過程でクラス図の静的モデルを導出すること 分析過程でこれら動的側面と静的側面を突き合わせ検証と洗練を繰り返すこと 純粋なUMLに加えロバストネス図を活用し動的モデルのミッシング・リンクを補完すること ICONIXの利点 厳密な用語定義 ICONIXを適用すると何が良いのでしょうか。まず第一に用語が洗練されます。用語の整理は一般的には用語集等を作成しますが、ここでの付加価値は用語の定義の厳密化だけです。多くの場合、用語自体には何の検証も入りません。ICONIXの場合は、プロセス全体を通じて用語を検証します。ここで検証された用語は以下に提示される厳密さを持ちます。 # 項目 説明 1 名称 用語の名称です。利用局面の想定して検証し抽象度や観点を検討しています 2 関連 用語間の関連です。用語同士の関連が明確になります 3 数的関連 用語間の数的関連です。1:1の関係にあるのか1:Nの関係にあるのかが瞭然です 4 関連の方向 用語の関連の方向性です。一方的な関連なのか双方的な関連なのかも見分けられます 5 関連の抽象関係 用語同士の抽象関係です。抽象化した用語や具象化した用語を確認できます 6 関連の保有関係 用語同士の保有・包含関係です。用語の構造が明確化されます 7 属性 用語が含む属性情報です。用語一つでどれだけの情報を保持しているかが明確になります 8 操作 用語が実行可能な操作です。用語の振る舞いを明示し責務を確認することができます   これだけ分析されているのであれば、一般的な用語集よりはるかに明確に分析できている分かると思います。一方で、この全て分析するのは相当骨が折れるのではという懸念も生じるかもしれません。確かに労力は掛かりますが、この分析は繰り返して行うため負荷は分散されます。特に最初の分析はラフなものでも構いません。むしろ最初から詳細な分析は不可能で、動的モデルの分析が進むのにつれて徐々に詳細化できてくる、というのが自然な流れです。最終的にはプログラムレベルのクラス図に近いレベルの詳細な概念モデルが醸成されます。 詳細化可能な動的モデル 動的モデルの分析はユースケース図・ロバストネス図・シーケンス図と詳細化されます。またそれぞれの図には明確な役割があります。簡単にまとめてみましょう。併せて、各分析過程でドメイン用語がどう洗練されるのかも提示します。 # 項目 説明 ドメイン用語 1 ユースケース図 利用者がシステムを利用する際のユースケースを明示します。機能要件の定義に相当します 名称と各種関連 2 ロバストネス図 各ユースケースの動きを概念レベルで捉えます。画面・処理・データの相互作用を定義します。機能設計に相当します エンティティとしての属性情報 3 シーケンス図 各ロバストネス分析のコントロール処理を詳細化します。クラス毎の責務を明示化するプログラム設計に相当します 各種クラスとしての操作 (振る舞い)  こうしてみると、ラフな仮説から整合性を担保しながら詳細化してゆく、とても理に適った分析手法だということが分かるのではないかと思います。また、無駄に多くの設計書を書き上げるのではなく、最小限のUML(ロバストネス図も含む)のみで分析を進められるというのも工数的に魅力ですし、そのUMLの力を最大限に引き出して、無駄なくプログラムに落としやすい分析・設計工程が踏めるというのも魅力です。

ICONIX - 1.Domain分析

ICONIXの分析工程 ここでは、ICONIXの分析工程を見てゆきます。最初に全てのベースとなる静的モデルのドメイン分析、続けて動的モデルのユースケース分析、ロバストネス分析、そしてシーケンス分析と進みます。この過程で、全ての主要な用語はドメイン分析で作成したドメインモデル(用語集)を元に行わなければなりません。 例えば、ドメインモデルに「ユーザー」と定義したならば、以降の分析に現れる用語は「利用者」ではなく「ユーザー」です。用語のブレを許さずに「ユーザー」に統一しなければなりません。逆に「利用者」の方が適切だと思ったならば、以降の分析で使う文書の訂正より先にドメインモデルを書き直す必要があります。それほどドメインモデルは影響力の高いものなわけです。 では、そのドメインの分析から始めたいと思います。 ドメイン分析 ドメインモデルは全ての工程の基本となります。何故ならそれが正規の用語集となるからです。フワフワとした曖昧な言葉を棄て、正確で本質的な用語を捉えてゆくと、思考がクリアになります。また、ドメイン用語は属性も定義しますので、誰かが「ユーザー」と記述 (会話) した際、そこに「ユーザーID」「氏名」「住所」等の関連属性が含まれているか否かという点も明確になります。 ですから、仮に「ユーザーID」や「氏名」「住所」等が含まれていた場合は、記述や会話の中で「ユーザー」という表現が出た場合にこれらの情報も含むことが分かるわけです。厳密さだけではなく簡潔さも手に入れる事ができます。会話と文書が徐々に変わってゆくのが体験できるかも知れません。 Before: システムはユーザID, 氏名, 住所を画面に表示する。 After : システムはユーザー情報をユーザー詳細画面に表示する。 ドメインモデルの抽出 ドメイン分析を行うには、最初にドメインモデルの候補を抽出します。これはドメインエキスパートが提供するユーザーストーリー等から導き出します。何やら難しそうに聞こえますが、ドメインエキスパートというのは業務に詳しい担当者、ユーザーストーリーとは業務の流れを説明した文章です。要は「業務担当者のお話を聞いたり文章を読んだりしてキーワードを見つける」という作業に過ぎません。 ユーザーストーリーが存在しない時は、関連がありそうな文書を漁ってみます。それは簡単なシステム化の企画書かも知れませんし、何らかのマニュアルや、時には誰かが残したメモかも知れません。文書化されたものがなければ業務担当者へのインタビューで代替するのも一案です。 主要なドメインモデルの選出 ドメインモデルの候補が抜き出せたら、候補の中から主要なドメインモデルを選出します。対象システムとの関連性が薄そうなモデルを一旦脇に寄せて主要なモデルだけを選りすぐります。 例えば営業支援システムを開発しているとします。“営業担当”, “売上実績” 等は関連が深そうですが、“社用車”, “出社時刻” 等は関連が薄そうです。こうして関連の深そうなモデルを主要なドメインモデルとします。 これが重要なのは、直前の工程で多くの候補が出た場合 その全てを分析するのは大変だからです。逆に利用頻度が高く重要なものに絞って分析すれば時間の節約になり効率の良い仕事ができます。 その他のモデルの分析も無意味ではありませんが、分析初期の貴重な時間が惜しいですし 分析初期の精度にもあまり期待できません。それよりかは重要なドメインモデルに絞って分析し、フィードバックを得ることで徐々に分析精度を高めた後に、その他のモデルを追加した方が効率的という考え方です。 スコープ外に区分けしたドメインモデルも、後から必要だと分かった時に分析することは可能なので、ここでは一旦スコープを限定してしまいます。 モデル名のチェック 抽出したドメインモデルには最初から名前が存在しますが、あくまで仮の名称として捉えてください。分析が進んでも名前が変更されない保証は何一つありません。「今までそう呼ばれてきたから」「その時はその名前が良さそうに見えたから」という程度の理由で名前付けされている可能性も高く本質的な名前とは限りません。勿論それが最適な名前である可能性もありますが、最初はそれを疑ってください。 例えば、以下に示すのはあまり良くない名前の例とその改善例です。 # 問題点 例 改善方針 改善例 1 抽象的すぎて他のモデルと衝突しがち 担当者 修飾子を付けて具体化 ○○社経理担当 2 名詞に見えるが実体は動詞 承認 別のモデルの「操作」に分類 「経理部長」内の「承認()」に移動 3 同じものに複数の名称が存在 - クレジットカード

ICONIX - 2.UseCase分析

ユースケース分析 静的分析であるドメイン分析が(たたき台ベースで)終わったら、次にユースケース分析に入ります。ユースケース分析とはシステムの利用者(アクター)とシステムとの利用局面を洗い出すことで、システムに求められる機能要件を洗い出すものです。 また、利用者とシステムとの接点が判明するので局面毎の非機能要件を定義することもできます。例えばアクター(システム管理者)の画面操作は日に何十回と行われ、秒単位で応答する必要があるが、アクター(バッチタイマー)からのデータ操作は日に1度しか行われず、1時間以内に終われば良い…といった形です。 アクター分析 アクターとは外部からユースケースに働きかける存在で ユースケース図の上では 人型(スティックマン) で表現されます。表現上では人の様ですが、先の例の様に必ずしも人とは限らず 関連システムである場合もあります。要するにアクターの本質は単に外部からシステムに働きかける 役割 に過ぎません。 アクターの観点と抽象度 アクター分析で難しいのは、同じ人やシステムをどの観点から捉えるかという点です。同じ人間でも、男性、会社員、営業部長、人事評価者、スポーツクラブ会員、有権者、普通免許所持者、等の色々な側面(役割)を持つからです。大事なのは次の2点です。 どの観点から アクターを見るか どの抽象度で アクターを表現するか [シナリオ] 例えば、100を超える各種APIを管理するシステムを運用している部署「API管理部」があるとします。この部では社内外に公開されるAPIを管理しており、マイクロサービス毎にグルーピングされたAPIを登録・管理しています。管理下に置かれたAPIは、API毎のアクセス量やサービスレベルの計測、認可機能の付与やAPI仕様書の公開、といった汎用サービスを受けられるものとします。 さて、このシナリオのアクターとして「API管理部長」が登場したとします。これは特に不思議ではありません。しかし、この部長が実際に行っているのが「API登録時の承認作業」だけだとしたら「API登録承認者」の方が適切な名前かも知れません。(観点の調整) ところが別の事実が判明し、現時点での実業務はAPI登録時の承認作業だけですが、本来任されているのはAPIの品質管理全般だとしたら「API品質責任者」が妥当な名前でしょう。(抽象度の調整) ここでは「大まかな観点の抽出」→「システム視点での具象化」→「役割視点での抽象化」」の順にアクターを分析してゆきました。実際にどのような順番で分析するかは分析者の自由です。大事なのはファーストアイデアに飛びつかず、常に改善の余地を探ることです。 [観点や抽象度の重要さ] 写真撮影や絵画の世界では、視点(構図)や焦点(ピント)が非常に重要です。アクターにおける観点と抽象度もそれと比較すると分かりやすいかも知れません。軽視しても一応の作品(分析)は出来るものの、名作には成り得ないという点も似ているような気がします。 自分で定義したアクターに満足いかない場合は、以下の質問に答えてみると何かが見えるかも知れません。 自分が分析対象のシステムになったつもりでアクターを見ると、アクターはどの役割に見えますか? アクターの抽象度を上げたり下げたりして名称を変えてください。どの名称が一番しっくりきますか? アクターの汎化 ドメイン分析には汎化という関連がありましたが、アクターの世界にも汎化は存在します。汎化は無理して抽出する必要もありませんが、汎化関係を明示したほうが役割の階層が理解しやすくなるケースもあり、その場合は汎化を表現することをおすすめします。 例えば、先のアクターとして登場した「API品質責任者」ですが、この役割の人でなくとも「API管理部」の人間であれば誰でもAPI管理システムにログインし、API稼働状況の確認が出来るとします。仮にこの役割を「API一般管理者」とします。更にAPI品質責任者がAPI一般管理者の役割を含むのであれば、両者には汎化(継承)関係がありそうです。 これを検証するには「API品質責任者がAPI一般管理者として振る舞うことが可能か」を確かめてみて下さい。可能であれば関係の関係が成立していると言えそうです。 ユースケース分析 アクターの分析が完了したらユースケースの分析を行います。ユースケースは楕円の中にアクターの行動を記述して表現します。アクターを(主語)として「(目的語)を(動詞)する」という書き方にすると描写が明確になります(*1)。 表現方法として「〜することができる (Can)」「〜する可能性がある (May)」といった助動詞を含む書きっぷりもありますが、こうすると一見 正確なようで助動詞部分に曖昧さが残ります。これが結構なデメリットとなるのでこの様な表現は控えた方が良いです。ユースケースとして存在するのかしないのかを確認し、存在するならはっきりと言い切る様にしましょう。 *1) 目的語を明示すると後の工程で処理すべき情報(エンティティ)を明確にする効果があります。エンティティの詳細はロバストネス分析の際に説明しますが、ここでは処理対象の情報 (エンティティ) を明確にしておくと後の分析が楽になる」くらいに捉えてください。 目的を書くか手段を書くか ユースケースの書きっぷりには大きく2種類あります。それは目的でユースケースを書くか、手段でユースケースを書くかです。 1.目的 例えば、先のユースケース「APIの稼働を確認する」を例にとります。APIの稼働を確認するというのは最終的な目的です。最終的な目的は明白ですが、一方で具体的な作業は不明です。「実装に引きずられない抽象化されたモデルは良いものだ」という声も存在しその点はその通りなのですが、「システムとの具体的な対話が分からなければシステム設計も難しい」というのもまた事実です。 2.手段 一方で「APIのモニタリングページを閲覧する」というユースケースであれば、具体的な作業は明白です。しかし今度は目的が曖昧になってしまいます。モニタリングページを閲覧する目的はAPIの稼働確認ではなく性能確認かも知れません。目的が分からなければシステム化により何をしたかったのかが曖昧になり、その達成度も測れないでしょう。 3.両方 では一体どうすれば良いのか。一つの答えは両方を書くことです。両方を書くとゴチャゴチャしそうですが、整理して書けば決してそうはなりません。整理して可視化できるところがUMLの長所ですので、これを活用しない手はありません。ユースケースの部分を2層に分け、目的の層 (第一層)と手段の層 (第二層以降) で階層的に記述すれば、それぞれの長所を競合なく取り込むことができます。 こんな感じですね。 システム境界の明示 次に、システムとの境界を明示します。境界を明示することでどのユースケースがどのシステムに所属するのかを明示できます。今回は目的と手段を分けて記述しているので、システム化された手段の部分だけを境界内に含めています。こうすることで、ある目的のため2系統のシステムを操作しなければならないユースケースも表現できますし(あまり見かけませんが)、何より表現として正確です。 関連線の詳細化 (Option) ドメインモデル程ではありませんが、ユースケース図上でも関連線の表現が幾つかありますので、余力があったら詳細化しても良いでしょう。 一方で、読み手が詳細な関連線に混乱してしまい、却って理解を妨げるようなケースもあります。その様な場合であれば無闇な詳細化は避けるべきです。正確な図を書くのは単なる手段であって、理解を共有するのが本当の目的ですから。