プログラミングを始めたら「オブジェクト指向」という言葉に出会って、わけがわからなくなりました。オブジェクト指向ってどうすれば理解できるようになるのでしょうか?
オブジェクト指向がわかりにくいのには理由があるんです。オブジェクト指向が何かを知ろうとするあまり、なぜオブジェクト指向が生まれたのかを理解できていないからです。
今回はざっくりとオブジェクト指向がなぜ生まれたのかを理解できる内容になっています。
こんな方にお勧めの内容です!
- オブジェクト指向を学習したけど、何のためにあるのかわからない
- オブジェクト指向が何なのかわからない
- オブジェクト指向が生まれた理由を知りたい
今回はオブジェクト指向の詳しい内容に入る前に、プログラミング言語の進化の歴史を見ていきます。「足りない何か」を補うためにオブジェクト指向は生まれたからです。
オブジェクト指向が生まれた理由
オブジェクト指向は「再利用性」を高めるために生まれました。
再利用性とは何なのか、なぜ再利用性が必要とされるようになったのかを理解することで、オブジェクト指向の理解がグッとしやすくなります。
詳しく見ていきましょう!
プログラミング言語の進化3ステップ
プログラミング言語は次の3ステップで進化してきました。
- 人間が理解しやすくする
- 人間が使いやすくする
- アプリの需要増加に応える
この進化の中にオブジェクト指向誕生の理由があります。
人間が理解しやすくする
機械語
機械語とは0と1の二進法で表される言語です。人間が見ると何をしているのかさっぱりわかりません。
0111011 1000100
プログラミングができた当時は一部の天才だけが理解できる言語だったのです。
多くの人がプログラミングを扱えるようにしたいという思いからプログラミング言語は「人間が理解しやすい」を目指して進化していきます。
アセンブリ言語
アセンブリ言語は「どんな命令をしているかをぱっと見わかるようにしたもの」です。
ADD XX YY MOV AA WW
上の例を見ると、少なくとの何かを足している、何かを移動させていることがわかります。
しかし、まだまだ人間が理解するにはわかりにくいです。
高級言語
さらなる進化として高級言語ができます。数式で直感的に理解できるものです。
z = x + y
高級言語の発明により、プログラミングは飛躍的に広まることとなります。飛躍的な広まりにより、新たな問題点がでてきます。
プログラミングの需要に対して供給が追いつかなくなってきました。
この問題を解決するために、プログラミングはもっとわかりやすいシンプルな構造にすべきという「構造化プログラミング」が生まれました。
人間が理解できるだけではなく、シンプルなルールにすることで誰でもプログラミングが書けるようにして、需要の増加に応えられるようにしたのです。
人間が使いやすくする
構造化言語
わかりやすい構造とするために、次の2つが提案されました。
- GOTO文を廃止すること
- ロジックのルールを3つに絞ること
GOTO文の廃止
GOTO文ってあまりなじみないですよね。
GOTO文とは「ラベルを貼ったロジックに移動できる仕組み」です。
GOTO文を使うと、あらゆるロジックにジャンプできるため、ロジックの流れが非常に追いにくくなります。
わかりにくい構造の元凶になっていたGOTO文を廃止することで、わかりやすい構造を目指しました。
なぜGOTO文を使っていたのか。複雑になるのになぜGOTO文なんて使っていたのかと思いますよね。
当時はCPUやメモリが今とは比べ物にならないくらい性能が低かったため、1ステップでも短くロジックを書いた方が良いとされていました。
速度を追求し無駄を省くために、GOTO文が用いられていました。
ロジックのルールを3つに絞る
- 順次進行
- 条件分岐
- 繰り返し
我々からすると当たり前じゃん!と思ってしまいますよね。
プログラミングは上から下に流れていくし、if文で条件分岐して、for文で繰り返す。
この当たり前とも思われるルールができたのも構造化プログラミングのタイミングなのです。
アプリの需要増加に応える
構造化言語に加えて保守性も注目される
プログラミング構造のわかりやすさだけではなく、保守性も注目され始めます。
アプリケーションの開発が増加して規模も大きくなるにつれてバグが発生しにくい仕様が必要になってきました。
具体的には、メソッドの独立性を高めることです。メソッドの独立性を高めるとはどういうことでしょうか。
どこからでも利用できるグローバル変数を極力減らして、他に依存しないようにすることです。
グローバル変数を扱うメソッドが増えれば増えるほど、グローバル変数を変更した時の影響範囲は大きくなります。
メソッド同士がグローバル変数でガッチリ結びついていると、身動きがとれなくなってしまうのです。
メソッドの独立性を高める方法は2つあります。
- ローカル変数
- 引数の値渡し
ローカル変数
ローカル変数はメソッドの中だけ利用できる変数です。他のメソッドでは利用できないため、メソッドの独立性を高めています。
引数の値渡し
引数の値渡しというと難しく感じますが、要するに引数の値がコピーされたものか、
元の値をそのまま使っているかの違いです。
値渡しは引数の値をコピーして利用するため、参照先の変数を書き換えずに済みます。
書き換えてしまうと、他で値を利用しているメソッドに影響が出てしまう恐れがあります。
そのため、引数の値渡しをすることで、メソッドの独立性を高めているのです。
ここまでのまとめ
ここまでの流れをまとめておきましょう!プログラミング言語は次の3段階で進化してきました。
- 人間が理解しやすくする:機械語→アセンブリ言語→高級化言語
- 人間が使いやすくする:構造化言語
- アプリの需要増加に応える:保守性を高める→メソッドの独立性
アプリの大規模化に応える
保守性が高まれば大規模化するアプリケーションに対応できるのか?答えはNOでした。
保守性と同時に、同じロジックを使い回す「再利用性」が求められました。
ここで登場するのがオブジェクト指向型のプログラミング言語です。ようやく登場してきましたね。
人間が理解できるようになって、使いやすいプログラミング言語になるとアプリの需要が増えて保守性を高めるようになる。
するとアプリはますます大規模化して再利用するニーズが高まりました。
プログラミング言語の変遷を知って初めて、オブジェクト指向が生まれた意味がわかりました。再利用性を高める「オブジェクト指向」とは何なのか、早く知りたいです。
興味を持ってもらえて嬉しいです。オブジェクト指向型のプログラミング言語とは再利用性を高めるために生まれたものだ!という意識があるとオブジェクト指向の特徴が理解しやすいです。
今回参考にさせていただいたのは「オブジェクト指向でなぜつくるのか」
オブジェクト指向が生まれた歴史から、一般的に利用されるオブジェクト指向のたとえ話がわかりにくさを招いていると指摘していて、本質から理解できる内容となっています。オブジェクト指向をもっと詳しく学びたい方はぜひ!
次回、オブジェクト指向の特徴であるクラス、継承、ポリモーフィズムを見ていきます!
コメント