
オブジェクト指向,モデルとモデリングの考え方についてちょっと考察してみるべか.
ソフトウェア開発において,オブジェクト指向“OO”といえば,
- オブジェクト指向言語- オブジェクト指向プログラミング- オブジェクト指向データベース- オブジェクト指向分析- オブジェクト指向設計など,いろんな言葉で表現されるものがありますが,その明確な定義は存在しないと言われています.
ソフトウェアに求められる要件としては,
- 正確さ:正しく作業を実行すること- 頑丈さ:異常な条件のもとで適切に対応できること- 拡張性:仕様の変更にソフトウェアが対応しやすいこと- 再利用性:多様なアプリケーションでソフトウェアが利用できることなどが挙げられます.構造化プログラミングは,プログラミングの機能を幾つかの単位に分ける(サブルーチンによって詳細な記述を行う)C言語が代表ですが,オブジェクト指向プログラミングは,基本的には構造化プログラミングの発展形であり,関連性の強い“データ”と“機能”をひとまとめにするものです.ここでのオブジェクトとは,単にロジックとデータを1つにまとめたものではなく,オブジェクトの共同体の責任あるメンバーとなります.オブジェクト指向プログラミングのアイディアとしては,カプセル化(オブジェクト内のデータや機能を外から見えなくし,外部に公開された機能を通じてオブジェクトにアクセスできる),継承,ポリモフィズム(オブジェクトへの操作が呼び出し側ではなく受け手によって決定される)があります.つぎにクラスとインスタンスですが,クラスは抽象的なもの(例えば銀行口座),インスタンスはクラスから生成される具体的なもの(例えばteruの銀行口座)であらわされます.
オブジェクトの要件としては,つぎの3つがあります.
- 状態(state)オブジェクトが内部で保持している値.Javaではフィールド(インスタンス変数)に対応
- 振る舞い(behavior)オブジェクトが何らかの処理をすること.Javaではメソッドに対応.
- アイデンティティ(identity)あるオブジェクトとほかのオブジェクトを区別できるようにすること.オブジェクトはIDを持つ.JavaではIDを直接的に触れることはできない.
ソフトウェア開発の基本的な流れは,実現したい目的があり,その目的を実現するためにどのようなソフトウェアを作成すべきか検討し,最終的にはプログラムが作成され,目的が実現されることになります.ここで,ある問題が発生します.それは実現したい目的をいきなりプログラムに変換することが大変だというギャップの存在です.
ここで現実世界の事象をソフトウェアで表現できるように抽象化していくモデルとモデリングという手法を経てからプログラミングを行うという方法が考え出されました.
モデルは,大きくつぎのように分類されます.
・問題領域モデル- やりたいこと
- ドメイン分析モデル
- 要求分析モデル
・解決領域モデル- やりかた
- システム分析モデル
- 設計モデル
- 実装モデル
ソフトウェア開発では,設計モデルと実装モデルをプログラミングすることになり,つぎのようなフェーズがあります.
・要求分析- どのようなソフトウェアを作るのかはっきりさせる
・設計- 要求分析の結果を実現するためにソフトウェアを設計する
・実装- 設計に従ってプログラムを作成する
・テスト- プログラムがうまく動いているかチェックする
開発プロセスでは,こうした各フェーズを組み合わせて,繰り返しながら開発を進めていくことになります.開発プロセスは大まかにつぎのように分類されます.
・ウォーターフォール型システム全体の要求分析・設計・実装・テストを順番にこなしていく.ソフトウェアがきちんと動いているかどうか,最終段階までよくわからないということで批判されることがありますが,見積もりをとりやすいこと,フェーズごとに担当を変える事が可能であることから,現在最も使われることの多い開発プロセスです.
・反復型機能ごとに要求分析・設計・実装・テストを順番にこなしていく.
- 段階的リリース:できたものから順にリリースしていく
- タイムボックス:設定された各反復期間内で開発できるものをこなす.
1990年代前半,Boochの“Booch法”やRambaughの“OMT法”,Jacobsonの“Objectory法”といったさまざまなオブジェクト指向開発方法論が提案・利用されていて,これらをまとめたものは統一プロセス:Unified Processと呼ばれています(この3人は“スリーアミーゴ”と呼ばれています).統一プロセスの商用版としては,Rational社(現IBM)のRUP(Rational Unified Process),サブセットとしてIBMからEclipse Foundationに寄贈されたオープンソースのOpenUP/Basicがあります.また,最近は“アジャイル(agile)”という俊敏な反復型開発プロセスのジャンルが注目されています.アジャイル開発プロセスの特徴はつぎのとおりです.
・個人や相互作用(プロセスやツールよりも)- Individuals and interactions over processes and tools
・動くソフトウェア(包括的なドキュメントよりも)- Working software over comprehensive documentation
・顧客との強調(契約交渉よりも)- Customer collaboration over contract negotiation
・変化への対応(契約に従うよりも)- Responding to change over following a plan
アジャイル宣言よりここでUML(Unified Modeling Language(統一モデリング言語)の登場です.UMLとは,モデリングを表現するためのグラフィカルな言語で,さまざまな図でモデリングに関するの一側面を表現するものです.UMLの歴史は,1996年 UML 1.0,2003年 UML 1.5,2005年 UML 2.0というバージョンを経ています.UML 2.0ではつぎの図(ダイヤグラム)が用いられます.
・アクティビティ図・オブジェクト図・クラス図・コミュニケーション図・コンポーネント図・コンポジット図・シーケンス図・ステートマシン図・相互作用概要図・タイミング図・配置図・パッケージ図・ユースケース図ずいぶん沢山の図がありますが,UMLはずべての図を記述しなければならないわけではなく,基本的には必要なものだけ使えばよいことになっています.通常は“クラス図”,“シーケンス図”,“ユースケース図”の3つが中心になります.UMLは主に,スケッチ(ささっと書く),設計図(設計の意図を文書化),プログラミング言語(UMLの図がプログラムに変換される)として使われます.
しっかし,オブジェクト指向ってピンとこないな^^;