Web教材一覧システムの調達

オブジェクト指向

キーワード

オブジェクト指向,インスタンス,カプセル化,メッセージ,ポリーアフィズム,クラス,インヘリタンス,CORBA


オブジェクト指向アプローチ(OOA:Object Oriented Approach)とは、プログラムやデータ、その組合せなどをオブジェクト(もの、部品)としてとらえ、その部品を組み合わせてシステムを構築するアプローチです。

オブジェクト指向の用語・概念

インスタンス、クラス、オブジェクト
[佐藤太郎]や[田中花子]が「学生」という視点でとらえれば、[佐藤太郎]と[田中花子]は、氏名、学籍番号、学部など同一のデータ構造をもち、入学する、単位を取得する、卒業するなど同一の手続をもっています。このような場合、[佐藤太郎]と[田中花子]をインスタンス、「学生」をクラスといいます。
 オブジェクト実体と訳されますが、その定義は場合により異なります。インスタンスを指すこともあればクラスを指すこともあり、その総称として用いることもあります。ここでも混同して用いています。
クラスとインスタンスのような関係を「is-a」といいます。「一種 is-a 全体」で、「インスタンス is-a クラス」となります。
カプセル化、隠蔽
通常のデータベースでは、データだけを管理しています。外部(プログラマ)は、データをアクセスするときに、ある属性(項目、フィールド)の名称だけを知っていればよく、その位置や桁数などを知る必要がありません。このように、ある情報を内部で管理することをカプセル化、それを外部から見えなくする(知る必要をなくす)ことを隠蔽といいます。カプセル化と隠蔽を同義語として用いることもあります。
 オブジェクト指向では、データだけでなく、それを処理する手続き(メソッドという)までもカプセル化し隠蔽します。
 すなわち、カプセル化(隠蔽)は、オブジェクトの性格を決めるデータ構造や値を隠蔽し,オブジェクトの外部から直接アクセスすることを禁止することであり、それにより、オブジェクトのデータ構造やメソッドを変更した場合でも,外部への影響を避けることができ,オブジェクトの独立性を向上させることができます。また、オブジェクトの再利用が容易になります。
メッセージ
オブジェクト指向では、「単位を取得する」というメソッドがカプセル化されていれていれば、[佐藤太郎がシステム設計論の単位を取得する]処理をするとき、[佐藤太郎][システム設計論]をパラメタとして[単位取得]というメソッドを呼び出せば(その命令をメッセージといい、オブジェクトにメッセージを伝達することをメッセージパッシングといいます)、処理手順を知る必要はなく処理できるのです。
 例えば、販売システムでは、「受注」「在庫」「仕入」「会計」などのオブジェクト間をメッセージを交換する(「~情報」などの矢印)ことにより構築できます。
伝播(プロパゲーション)
あるオブジェクトに対して操作を適用したとき、関連するオブジェクトに対してもその操作が自動的に適用される仕組みです。

クラス図関連の概念・用語

オブジェクト指向でのシステム開発では、モデル記述にUML図法を用いますが、そのうちE-R図のようにデータの構造を示すクラス図が重要になります。
 以下、クラス図に関係するいくつかの概念を示します。

多重度
E-R図の実体(エンティティ)に相当するのがクラス、関連(リレーションシップ)に相当するのが多重度です。
 「社員は必ず唯一の部門に属し、部門は1人以上の社員を持つ」ときは、下のように図示します。「1」、「1..*」が多重度です。
   ┌────┐親  子┌────┐
   │ 部門 ├────┤ 社員 │
   └────┘1  1..*└────┘
    クラス  多重度  クラス
 主な多重度を示します。
  1    1
  *    0以上  *─1..* どの部門にも属さない社員、兼任している社員もいる
  0..*  0以上  1─0..* 社員がいない部門もある
  1..*  1以上
継承(インヘリタンス)
[佐藤太郎]や[田中花子]は「学生」ですが、さらには「人間」でもあります。「乗用車」や「トラック」の上位概念として「自動車」があります。このようにクラス間に上位のクラスと下位のクラスがあるとき、上位クラスをスーパークラス(基底クラス)、下位クラスをサブクラス(派生クラス)といいます。
 スーパークラスで定義されたデータ構造と手続をサブクラスで引き継いで使うことができます。それをインヘリタンス(inheritance;継承)といいます。例えば、自動車で定義したハンドルやタイヤなどの部品構成や、生産する、販売するなどの手続きについては、乗用車やトラックで再定義する必要はなく、乗車人数や積載重量などサブクラス特有のものだけを定義すればよいのです。新たにバスを追加するときは、バス特有の事項だけを検討すればよいのです。すなわち、継承という概念によって,モデルの拡張や変更の際に変更部分を局所化できます。
 ここでは1つのスーパークラスからの継承でしたが、複数のスーパークラスから継承することを多重継承といいます。C++は多重継承をサポートしていますが、Javaはサポートしていません。
委譲(デリゲーション)
メッセージを受け取ったオブジェクトがその操作を別のオブジェクトに委託して実行することです。
継承は、下位クラスへの操作を上位クラスの操作で行いますが、それには先に定義しておく必要があり、静的なつながりです。それに対して委譲は、クラスのメンバ変数(フィールド)に別のクラスの参照を持ち、そのクラスの機能を使うことができる動的なつながりになります。
オーバーライド
プログラミングの用語では、スーパークラスから継承してきたメソッドを再定義することを、オーバーライドといいます。例えば、スーパークラス「自動車」に car() というメソッド(関数)があり、「乗用車」というサブクラスで、そのメソッドを car("乗用車") として再定義するようなことです。
汎化
サブクラスの共通部分を抽出して、スーパークラスとして定義することを汎化(generalization)といいます。△の記号で表します。乗用車やトラックのクラスに共通部分が多いことから、自動車というスーパークラスを設定するようなことです。スーパークラスからみれば継承、サブクラスからみれば汎化だといえます。「乗用車 is-a 自動車」のように、汎化は「is-a」の関係を示したものだともいえます。
汎化の逆を特化といいます。乗用車やトラックを汎化したのが自動車であるのに対して、自動車を特化したものが乗用車やトラックです。
集約
「部分 part-of 全体」の関係です。例えばタイヤと自動車は「タイヤ part-of 自動車」で、自動車はタイヤの集約しているといいます。◇の記号で表します。
コンポジション
集約と似たもので合成集約ともいいます。部分は1つの全体に属し、全体が削除されるとそれに属する部分がすべて削除されるという関係になります。◆の記号で表します。例えば、請求書と明細では、1枚の請求書に多数の明細項目があり、「明細項目 part of 請求書」の関係になっています。そして、請求書が破棄されれば明細も破棄されます。
ポリモーフィズム
同一名称のメソッドをもつオブジェクトを抽象化してクラスを再定義するポリモーフィズム(多相性)といいます。
 単純にいえば「同じメッセージで、受取側オブジェクトごとに異なる動作にできる」ことです。例えばメソッド名printOut(devise)の引数を出力機器とし、それをプリンタとすれば印刷、ディスプレイとすれば画面表示になります。
オーバーロード
プログラミングの用語でポリモーフィズムに似たものに、オーバーロード(多重定義)があります。同一の関数名で、引数の個数や型により、異なった処理を行わせることです。単純な例では、整数型や浮動小数点型、複素数型の値について同じ「abs」という関数を定義したり、round(x)ならば、整数値に四捨五入、round(x,2)ならば小数点以下2桁で四捨五入するなどがあります。

オブジェクト指向関連事項

オブジェクト指向プログラミング言語(OOP)
代表的なオブジェクト指向プログラミング言語を掲げます。
 ・C++:C言語をオブジェクト指向に発展させたもの
 ・Java:Web環境でよく用いられるオブジェクト指向言語
 ・Java Script:HTMLに内蔵されるオブジェクト指向のスクリプト言語
クラスライブラリ
OOPでは、小さな処理をするプログラムをクラスといい、そのクラスを組み合わせてプログラムを作成します。そのクラスを集めたものをクラスライブラリといいます。クラスライブラリは自作することもできますが、多様な団体が公開しています。HTMLを使ってアプリケーションを作成するとき、公開ライブラリのURLを script で指定すればよいのです。
UML
オブジェクト指向でシステムを設計・開発するときの多様な標準的な図法。ISOやJISにもなっている。(→参照:「UML」
オブジェクト指向データベース
オブジェクト指向をデータベースの視点から理解することも必要です。(→参照:「オブジェクト指向データベース(OODB)」
コンポーネント指向
部品の再利用を目的とした、オブジェクト指向の拡大概念です。オブジェクト指向での部品集をクラスライブラリといいますが、コンポーネント指向ではコンポーネントといい、コンポーネントを組み合わせてシステムを構築します。
コンポーネントはクラスと比較して、次の特徴があります。
  • 部品の粒度が比較的大きい。オブジェクト指向ろSOAの中間的位置づけ
  • 基本的にはOSやミドルウェアを限定しない。プラットホームに限定されない。
  • 継承などの難しい概念が省かれ簡略化されている。組立てが簡単
CORBA(Common Object Request Broker Architecture)
オブジェクト指向技術の標準化団体OMG(Object Management Group)が制定した,オブジェクト指向による分散処理環境を実現するためのオブジェクト管理プラットフォームの参照モデルです。分散システム環境で,オブジェクト同士がメッセージを交換するための共通仕様である。オブジェクト間通信の基本インタフェース,相互運用規定などから成っています。
JavaBeans
Java言語は典型的なオブジェクト言語です。JavaBeansはJava言語で開発されたコンポーネントでサーバに保存されます。JSP(JavaServer Page)は、サーバ側で動作するアプリケーションで、HTMLからの指示により該当するJavaBeansを起動し、その結果をHTMLに生成し、ブラウザに表示します。すなわち、開発者はHTMLでJavaBeansを組み合わせたアプリケーションを作成し、その結果をブラウザで確認することができます。
COM(Component Object Model)
マイクロソフトが提唱するソフトウェアの再利用を目的とした技術です。COMを使用して開発されたソフトウェア部品をCOMコンポーネントといい、これを組み合わせてシステムを構築する技法がコンポーネント指向アプローチです。
ActiveX
マイクロソフトのブラウザのアドオンソフトの総称です。多くのブラウザがActiveXが使えるようになっています、このなかのActiveXコントロールはCOMコンポーネントを作成したり、連携する機能をもっています。単純にいえば、COMはJavaBeans、ActiveXはJSPに相当する機能です。