aoiro’s blog

勉強を兼ねて記事を書きます

「オブジェクト指向でなぜつくるのか 第二版」を読んだ

あまりいないと思うが、Objective-Cからプログラムに入り、今までC++Pythonなどの言語を使ってきた。オブジェクト指向の言語ばかり使ってきたせいか、オブジェクト指向について人に説明しようと思ってもうまく説明できない。加えて、そもそも自分の書いているプログラムは単にクラスを使っているだけのなんちゃってオブジェクト指向なんじゃないかという不安もあったので、オブジェクト指向以前のプログラムとの対比を含めて理解しようと思い立って読んだ。

感想

感想としては、オブジェクト指向プログラムの設計の指針となるような話題はあまりなく、これを読んでオブジェクト指向プログラミングの技術が上がるとかそういうことはないと思う。とはいえ、オブジェクト指向に至るまでの道筋について知れたのは良かったと思う。オブジェクト指向の背景を知ることで、他の言語(例えば関数型言語)と何が違うかを考えることができる下地ができるのではないかと思う。 また、個人的にはUMLなどの汎用の整理術やアジャイル開発に関しては触れたことがないので、そのあたりの手法を知る手がかりになったことと、それらの手法とオブジェクト指向との関わりを知れたのが良かった。

関数型言語について、怪しい黒魔術みたいなものだと思っていたのだが、オブジェクト指向言語とのつながりを知って親しみを感じる事ができた。そろそろ勉強してみたい。


覚書

その他思ったこと

他の人の感想を読むと結構辛辣なことが書いてあるのだが、あまり納得することができなかった(本の内容が正しいと思ったという意味ではない)ので書いておく。

d.hatena.ne.jp

プログラミングの歴史、理論、論文については正直全く知らないので、個人的に思ったことです。


たとえばC でも 翻訳単位をモジュールと見立てて、関数(サブルーチン)と変数を まとめたり、変数や関数の名前のスコープを限定したりすることは当たり前に出来て、「まとめて、かくす」は 普通にやっています。

クラスでは、変数と関数がクラスに属しているわけで、外部から呼び出すときもクラス名を書く必要がある。対して、C言語のexternで宣言されたグローバル変数や関数はその変数がどのモジュールに属しているかは、定義されているファイルを探して来ないといけない。 そういう意味で、Cのexternとオブジェクト指向の「まとめて、かくす」仕組みは違うんじゃないの?と思った。どちらかというとC++名前空間のほうがしっくり来る。

「まとめて、かくす」って言ってるけど、オブジェクト指向がそれまでの言語と違うのは「まとめる」方であって、「かくす」ことではないんじゃないかと個人的に思った。プログラム中で一つの単位として変数や関数のまとまりを扱えるということが重要なのだと思った。 実際Pythonとかだとprivateなインスタンスメソッドとか変数とかないし。カプセル化するときのカプセルが、透明で中が見えるものだろうが中の見えないものだろうが、どちらもカプセル化であって、オブジェクト指向にとって隠せる隠せないはどうでもいいんじゃないかと思った。


GOTO文があるからプログラムが解りにくいんじゃないです。だからGOTO文を排除しただけで(3大制御構造のみで記述しただけで)プログラムがわかりやすくなるんじゃないです。 GOTO文を廃止し、三大制御構造だけで制御フローを記述するのはなぜかというと、それはアルゴリズムを切り出して部品化を行う為です。

うーん、部品化を行うというのは、結局の所それがソフトウェアの抽象化に繋がり、人間にとってわかりやすいからではないのかな。 本には

プログラムを解りづらくしている元凶であるGOTO文を廃止

と書いてあるけれども、何が違うのかよくわからない。GOTO文が部品化を妨げるからプログラムを分かりづらくしている元凶であるというのは間違ってないんじゃないかと思った。

本の内容が正確ではないというのは、確かにそのとおりなのだろうとは思ったがもやもやする。