経緯
現時点で僕は一年ちょいWeb系の開発を経験していて、オブジェクト指向言語しか使ったことがない。
でもこの本のタイトルである「オブジェクト指向でなぜつくるのか」がわかってなかった。
使ってる言語がRubyとかたまたまオブジェクト指向だったから、オブジェクト指向で書いてました。みたいな感じだったので、それはあんまよろしくないなと思い、この本で理解してみた。
で、ある程度理解したはずなので、本の内容を元にアウトプットすることにした。
「オブジェクト指向でなぜつくるのか」の結論
ソフトウェア開発を楽にするためにオブジェクト指向でつくる
そりゃ誰でもなんとなく、オブジェクト指向が便利だから広く使われてるということくらいわかる。
結局わからないのは
何と比較して楽なのか?どう楽なのか?
オブジェクト指向は何と比較して開発が楽なのか?
僕のようにエンジニアとして経験の浅い人が、この本のタイトルとして問われている「オブジェクト指向でなぜつくるのか」に答えられないのは、
ほとんど、この比較対象がよく分かってないからだと思う。
その比較対象は
オブジェクト指向が普及する前に使われていたプログラミング言語たち(現在使われているものもある)
オブジェクト指向は必然性を持って誕生した
OOP(オブジェクト指向プログラミング)はぽっとでてきたわけではなく、既存のプログラミング言語の抱える課題(主に構造化言語の課題)を解決するために生まれた。
下記、OOP以前のプログラミング言語たちの簡単な紹介
プログラミング言語の歴史
1.機械語: コンピュータは0か1の二進数しか解釈できないというやつ、十六進数でもかけるらしい
最初は人間はこれを書いていた。
A10010
8B160210
2.アセンブリ言語: 機械語よりは人間にわかりやすい表現を使えるようになった
MOVは移動、ADDは追加、とかなんとなくプログラムが何やるかわかる感じ。
MOV AX, X
ADD DX, Y
3.高級言語: アセンブリ言語より人間に親しみやすい形で記述できるようになった
ちなみにFORTRANについで登場したCOBOLもこの高級言語で1960年誕生らしい。
# 言語はFORTRAN。お、なんか普通に僕たちが使ってる言語に近い!
Z=X+Y
高級言語により、プログラミングの生産性はめっちゃ上がったが、それ以上にソフトウェアに対する需要の方が爆上がり中だった。
「20世紀末には世界の総人口がプログラマになっても、増大するソフトウエアの需要に追いつかない状態になる」 という、いわゆる「ソフトウエア危機」だった。
4.構造化言語: このソフトウエア危機に対応するために、よりわかりやすく、より保守性が高くなった
具体的な言語としてはALGOL、Pascal、C言語。
ソフトウエア危機に加え、この頃からハードウェアの進歩により機械自体のスペックが上がったため、ソフトウェア開発では従来のできるだけ軽量な実装よりも、わかりやすさや・再利用性の高い実装の重要性が高まった。
そこで構造化言語では高級言語でプログラムをわかりにくくしている元凶のGOTO文を廃止し、
今僕たちが普通に使っているロジックの順次進行、条件分岐、繰り返しといった基本三構造を取り入れた。
また、構造化言語ではサブルーチン(関数、メソッドのような処理の塊)の独立性の強化が図られた。
※サブルーチンは高級言語で既に実装されている。
具体的には各サブルーチンから直接グローバル変数を参照していた状態から、
サブルーチン内でのみ使用が限定されるローカル変数が導入されたことと、引数の受け渡しが可能になったことで、デバックもしやすくなり、サブルーチンの独立性が強化された。
まとめると構造化言語の登場で実現できたことは
- GOTO文濫用によるスパゲッティコードの回避
- サブルーチンの独立性向上
ただ、構造化言語で解決できてなかった課題が大きく2つあった。
-
グローバル変数依存
ローカル変数が導入、引数の受け渡しが可能になり、グローバル変数の使用は軽減されたが、
サブルーチン外の変数は全てグローバル変数を使わざるを得なかった。 -
貧弱な再利用性
サブルーチンの再利用が可能になったものの、増大する一つのアプリケーションの規模全体に比べると微々たるものだった。
また共通部品として再利用できるのはサブルーチンのみだった。
ついにOOP登場!
この課題を解決するためにOOPが誕生する。
OOPには主に下記の3つの仕組みが備わっている。
- クラス
- ポリモーフィズム
- 継承
そしてこれらの仕組みにより、構造化言語の課題を解決し、下記が実現された。
- OOPでは基本的にグローバル変数を使わずに済む
- OOPでは共通サブルーチン以外の再利用ができる
OOPの3つの仕組みがどのように構造化言語の課題を解決したか(どう楽なのか?)
※それぞれが何かはコードで詳しく説明はしません。
クラス
クラスには大きく3つの機能がある
-
変数とサブルーチンをまとめる
グローバル変数依存と貧弱な再利用性の解消に貢献する機能。
→結びつきの強い(複数の)サブルーチンと(複数の)グローバル変数を1つのクラスに「まとめる」ことができる。
これにより部品の数が減る、メソッド(サブルーチン)の名前づけが楽になる、メソッド(サブルーチン)が探しやすくなるといったメリットが生まれる。 -
変数とサブルーチンを隠す
グローバル変数依存の解消に貢献する機能。
→クラスに定義した変数とメソッド(サブルーチン)を、他のクラスから「隠す」ことができる。
プログラムの保守性悪化の元凶となるグローバル変数を使わずに、
代わりにインスタンス変数を使ってプログラムを書くことが可能になる。 -
クラスからインスタンスをたくさん作る
貧弱な再利用性の解消に貢献する機能。
→1つのクラス定義を再利用してインスタンスを生成できる。
いったんクラスとして定義すると、実行時にそこからいくつでもインスタンスを作ることができる。
これにより、同種の情報を複数同時に扱う処理であっても、そのクラス内部のロジックをシンプルにできる。
ポリモーフィズム
貧弱な再利用性の解消に貢献する仕組み。
→サブルーチンを呼び出す側のロジックを再利用できるようになった
サブルーチンを呼び出す側のロジックを一本化し、「共通メインルーチン」を作る仕組み。
呼び出される側(サブルーチン)が増えても、呼び出す側(インスタンス、クラス等)を修正する必要がない。
継承
これも貧弱な再利用性の解消に貢献する仕組み。
→クラスの共通部分を再利用できるようになった
複数のクラスの共通部分を別の基底クラス(スーパークラス)に切り出し、まとめることで、重複を排除し、複数のクラスから再利用を可能にした。
スーパークラスに定義されているインスタンス変数、メソッドを、継承したサブクラスから利用できる。
まとめ
こういう感じで、OOPが構造化プログラミングの抱える問題を解決できる仕組みを持った技術であるため、
僕たちはオブジェクト指向でつくっているのでした!!!オブジェクト指向って便利🎉
全然まとめになっていない。笑
本についての感想
「オブジェクト指向でなぜつくるのか」は全体的に非常にわかりやすくまとまっており、
プログラミング未経験の人とか、僕のように駆け出しの人でオブジェクト指向でなんとなくプログラミングしているという人は、
エンジニアとしてこの辺のことは学んでおくといいのではと思った。
実際に僕はこの本を読んだ後、Rubyを書いていて、インスタンス変数に対して初めてありがたみを感じました。笑
確かにクラスとかインスタンス変数なかったら、バグったとき「このグローバル変数どこで定義されてるんだ?」って探すの大変だろうなと。
歴史を知って、ありがたみを感じつつプログラミングをするのも楽しめていいのではとも思いました。
また、僕が本を読み始める前に思った、オブジェクト指向でなぜプログラミングするのかという疑問はここに書いた内容で理解できました。
僕がまとめたのはプログラミングする部分におけるオブジェクト指向内容(本だと半分ぐらいの内容)で、その他の部分も勉強になりました。
その他の部分とは、主に上流工程でもオブジェクト指向の考え方は便利だよって話。
特に個人的には4月これからPMをやることになったので、UMLについても具体的な使い方など、ある程度理解できたのでは期待していなかったメリットだった。
OOP使って仕事してる人はまじで一回は読んだ方がいいと思う!
以上!
Kindleで1000円ちょい、やすい!!!