オブジェクト指向でなぜつくるのか
こんにちは!鳥貴士です!
今回はここ数日を割いて「オブジェクト指向でなぜつくるのか」を読了したので書評を書きたいと思います!
この本を大雑把に表すと
平易な実例を通してオブジェクト指向の正確な理解を目指し、その仕組みと応用例、そして次に来るといわれている関数型言語に触れる本
ですね。
もともと自分は一人で趣味のプログラマとしてのびのび適当にやっていたものですから、書籍などでオブジェクト指向の話が出てきても
なんでこんなよくわからんシステムを使わなきゃならんのか、今までの構造型プログラミングで十分だなどと思っておりました。
しかしインターンでRubyとRuby on Railsをチーム開発で使うにつれて、オブジェクト指向が何なのか。
そしてこれをどう扱うのかまでは大雑把に感覚で理解できるようになっていました。
この本はそのレベルの読者、つまりオブジェクト指向の使い方はなんとなくわかってきたけどなんでこんなもん使うのかよくわからんという
駆け出しエンジニアにおすすめで、オブジェクト指向のしくみについて理解が深まり、オブジェクト指向でなぜ作るのかがよくわかるようになります。
この本を読み切ってからタイトルを見てみたら、なるほどうまいタイトルを付けたもんだなあと感心しましたね笑
オブジェクト指向の用語まとめ
オブジェクト指向がわかりにくいのは
大量の新しい技術用語・概念、比喩の乱用、不正確な情報の蔓延
にある
よくわからない言葉は訳、語源・由来、類義語を見ると理解しやすくなる
クラス
分類,種類,集合論でいう集合。単なるインスタンスを製造するためのしくみという方が正確な理解に近い。
クラスは関数と変数を1つのまとめる仕組みのことを指す
インスタンス
実体,実例。集合論でいう要素。クラスから生み出された個々のオブジェクト(トートロジーっぽい)
従来の開発スタイルでは、サブルーチンの間で共通の値を参照する際にはグローバル変数を使うことでしか実現できなかったが、この方法ではグローバル変数がすべての関数からアクセスされる可能性があるため修正や管理のコストが大きかった
オブジェクト指向は何を可能にしたか
オブジェクト指向は、従来のどこからでも参照&書き換えが行われるグローバル変数を用いた仕組みでデバッグや保守のしにくい状況から解放され、影響範囲がクラスの中だけで、デバッグや保守のしやすい状況に変化し、類似の関数をコピペして修正したり、デバッグするためにすべてのコードに目を通したりする必要がなくなった。グローバル変数はGOTO文同様オブジェクト指向が使えるなら使わないほうが良い。
メソッド
クラスの中に定義された関数のこと
ちなみに構造化プログラミングにおいて、関数=サブルーチン+メインルーチンである
継承
機能の似ているクラスに共通するメソッドを別のクラスがインポートする仕組み。
インポートされる側を親クラス、インポートする側を子クラスという
親クラスはスーパークラス、子クラスはサブクラスとも呼ばれ、集合論でいうスーパーセット、サブセットの概念に対応する
ポリモーフィズム
poly-morph-ism(polyは多くの(many),morpheは形態(form),ismはシステムや概念 )。似たような機能を果たす子クラス(継承した側)のメソッドの呼び出し方を共通化する仕組みで、より具体的には、親クラスのインスタンスを引数に取るメソッドを定義して、子クラスのインスタンスを引数に与えることでメソッドの呼び出し方の共通化を実現している。これによって、呼び出される側のコードに変更を加えても、呼び出す側に影響を及ぼさなくなり、コードの修正がより容易になる。
クラスを使うことのメリット
- サブルーチンと変数をまとめることで記述量を減らしてメソッド名を管理しやすくし
- クラスの外部から使われない変数や、サブルーチンを隠すことでグローバル変数を不要にしてサブルーチン間の独立性を高め
- 変数の型からたくさん変数を定義できるみたいに、1つのクラスからインスタンスをたくさん作れることで同じ種類の情報をたくさん扱う場合でも、シンプルなロジックで書ける
ことにある
インスタンス変数
各インスタンスの内部であればどこからでもアクセス可能な変数のことで、インスタンス内のメソッドの間でそのデータを共有することができ、これによりグローバル変数とローカル変数ののメリットのみを受け継ぎ、グローバル変数をお役御免にした。
パッケージ
クラスを階層構造の形態でまとめることで管理や再利用をしやすくする、ディレクトリのような仕組み
例外
従来型のたくさんのエラーコード判定ロジックといった、冗長で複雑な処理を用いてエラーを制御するのではなく、例外オブジェクトを返すことで1か所でエラー処理をできるようにする仕組み
ガベージコレクション
不要になったインスタンスを自動で削除することで、メモリへの不適切なアクセスやメモリリークを防止する機能
まとめ
この本は、上記の他にもクラスとインスタンスのメモリアロケーション、ガベージコレクションの大雑把な仕組み、デザインパターンやUMLや関数型言語の概観なども書かれております。
これらのほとんどはオブジェクト指向から派生した技術ととらえることができることから、この本で取り上げられています。
しかしオブジェクト指向プログラミング以外についての記述はわりとあっさりしているので、これらについて深く理解したい方は別の本を買って勉強するとよいと思います。
この本は、先述の通り、オブジェクト指向の使い方はなんとなくわかってきたけどなんでこんなもん使うのかよくわからんという駆け出しエンジニアには一押しの本ですので、ぜひ読んでみてください!
それではまた!