ソフトウェア工学特論レポート 600P031-4 高木祐介 ---------------------------------------------------------------- キーワード:オブジェクト指向 ---------------------------------------------------------------- オブジェクト指向 (object oriented) は、 構造化 (structured) に続く新しいパラダイムである。 構造化では少数の構造を組み合わせて複雑な概念を表現したが、 データと処理は分離していた。 オブジェクト指向では、 データとそれに対する操作(処理)をまとめてオブジェクトと見なす。 そして、オブジェクト間の相互作用によって全体の処理が進行する。 構造化と同様に、オブジェクト指向は抽象化と分割統治 (divide and conquer) の実践だが、概念の単位が異なる。 構造化では処理が主体であり、データは処理を行なうべき客体だった。 オブジェクト指向ではデータが主体であり、 処理はデータに対する操作かオブジェクト間の相互作用のいずれかである。 オブジェクト指向は人間の認知モデルに近く、 人間に分かりやすい自然な見方、考え方をそのまま表現できると言われる。 ---------------------------------------------------------------- オブジェクト指向プログラミング (OOP: Object Oriented Programming) ---------------------------------------------------------------- 変数は記憶領域を抽象化したオブジェクトと見なすことができる。 記憶領域にサイズ付きのロード/ストアが行なわれるのに対し、 変数には型やデータ構造の概念が導入され、参照や代入が行なわれる。 構造化ではデータ構造、制御構造、プログラムの構成単位 (手続き、モジュール、プロセスなど)といった様々な構造が導入され、 プログラムの静的性質の記述を手続き型から宣言型へ移行させた。 オブジェクト指向ではさらに、動的に定まるデータ操作を 宣言的に記述することができる。 オブジェクト間の相互作用はメッセージ渡し (message passing) によって実現される。 オブジェクトをカプセル化 (encapsulation) し、 メッセージ渡し以外の相互作用を排除することを隠蔽 (hiding) と言う。 オブジェクトは振舞い (behavior)、属性 (attribute)、 アイデンティティ (identity) を持つ。 同じ振舞いを持つオブジェクトは同じクラス (class) に属す。 クラスAのオブジェクトをAのインスタンス (instance) と言う。 クラスAの性質を継承 (inheritance) したクラスBは、 スーパークラスAのサブクラスである。 サブクラスBのインスタンスはスーパークラスAのインスタンスでもある。 スーパークラスのインスタンスとして総称されたオブジェクトが 各サブクラスのインスタンスとして振舞うことを多態性 (polymorphism) と言う。 シミュレーション用の言語 Simula 67 は オブジェクト、クラス、継承をサポートしていた。 純粋なオブジェクト指向プログラミング言語としては、 Smalltalk-80 や Eiffel に今でも熱烈なファンがいる。 しかし、広く使われているのは Java や C++ など オブジェクト指向に拡張された手続き型言語である。 ---------------------------------------------------------------- オブジェクト指向開発 (OOA/OOD: Object Oriented Analysis/Design) ---------------------------------------------------------------- 構造化開発に対して、オブジェクト指向開発はシームレスな工程を持つ。 構造化開発では構造化分析/設計 (SA/SD) を経て、 実装の段階でフローチャート(処理)をひねり出す。 オブジェクト指向開発では分析/設計/実装の全ての工程で オブジェクト単位の表現を使用する。 シームレスな開発工程と共に、 ウォーターフォール型からスパイラル型への移行が進められた。 ミスはなくならず、開発の工程は順序良く進みはしない。 オブジェクト指向開発では分析→設計→実装→分析のサイクルを繰り返し、 反復毎にソフトウェアの完成度を上げていく。 オブジェクト指向手法 (OO Methodology) は提唱者によって全く異なり、 それぞれに信奉者がいて百家争鳴していた。 次に主な手法を挙げる。 ・James Rumbaugh の OMT (Object Modeling Technique) 「オブジェクト指向方法論OMT」(Object-Oriented Modeling and Design), 1991. ・Grady Booch の Booch法 ・Ivar Jacobson の OOSE ・CRC ・Shlaer/Mellor ・Coad/Yourdon ・XP (eXtreme Programming) 代表的な前3者が Rational Software社に集まったことによって 手法を統一する動きが起こり、 1997年に UML (Unified Modeling Language) が OMG (Object Management Group) 標準になった。 UMLは特定の開発手法を強制しないグラフィカルなモデリング言語であり、 それ以前の手法にない並行(並列/分散)処理にも対応している。 数多い種類の図が定義されているが、 特にクラス図、オブジェクト図、シーケンス図は良く見られる。 オブジェクトは箱で表され、オブジェクト間の関係は 関連、汎化、依存、実現のいずれかの線で表される。 図1 オブジェクト図(のようなもの) +-------------+ +-------------+ | Table | | Entry | +-------------+ +-------------+ △ △ |<> |<> | | +-------------+ +-------------+ | Distributed | 1 * | Distributed | | Variable |◆--------| Variable | | Table | <> | Entry | +-------------+ +-------------+ 図2 シーケンス図(のようなもの) Client Stub Skeleton Server +-+ +-+ | | call cast goal | | metacall | |- - - - >+-+==========>| |- - - - >+-+ | | | | | | | | | | request | | cast goal | | bind | | | |-------->| |==========>| |-------->| | | | | | | | | | | | bind | | cast goal | | answer | | | |<--------| |<==========| |<--------| | : : : : : : : : : : : : : : : : | | kill | | cast goal | | bind | | | |-------->| |==========>| |-------->| | | | | | | | | | | | bind | | cast goal | | answer | | | |<--------+-+<==========| |<--------+-+ | | | | : : : : ---------------------------------------------------------------- オブジェクト指向の広がり ---------------------------------------------------------------- 一口にオブジェクト指向と言っても、 分析 (OOA)、設計 (OOD)、実装 (OOP) の各工程は目的が異なり、 継承などの基本的な概念も同一ではない。 オブジェクト指向モデリングの実践として、 オブジェクト指向データベース (OODB) がある。 実体よりも実体間の関係をモデリングする RDB に対して、 OODB は実体の内部(属性と振舞い)をモデリングすると言える。 クラスや継承の概念を持たず、サンプルによってプログラミングを行なう プロトタイプベースのオブジェクト指向言語も存在する。 JavaScript が広く使われている。 オブジェクト指向という概念を開発に限らず ユーザインタフェイスまで広げたオブジェクト指向コンピュータが提唱され、 その一部は Windows や Macintosh で実現している。 また、オブジェクトに自律性を持たせたエージェントという概念も現れた。 ---------------------------------------------------------------- 考察 ---------------------------------------------------------------- オブジェクト指向は構造化の概念(データ構造、モジュール、プロセスなど) を包括するパラダイムであり、比較的新しい並列/分散処理も オブジェクト内の計算とオブジェクト間の通信によって表現できる。 しかし、オブジェクト指向は万能薬ではない。 オブジェクト指向の売り文句に「自然で分かりやすい」とあるが、 計算機の黎明期からのエンジニアは構造化に強く影響を受け、 むしろ構造化開発の方が自然に感じられることもある。 クラスと継承の概念は再利用を促進すると言われていたが、 実際にはむしろ使い回されない傾向も見られた。 継承の連鎖によって全貌が見づらくなり、柔軟性が低くなるからである。 例えば、Java の Serializable はスーパークラスの情報を加えるので 直列化の結果が大きくなる。この問題はサブクラスの再定義では回避できない。 Externalizable はプログラマが直列化の結果を定義し、 この問題を回避できるように追加された。 構造化の黎明期に goto 論争があったように、 オブジェクト指向はようやく黎明期を終えて普及期に入ったようである。 他に適切な道具がなければ躊躇なく goto を使うように、 オブジェクト指向が適切な道具であるか否か 場合によって使い分ける必要がある。 ソフトウェア開発に王道はなく、 オブジェクト指向もまた効果的なコミュニケーションの道具として 認識されるべきであろう。 ---------------------------------------------------------------- 参考文献 ---------------------------------------------------------------- www.asahi-net.or.jp/~dp8t-asm/java/articles/OOAD/article.html www.ceres.dti.ne.jp/~akon/ www.chienowa.co.jp/frame1/ijinden/ www.ogis-ri.co.jp/otc/hiroba/technical/Jouhoushori-UML/ www.omg.org www.st.rim.or.jp/~k-kazuma/ www.tech-arts.co.jp/obj_seminar/