オブジェクト指向プログラミングとは!?
Javaは一般的にオブジェクト指向言語と呼ばれます。しかし、Javaでプログラムを記述しただけでオブジェクト指向プログラミングを実現できるかというと、そうではありません。Javaであってもオブジェクト指向的な考え方をしていなければ従来のようなオブジェクト指向の恩恵に与れないプログラムになってしまいます。つまり Javaはオブジェクト指向の考え方を実装可能なプログラミング言語と言う事が言えます。
ではオブジェクト指向ってどういうことでしょう・・? オブジェクト指向というものは今までのプログラミング指向から、より人間に近い考え方、すなわち実際の 「もの」 を 抽象化 したものをソフトウェア開発に適用しようという考え方になります。
人間社会をオブジェクト指向の考え方で眺めると、一人一人の人間をオブジェクトと考えることができます。そして独立した人間(オブジェクト)が集まって会社や社会というシステムを構築しています。
人はそれぞれ自分の役割を持っていて、一人では出来ない仕事は会話を通じでコミュニケーションを取って他の人と協力をしながら全体として1つの仕事を行う姿がオブジェクト指向の基本的考え方です。
オブジェクト指向では、自分の責任(責務と呼びます)でない仕事に関しては別のオブジェクトに任せてしまいます。 それぞれが作業を依頼し合いながらシステムを構築します。人間社会と同様に、依頼をしたら後は相手に任せるということになります。
オブジェクト
オブジェクト
オブジェクトを簡単に言ってしまうと、機能とデータが一体化された 「もの」 になります。一人一人の人間をオブジェクトと考えることが出来ると説明しましたが、人で言えば、「名前」「歳」などがオブジェクト特有のデータになり、人は「歩く」「食べる」と言った振る舞いが機能になります。
上記で、オブジェクト指向とは実際の 「もの」 を 抽象化 したものをソフトウェア開発に適用する・・・ と説明しましたが、「もの」 といっても目に見えて触れることができる有形な 「もの」 もあれば、概念的で、直接見たり触れたりできない無形な 「もの」 もあります。
| 有形なもの |
無形なもの |
| 人、車、いす、PC、携帯電話 |
旅行、会議、授業、注文 |
|
クラス
次にクラスです。 クラスとはオブジェクトを作るための設計図みたいなもので、同じ特性を持つオブジェクトの集合に名前を付けたものです。
また、オブジェクトの特性を抽象化したものともいえます。クラスは一般的に「魚」「鳥」「花」「石」「水」などの名詞で表現します。このようにクラスとは共通点のあるもののグループに対して名前をつけているのが分かる思います。
クラスが「学生」である場合、学生には、さまざまな種類があります。「小学生」、「中学生」、「高校生」、「大学生」などがありますが、これらの共通的な定義は「学生」となります。
抽象化とは、複数のオブジェクトの属性や手続きのうち、共通の部分を抽出することを指します。つまり、複数のオブジェクトの原型・雛形(クラス)を作ることに相当する。又、これをインスタンス(実体)にすることを、インスタンス化という。
属性と操作
オブジェクトには、「有形なもの」と「無形なもの」 の2種類があると前述しました。それぞれどのようなものを「属性」、「機能」と呼ぶのか考えてみましょう。
属性
物理的なオブジェクトの属性としては、「大きさ」「重さ」「色」などがあります。人をオブジェクトと考えると、「名前」「生年月日」「身長」「体重」「血液型」などはそのオブジェクトの属性になります。
概念的なオブジェクトの場合も考えてみましょう。例えば会議というオブジェクトを考えた場合、「日時」「場所」「議題」などがオブジェクトの属性が挙げられます。
例えば「Aさんの12月の定例会議」というオブジェクトのあるときの状態は、日時=“12/1/2002”、場所=“201会議室”、議題=“開発進ちょく状況レビュー”というように表すことができます
機能
物理的なオブジェクトの振る舞いとして、例えば「人」をオブジェクトとして考えると、「話す」「歩く」「食べる」「寝る」「働く」などの操作(振る舞い)を挙げることができるでしょう。
概念的なオブジェクトの場合は、「会議」をオブジェクトとすると、「開催場所を設定する」「開催日時を設定する」「議題を設定する」といった機能(手続き)を考えることができます。
カプセル化
カプセル化とは、オブジェクト内に含まれているデータを外部から隠蔽し、外部からは公開されている関数やメソッドからのみアクセス出来るようにすることを指します。
このようにカプセル化することでオブジェクトの独立性が高まり、オブジェクト内部の仕様変更などが外部に影響しにくくすることが出来ます
色を表すオブジェクトでカプセル化を考える。
現在はこの色を表すオブジェクトが色データを RGB(光の三原色)で保持していたとします。しかし何らかの理由で内部のデータを RGBから CMYK(色の三原色)に変更しなければならなくなったとします。
もし外部から RGBデータに直接アクセスしていた場合、正しい値を得られなくなりますが、カプセル化を行ってメソッドを利用してアクセスしていたならば、メソッドの内容を変更することで、呼び出し元が期待する値を得ることができるわけです。
従来の設計指向では「 処理は処理だけ 」 「 データはデータだけ 」となっています。あるプログラムが処理に必要とするデータはその度に参照しなくちゃいけない。処理の互いの連携は、グローバル変数という大きな変数が制御の役割を担っています。
グローバル変数はどこからでもアクセス可能で便利なのですが、その反面グローバル変数の値が破壊されてしまうと、全体が制御不能になってしまいます。
又、このように、データと処理が分離していると、外部からの操作によって勝手にデータを書き換えられる可能性も非常に高くなってしまいます
継承
継承とは、クラスの持つ機能や情報を引き継いで新しいクラスを作成する機能を指します。
例えば、既に「自動車」クラスが存在していて、このクラスには「走る」や「燃料」といった機能、属性が定義されているとします。そこに新たに「バス」クラスと「乗用車」クラスを作成する場合、これら二つのクラスは大きな括りで見ると「自動車」であるとも考えることが出来、「走る」「燃料」といった機能、属性も持っています。
この時「バス」「乗用車」クラスは「自動車」クラスを継承して新たなクラスとして作成することが出来ます。「自動車」クラスをスーパークラス(又は基底クラス)と呼び、「バス」「乗用車」クラスをサブクラスと呼びます。
継承をすることでサブクラスはスーパークラスの機能を引き継ぐことが出来ますので、サブクラスごとに「走る」機能を実装しなくてもスーパークラスで「走る」を実装すれば良くなります。このように継承を使用することで新規で追加になる機能や、機能が変わる箇所のみをコーディングして新たなクラスを作成することが出来るようになります。
ポリモーフィズム
ポリモーフィズムとは、それぞれ別々のオブジェクトで、操作(振る舞い)が同じでも、オブジェクトが属するクラスによって挙動が変わる仕組みのことを指します。もう少し簡単に言うと、メソッド名は同じだけど内部の処理は各オブジェクトによって異なる仕組みです。
例えば、「動物」クラスを継承した、「犬」、「猫」、「馬」クラスがあります。これらは、「鳴く」という振る舞い(インターフェイス)をもっているが、実際の鳴き声は違います。
「鳴く」というメソッドが「犬」「猫」「馬」どのクラスのインスタンスでも実行可能であるということは、このメソッドに関して、「犬」「猫」「馬」の各クラスが同じ振る舞い(インターフェイス)を持っているのだということになります。
一方、鳴き声が「犬」「猫」「馬」各クラスで異なるということは、「鳴く」メソッドの実装は共通ではないということです。つまり、インターフェイスは「動物」クラスで定義し、実装は「犬」「猫」「馬」クラスで定義するのが自然です。
このように、インターフェイスがひとつでも、オブジェクトが属するクラスによって挙動が変わる仕組みのことをポリモフィズムと言います(多態性・多様性・多相性などと訳される場合もあります)。
|