※本記事はプログラミング言語に関係なく「オブジェクト指向」を解説する記事です。
Contents
なぜ、オブジェクト指向が理解しにくいか?
私は業務で使った最初の言語はオブジェクト指向言語であるJavaでした。最初からオブジェクト指向言語で育ったので、「オブジェクト指向で作らないと何がまずいのか」「オブジェクト指向で作るメリット」つまり、「なぜ?オブジェクト指向で作るのか?」を理解できていませんでした。
オブジェクト指向は「属性と振る舞いをまとめた部品(クラス)を作り、部品を組み合わせてプログラムを作成していくスタイルである」というぐらいが、初学者の認識ではないでしょうか。
それはそうなのですが、あまりにもピンポイントすぎて「それは分かったんだけど、だからなに?」という状態になっている人が多いと思います。
しかし、「オブジェクト指向が生れた背景」を理解することで、「ああ、オブジェクト指向ってそんなメリットがあったのね、じゃあオブジェクト指向で作った方がいいね」とぼんやりとですが納得することができたのです。
オブジェクト指向以前、誕生の背景とは?
プログラミング言語の歴史
年代 | 時代 | 代表言語 | 説明 |
1940年代 | 機械語(マシン語)の時代 | 機械語 | ・CPUが直接解釈可能な形式でプログラムを書いていた。 ・2進数/16進数のみで記述。 |
1940~1980年代 | 低水準言語の時代 | アセンブリ言語 | ・機械語の命令に1対1で対応した、人間に理解しやすい文字列や記号で記述される。 ・MOV/ADDなどの簡易なキーワードが使えるようになった。 |
1950~1960年代 | 高級言語の時代 | Fortran COBOL | ・アセンブリ言語をより人間が理解しやすい形で書けるようになった。 |
1970年代~ | 構造化言語の時代 | C言語 ALGOL Pascal | ・基本3構造が固まった。if文、for/while文を使ったプログラミングが主流になり、GOTO文が廃止された。 ・ローカル変数、メソッドへの引数を渡すことが可能になった。 |
2000年代~ | オブジェクト指向の時代 | Java C++ C# | ・グローバル変数を排除し、プログラムをより再利用しやすくする仕組み(クラス)が導入された。 |
機械語(マシン語)の時代
低水準言語の時代
CPUが直接解釈可能な命令を、16進数ではなく人間でも理解可能な文字に置き換えただけの言語が低水準言語であり、代表例がアセンブリ言語です。
アセンブリ言語で書いたプログラムは、アセンブラというプログラムでコンパイルすることで、機械語に変換される。
オブジェクト指向のメリットは?
オブジェクト指向がもたらした大きなメリットは2つあります。
1つ目はグローバル変数の排除です。
変数と変数を使用する処理を、クラスの中のフィールドとメソッドという形でクラスの中に閉じ込めることができるため、どこからでもアクセスできたグローバル変数に対して、意図した場所からアクセスできないよう制御できるようになりました。
これを実現することを、オブジェクト指向3大要素の1つであるカプセル化と言われています。
2つ目はプログラムの再利用性の向上です。
プログラマーであれば、同じような処理を何度も書くのは非効率的だと考えるでしょう。
構造化言語の時代は、同じような処理をまとめるには、サブルーチンと呼ばれる、まさに同じ処理をまとめるだけの仕組みしかありませんでした。
オブジェクト指向言語では、共通処理を1つのクラスにとまとめ、共通処理以外を定義したクラスを作成する仕組み(継承)が導入されました。
また、共通処理の呼び出し元では、共通処理以外を定義したクラスを知らなくても、プログラム作成を進めることができる仕組み(ポリモーフィズム)も導入されたことで、構造化言語の時代より飛躍的に再利用性が高まったのです。