0000. C#−[オブジェクト指向プログラミング(OOP(object-oriented programming))]
オブジェクト指向プログラミング(OOP)とは、プログラムを、互いにメッセージを送信しあうオブジェクトの集合として構成する技法です。
オブジェクト指向(object-oriented)
オブジェクト指向とは、データ構造(属性(property))と振る舞い(操作(operation))が一体となったオブジェクトの集まりとしてソフトウェアを組織化することです。
オブジェクト指向による効果としては、次の点が挙げられます。
- 抽象化(abstract) ⇒ 複雑性の回避
- 情報の隠蔽 ⇒ 保守性の向上
- 継承(inheritance) ⇒ 再利用性の向上(クラス単位で再利用が可能)
![オブジェクト指向(object-oriented)](../images/object-o.gif)
C(手続き型言語)との比較
Cなどの手続き型言語(Procedural Language)では、データ定義部とそれを操作する手続き部を独立して考え別々に記述し、手続き部は「構造化プログラミング」などの手法によりソースコードの読み易さに主眼を置いています。
⇒ データとプロセスの分離
![手続き型言語の図解](../images/object-o1.gif)
一方、オブジェクト指向言語(Object-Oriented Programming Language)では、同一のデータ構造を持つオブジェクト群に対して、そのデータ構造の定義情報や手続き群は、通常、クラス(class)と言う抽象的な概念のもとにまとめて記述されます。
オブジェクトに対して手続きの実行を要求する場合、より抽象度の高いメッセージをオブジェクトに対して送ることで行います。送られたメッセージに対応する手続きは、オブジェクトの型に応じて実行時に決定されます(遅延束縛)。このように、オブジェクト指向言語ではオブジェクトの機能や意味に主眼を置いています。
⇒ データとプロセスをカプセル化(encapsulation)
![オブジェクト指向言語の図解](../images/object-o2.gif)
オブジェクト指向プログラミング(OOP(object-oriented programming))
オブジェクト指向プログラミング(OOPと略される)は、データとそれを操作する手続きを一体にした抽象データ型(Abstract Data Type)を定義し、この抽象データ型を用いて宣言した変数を主体にプログラムを作成します。
オブジェクト指向プログラミングには、次の機能・特徴が必須となっています。
- 多態性(polymorphism) ⇒ 関数や演算子をクラスごとに多重定義すること。
- オブジェクト(クラス) ⇒ カプセル化(encapsulation)とも言う。
- 継承(inheritance) ⇒ 派生クラス(derived class)
次に、オブジェクト指向プログラミングにおける各用語を解説します。
- オブジェクト(object)
性質や状態を表す属性(property)と、自身や外部に対しての作用を表す操作(operation)を持つ。
- クラス(class)
オブジェクトを抽象化した枠組み。
クラスの大きさをクラスの粒度と言う。
クラスからオブジェクトを生成することをインスタンス化すると言う。
![インスタンスの生成](../images/object-o3.gif)
has-aの関係
OOP(Object-Oriented Programming)における再利用の実装に一つに、「has-aの関係」の再利用がある。⇒ part-of関係
「has-aの関係」は、"オブジェクトAはオブジェクトBを持つ"といったhave動詞的な関係で、別の定義済みクラス型のインスタンスをクラスのデータメンバとして再利用する方法である。
このとき、"オブジェクトA"を集約された側と言い、全体を意味する。また、"オブジェクトB"を分化された側と言い、全体を構成する要素を意味する。⇒ 集約と分化の関係、部品性
![has-aの関係説明図](../images/object-o4.gif)
- 汎化(generalization)
複数のオブジェクトから共通している概念を抽出し、より抽象的なスーパークラス(super class)を定義する。
- 特化(specializetion)
個々のクラスでは、汎用的なクラスの共通する内容をそのまま利用して異なる部分だけを定義する。
この様にしてスーパークラスを継承し、更に差分を定義したものをサブクラス(sub class)と言う。
サブクラスで定義する項目は、@サブクラスだけが持つ「属性」・「操作」、Aスーパークラスの「操作」に対する変更のみである。
is-aの関係
「is-aの関係」は、"オブジェクトAはオブジェクトBである"といったbe動詞的な関係で、別のクラスの性質(属性、操作、関係)を引き継ぐ形で再利用する方法である。⇒ 継承
このとき、"オブジェクトB"を一般化された側と言い、共通的な性質に着目して抽象化したクラスである。⇒ 基本クラス(base class)、スーパークラス
また、"オブジェクトA"を特化された側と言い、基本クラスの性質として共通化できなかった性質(差分)だけを定義したクラスである。⇒ 派生クラス(derived class)、サブクラス
![is-aの関係説明図](../images/object-o5.gif)
- 継承(inheritance)
既存のクラスの概念を利用し、更に概念を追加して新しいクラスを定義する。
プログラミングレベルでは、あるクラスを基にして新しいクラスを作成することを派生(derivation)と言い、この時のフィールドやメソッドなどを新しいクラスに引き継ぐこと。
これにより、差分プログラミング(incremental programming)が可能となる。
- 多態性(polymorphism)
同一のメッセージであったとしても、それを受信したオブジェクトによって機能・動作が異なること。
- カプセル化(encapsulation)
オブジェクト内のデータを隠蔽したり(データ隠蔽)、オブジェクトの振る舞いを隠蔽したり、オブジェクトの実際の型を隠蔽したりすることを言う。
これにより、仕様変更やプログラムの改変による影響を最小限にとどめることができる。
update:2008.09.11
□トップページに戻る。□
Copyright (C) 2008 S.IKE