タイトル(OO-Style)
タイトル(オブジェクト指向りゅう)

はじめに prev<<>>next オブジェクト指向の基本要素

オブジェクト指向とは

オブジェクト指向とは、といきなり書き始めるとさっそくつまづいてしまいそうですが・・、全てを「もの」として考えていこうという発想が第一にあります。

構造化プログラミングで、「処理」を建設的に組むことができても、処理とデータに関連がないのが非常に問題で難しいところした。 例えば1例ですが下図のように、処理1でデータを設定し、その後処理2データを使うようにしていても、処理2が動作する前に誰かに処理Aなどを入れて、 データが書き換わり、処理2がうまく動作しない(デグレ)。。 という経験は誰しもお持ちではないでしょうか?(このデータの背景などはちょっと置いておいて)

構造化プログラミングの問題点イメージ

オブジェクト指向では、「処理」と「データ」を1まとまりとしたクラスという枠を導入し、このクラスを組み立てることでシステム全体を構成しようというものです。 それではオブジェクト指向じゃなくてクラス指向じゃん。。といわれそうですが、クラスはいわば定義であって、実際はクラスからインスタンスを作り(クラスで定義したものを実際にメモリ上に展開する) このインスタンスでの動作が主体となります。このクラスから生成させたインスタンスを総称してオブジェクトと呼んでいるので、クラス指向ではなく、オブジェクト指向なのです。(きっと)
先ほどの「データ」に着目すると、クラスを用いることでデータに対するアクセスをクラス内部の処理で制限をかけるなと、あらゆる手をクラスにて行うことができるようになり、データの安全性も高まります。 これは後述するカプセル化に相当する事柄になります。

OOPでのデータアクセスイメージ

で、処理とデータが1つになったクラスを定義して(オブジェクト指向で開発をして)何がいいのか?何ができるのか?どうするのか? をお話していきますが、ここで再度、「もの」として考えていく。ということが大切です。

いきなり、クラスだのインスタンスだの用語がでてきてうんざり、、なんてならずに辛抱してください。 やはり、構造化など他にない内容のこともありますので、新しい名前(名称)もどうしても必要です。 特に、クラス、インスタンス、オブジェクト、はいろんなところでごちゃまぜに使われますので、とにかくこのサイトに限らず、いろいろ読んでニュアンスをつかむしか正直ありません。

ちょっと余談ですが、よく現実世界のものと同じように考えることは概要説明としての「例としては」非常に良いですが、実際無理です。 というか、発想としてはそれでは足らないのです。 このサイトでも身の回りのいろんな物を例えとして挙げます。オブジェクトのイメージをつかむのに非常に役に立つからです。 しかし、実際にクラス設計をするとなるとやはり実世界の物だけのイメージ力ではソフトウェアとしてうまく設計できません。 ですので、「現実世界のものっぽさ+ソフトウェアの要素」と何となく思っておいた方がきっと気が楽になるはず(?)です。 余談終わり・・・。

オブジェクト指向は、オブジェクト思考でもあります。 初めはピンとこないかもしれませんが、発想のアプローチが今までとは異なりますので、処理を主体(処理の流れを上から下まで考えるような)の発想は一旦忘れて 処理をブツ切りにして、意味をもつ「もの(オブジェクト)」の集合で考える。というのが乱暴ですが、オブジェクト指向的思考です。

パソコン自体も、マザーボードに始まり、HDD、CD/DVD、キーボード、マウスなどなどいろんな部品で構成されています。 マザーボード1つをとっても、その上にCPU、メモリ、インターフェースコネクタなどいろんな部品で構成されています。 電気で動くパソコンですが、コンセントから流れてきた電気がどうながれて行って動作するなどという考え方はしないですよね。
オブジェクト指向も極論このような構成をするもので、処理の流れでなく、クラスという単位の部品を構成していくことでシステムを構築していきます。

クラスとインスタンスの違いをしっかりとイメージとして描けるかが第一としてとても大切です。