「オブジェクト指向は難しい」と色々な人がぼやくが私すんなり理解したと思っていたので
自分の理解が甘いのかプログラミングの変遷を直接体験してないから素直に受け入れられたのか…
いずれにせよはっきりさせるために改めてオブジェクト指向プログラミング(OOPk)とその恩恵をプログラミングの歴史を踏まえ調べまとめた。
なぜオブジェクト指向プログラミングが必要なのか?
ソフトウェア危機
2000年にはソフトウェア開発需要にプログラマの供給が足りなくなるという話し。
その為により保守性の高いプログラミングができるようにしなければならなかった。
しかしそれまでは書いたコードをいつまでも使いまわすなど考えていなかったため
保守性という観点が少なかった。
それまでは
- 生産性 :簡単な表現
- 品質 :複雑さを避ける
という観点からプログラム・言語そのものの開発が行われていた。
その認識にメスをいれるため新たに下記の指針が生まれた。
- 保守性 :分かりやすいプログラム
- 再利用性:重複ロジック削除、部品化による再利用促進
この時点で貧弱な再利用性、保守性(後述の「グローバル変数問題」)が課題となっており
これを解決するため、オブジェクト指向という考え方が生まれた。
貧弱な再利用性
OOP以前はプログラムの再利用と言えばサブルーチン(関数)の共通化があった。
しかし一つの共通サブルーチンを変更するとその影響範囲が大きく迂闊に手出しできなかった。
新たな共通化手法が必要 => ポリモーフィズム
保守性 (=グローバル変数問題)
グローバル変数はプログラム内ならどこからでも呼び出せるため、影響範囲が広く一度修正するとその波紋がどこまで及ぶか想定することが難しかった。
ローカル変数では影響範囲は狭いものの関数が終わったら破棄されるという短命さ故、
複数のメソッドで共通する変数はグローバル変数を使わざるを得ないという問題があり保守性を大きく下げていた。
変数のスコープを限定する手法が必要 => 「クラス」という単位
OOPの三大要素
1. クラス
仕組み:「まとめて、隠して、たくさん作る」
恩恵:
・後述のポリモーフィズム、継承によりコード量を減らせる。
・「インスタンス変数」「グローバル変数の長命さ」「ローカル変数の影響範囲の狭さ」を手に入れた。
これによってグローバル変数問題を解決。
-
「まとめて」命名が短くなる。
サブルーチンと変数をまとめる
openFile, closeFile, readFileをFileクラスにまとめることでopen, close, readとできる。 -
「隠して」変数の変更影響範囲を制限できる。(『グローバル変数問題』の解決)
クラス内部だけで使う変数(グローバル変数)やサブルーチンをかくす。
アクセサ修飾子を用いることで影響範囲をコントロールできる。 -
「たくさん作る」
1つのクラスからインスタンスをたくさん作る。
インスタンスとは
実体を表現する方法ではなく、クラスで定義したインスタンス変数のメモリを確保する方法。()
これによりいくつでもメモリ領域を確保できる。
OOPで良く見る下記表現は複製したインスタンスのうち、どれを使うか指定するための書き方。
//TextFileReaderクラスから二つのインスタンス生成
TextFileReader reader1 = new TextFileReader();
TextFileReader reader2 = new TextFileReader();
//一つ目のインスタンスを指定し、メソッドを実行している。
reader1.open("C:\\aaa.txt");
ローカル変数、グローバル変数、インスタンス変数
原初の変数はグローバル変数である。
・プログラムどこからも呼び出せる
・アプリ開始~終了までいる(メモリを確保)
・複製できない。
OOP以前にグローバル変数問題を解決するため現れたのがローカル変数である。
・1つのサブルーチンからしかアクセスできない。
・サブルーチン呼び出し時に作られ、終了時に破棄。
・複製できない。
OOPのクラスの「たくさん作る」能力を使うために作られたのがインスタンス変数
ローカル変数と混同していたが、クラス直下の変数をインスタンス変数と言う。
・アクセス範囲は自由に指定できる。
・ンスタンスが作られてから不要になるまで。
・複製可能。このために存在する。
2. ポリモーフィズム
仕組み:「共通メインルーチン」を作ることで、サブルーチンを呼び出す側のロジックを一本化する。
恩恵:
・コンストラクタで引数を設定することで、処理のみの記述にできる。
「猫が鳴く」ではなく「鳴く」という処理にできる。引数に「猫」や「犬」を入れる。
これによって貧弱な再利用性問題を解決。
3. 継承
仕組み:クラス定義の共通部分を別クラスにまとめ、重複を排除する。
恩恵:
以前は共通サブルーチンという形で命令群をまとめていた。
まとめ
なんとなくで話していたポリモーフィズムの意味を理解できた。
歴史的経緯を知ると当たり前のようにやっていることにありがたみが湧いてくる。
多分、これからプログラミングをする人はOOPでつまずくことはないと思った。