@IT|@IT自分戦略研究所|QA@IT|イベントカレンダー+ログ | ||
Loading
|
@IT > ソフトウェア開発4つの課題(4) |
企画:アットマーク・アイティ
営業企画局 制作:アットマーク・アイティ 編集局 掲載内容有効期限:2004年12月31日 |
|
|
ソフトウェア開発4つの課題 第4回 アーキテクチャの記述方法 Nightmare before Chiristmas about Software Architecture 日本IBM 藤井智弘 アーキテクチャをモデル化(記述)するための方法を紹介する。ツールにはRational Unified Process(RUP)におけるアーキテクチャ表現「4+1ビュー」を利用する。RUPでは、開発プロセスに関与する特定の利害関係者がシステムに対して持っている各自の関心事項を扱うために「ビュー」を定義している。(アットマーク・アイティ編集局)
世はクリスマス一色になってきましたね。日頃、スロー・ライフをスローガンにしている私は、先日東京ディズニーランドにて実践に励んでまいりました(しかも、平日に)。この時期の見所は、ぷーさんでもバズライトイヤーでもなく、ホーンテッドマンションでしょ、やっぱり(期間限定だし)。@ITの難しい記事に頭を悩ますのもよし、でも本記事(クリスマス前のNightmare)でリフレッシュするのもいいんではないでしょうかね?
我が愛する映画「Nightmare before Chiristmas(邦題:ナイトメアー・ビフォア・クリスマス)」では、主人公のJackがクリスマスにあこがれて、サンタクロースの真似事をします。でもJackはクリスマスではなく、ハロウィーンの主役……彼は「クリスマス」というコンテキストを理解することなく、形だけをまねることによって、恐ろしい結果を引き起こしてしまうのです。これまで個々のシステム開発現場でコードを書いてきたエンジニアが、キャリアアップの過程でアーキテクチャに責任を持たされるということがあります。この場合、(彼は)何を考えるとアーキテクチャを扱っているということになるのでしょうか?
アーキテクチャは、システムの静的・動的両面の情報を持つ。アーキテクチャをモデル化するためには、何らかの整理された視点が必要になる。一例として、Rational Unified Process(RUP)におけるアーキテクチャ表現「4+1ビュー」を紹介する。 RUPでは、開発プロセスに関与する特定の利害関係者(例えば、ユーザー、設計者、管理者、開発者、運用管理者など)がシステムに対して持っている各自の関心事項を扱うために「ビュー」を定義し、それらを総称して、「アーキテクチャー・ビュー」と呼んでいる。以下の5つのビューで構成される(視点の違いを加味して「4+1ビュー」と呼ばれる。
以下、イタリック部分は「Rational Unified Process 2003」からの引用である。
アーキテクチャというと、システムの内部構造だけに気をとられがちだが、外部からみたシステムの振る舞いも重要な要素である。RUPでのアーキテクチャには、システムの振る舞いも含む。このビューでは、内部構造を決定する振る舞いやリスクを含むユースケースを中心にリストアップする。
通常我々がモデリングと称する作業を行うのは、この論理ビューで行われる。中心となるクラスからそのグループ(=パッケージ)、さらにグループ間の関係(ここでは1つの例として、レイヤー構造を挙げている)をモデリングする。実際にはクラス図だけではなく、動的側面を表すシーケンス図、ステートチャートも含まれる。
論理ビューは文字通り、論理的側面をあらわしており、実装面(例えばjarの編成)には踏み込まない。これを扱うのが実装ビューである。コンポーネント間の依存関係や、実利的コンポーネントと論理ビュー上の要素との関係付けを行っている。
同時並行アクセスに注意を払わねばならぬシステムの場合に、使われるビュー。筆者は業務系アプリケーションを主に手がけているが、プロセスビューを作ることはほとんどない。
物理的なコンピュータ資源を取り扱うビューである。お絵かきツールでコンピュータのアイコンを使って描いていたようなネットワーク構成図などが相当する。 これらの情報は「アーキテクチャ設計書」というドキュメントにまとめられる。注意してほしいのは、どのビューにおいても、「サブセットである」という但し書きがあることだ。つまり、アーキテクチャビューというのは、次の特性を持つ。
一言でアーキテクチャとは言っても、どの範囲を考慮するかによって考慮すべきことは異なる。最近のはやり言葉「EA」(Enterprise Architecture)では、企業あるいは関連する企業グループ全体の基盤となるシステムの構造を、マクロ的視点から見て決定する。しかし、これは(私ごときが扱うには)荷が重過ぎる。本稿では、個別システムでのアーキテクチャ設計を対象に考えてみよう。 GangOfFour(GoF)の「デザインパターン」の成功以来、設計に限らず、ビジネスモデルや分析といった抽象度の異なるレイヤーでも、パターン化するというのが、業界の流れである。アーキテクチャについても、パターン化が提案されている(*)。 *参考文献: 「Pattern-Oriented Software Architecture-A System of Patterns」(Frank Buschmann、Regine Meunier、Hans Rohnert、Peter Sommerlad、Michael Stahl著、John Wiley and Sons, Inc.1996.) アーキテクチャパターンは、システムの内部構造をどう分割するかのパターン集であり、その意味では、デザインパターンよりも大きな粒度のパターンである。業務系でのよく利用される代表的なものに、レイヤーパターンがある。レイヤーパターンは、システムの論理構造にフォーカスしているので、先ほどの4+1ビューでの論理ビューで扱うことが対象となる。 前回(「第3回 アーキテクチャ基礎講義」)の議論からおわかりいただけるように、アーキテクチャを考えるということは「システムの構造を抽象化する」ということにほかならない。データ項目の詳細やアルゴリズムの詳細を網羅的に考えるのではなく、そのシステムを特徴付けるモノに焦点をあてて考える。 ○ 構造的側面 コンポーネントステレオの例では、CDやDVDなど具体的なものを取り上げて構造を考えるという視点と、それらを音源という抽象的なものとして(構造を)考える視点があった。オブジェクト指向言語を使ったプログラミングでは、抽象的な概念もクラスとして扱う(世にいう抽象化)プログラミングが可能である。これを積極的に利用することで、再利用可能な基盤を作ることができる。
利用する側の視点で抽象を考えると、「普遍的すなわち、業務のあちらこちらで共通して扱われる概念である。あるいは共通項の多い、処理プロセス」とみなすことができる。構造的側面では、抽象的な概念を扱うサブ構造と、そのシステムに依存した機能を実現するサブ構造とを区別し、それらの相関関係を定義する必要がある。 ○ 個別システムに不可欠な要素 個別システムでは、前述の構造的側面でのサブ構造が、どう相互作用することで所定の機能を実現するかを考えなければならない。この相互作用をモデル化するためには、
などが必要になる。構造的側面では「どんな概念を扱うか? その概念がどう分類できるか?」という視点から、主として抽象化の階層を考える。しかし、システムを稼動させるためには、それに加えて、システムでの実現手段を加味しなければならない。例えば、商取引のシステム化のコンテキストでは、次のように関心を捉えることができる。
これまでのところをまとめると、アーキテクチャを考慮するときの基本方針は、以下のようになる。
通常、分析や設計の初期では、クラスの数がさほど多くない。しかしパフォーマンスや性能などを考慮すると、クラス構造を分割せざるを得なくなる。したがって、前期の方針に従って見出されたクラスは、設計の初期モデルでパッケージにマッピングされることが多い。これにより、分割されたクラス群(パッケージで代表)と分析レベルでのクラスとの対応付けがやりやすくなる。
J2EEや.NETというプラットフォーム毎にあるべきアーキテクチャ論が語られており、@ITのサイトでもそれに関する記事が出ている(例えば「建築家の視点、アーキテクトとしての共通認識」)。プラットフォームを意識する中でのアーキテクチャ論の詳細はそちらをご参照いただきたい(「IT アーキテクト フォーラム」)。だが、アーキテクチャを導き出す思考の方針はいずれも共通している。結果としてのアーキテクチャよりも、その思考法のほうが重要であるのはいうまでもない。まとめとしてその手順を簡単に示そう。
プラットフォームの勉強に加えて、業務ドメインのアーキテクチャ化も重要な課題である。これを幹とできれば、システムはどんどん発展し、やがて雲を突き抜けて、Jackはいつしか大空へ(……って、それは「Jackと豆の木でしょ」)。 |
|