パーフェクトPHPで学習を進めているのですが、5章のクラスとオブジェクトからどうも進捗が芳しくない。
サンプルコードを読んでも理解できないことが多くなった気がします。
PHPの文法の知識がないのもありますが、オブジェクト指向の理解ができておらず、クラス、インスタンス、オブジェクトと言った用語に翻弄されている気がしたため、オブジェクト指向を学ぶことにしようと思いました。
そこで学習書籍に選んだのがこちら
オブジェクト指向でなぜつくるのか
軽く手にとってみたところ、ネットでよく見かける説明とは異なる説明の仕方がされていたため選択。
3日程度で読んでみて、学んだことをまとめていこうと思います。
今日の記事では時間の都合もあり、かけるところまで書いて次回に続きます。
1 歴史から理解するオブジェクト指向
本書は「なぜ」と「なに」に注目した解説書でした。
私がこれまで触れてきたオブジェクト指向についての教材は、Railsアプリを作成するための動画教材中で「インスタンス変数」とかを使う際にちょっと説明で出てくるもの程度でしたから、「how」に重きが置かれていました。なので、「インスタンス変数はクラス内で『@変数名 = new.Class(引数)』とすれば生成できる」ということは知っていますが、インスタンス変数が何かはあまりわかりません。
オブジェクト指向では変数も関数も全てオブジェクト = モノとして扱える、と聞いたことはありますがどういう意味かはあまりわかりませんでした。
本書では、歴史的な経緯から何を求めてオブジェクト指向が開発されたのかを説明してくれます。
つまり、オブジェクト指向で実現したい目標を理解した上で、コードを見ることができるようになるのです。
※ただし、私は実際のコードを見た経験が少ないせいもあり、本書を読んでもポリモーフィズムが具体的にどう実装されるのか、実際のコードのイメージがあまり沸いていません。PHPでいうabstractクラスのことでしょうか。
1.1 オブジェクト指向以前のプログラミング言語の課題
プログラミング言語は最初「プログラミング難易度の易化 = 生産性の向上」のために開発されました。
当時はハードが貧弱だったためプログラムは短命で、改修のたび一から作り直していたようで、簡単に作れるようになることが求められました。また初期の言語は非常に難しく、平易に表現できることが求められました。
しかしながら、ハードが進化しプログラムの寿命が延びると、プログラムをメンテナンスして使い続けるようになります。すると、言語には「保守性」が求められるようになりました。
その流れを確認して、オブジェクト指向が解決したい課題について確認します。
1.1.1 機械語
最初のコンピュータは全て2進法の機械語で命令していました。非常に可読性が低く、専門的な知識が必要で難しい作業です。
今でもコンピュータは機械語しか読めないので、どんなコードもコンパイルされて最後は機械語になるわけですが、当時はコンパイルが存在しません。
この難易度の高さがこの時代の課題です。
1.1.2 アセンブリ言語
アセンブリというのが最初のプログラミング言語だそうです。
機械語から、多少人間が読める記号に置き換えて記述できる言語に進化しました。同時にアセンブラというプログラムに読ませて機械語に翻訳する「コンパイル」という技術が生まれました。
1.1.3 高級言語 FORTRANやCOBOL
アセンブリ言語はあくまでコンピュータが理解できる命令である機械語を、そのまま人間のわかる記号に置き換えただけです。
高級言語ではさらにその命令を命令のままではなく、人間が読みやすい形にまとめました。
例えば、アセンブリ以前では、Xというデータを送れ、Yというデータを送れ、XとYを合計しろ、合計値Zを送れ、と命令ごとに1行ずつ記載していました。高級言語ではこれを「X + Y = Z」と書くことができわかりやすいです。
このように高級言語までの進化では、そもそも「プログラムを平易にする」ものでした。
1.1.4 構造化言語 C系列
ここで初めて「構造をわかりやすくする」ことで、より正しく動作し保守性を高めた言語が生まれます。
大きな改良点は①GOTOレスプログラミングと、②サブルーチン(関数)の独立性強化です。
具体的には、GOTO文をやめ、「順次進行、条件分岐、繰り返し」の3構造のみで記述しながら、グローバル変数をできるだけ使わないように、ローカル変数と引数の受け渡しでプログラミングするということです。グローバル変数は全てのサブルーチンからアクセスできるので、一度変更するたび、全てサブルーチンへの影響を調べる必要があるのです。
しかしながら、アプリケーションの規模は巨大化していく一方で、グローバル変数は未だ現存しており、数千のサブルーチンをもつアプリケーションなどにおいては依然として負担となっていましたし、コードの再利用という面でも、サブルーチンまでしか共通部品を作れなかったので、巨大なアプリではまだまだ手書き部分が多く労力がかかっていたのでした。
1.2 次世代言語に求められたもの
もうお分かりだと思いますが、次世代言語とはオブジェクト指向言語のことです。
そして、求められたものとは
(1) 【保守性】グローバル変数対策
→プログラム全体に影響するため、変更するたびに全ロジックの確認が必要
(2) 【再利用性】サブルーチンよりも大規模なコードの再利用
でした。
オブジェクト指向では「クラス」「ポリモーフィング」、「承継」という3つの要素によって実現されています。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
今日はだいぶ遅くなってしまったので、中途半端ではありますがここまでとします。
明日以降で上記の3つの目的をどのように解決したのか確認していきます。