Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
15
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

@weltall9

【書評】オブジェクト指向でなぜつくるのか 第2版

「オブジェクト指向でなぜつくるのか 第2版 」
https://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%81%A7%E3%81%AA%E3%81%9C%E3%81%A4%E3%81%8F%E3%82%8B%E3%81%AE%E3%81%8B-%E7%AC%AC2%E7%89%88-%E5%B9%B3%E6%BE%A4-%E7%AB%A0/dp/4822284654)

概要

オブジェクト指向(OOP)について書かれた入門書です。
入門書といっても実際に仕事や趣味でプログラムを書いている人向けだと思います。

OOPを説明する入門書の特徴として、
・動物がスーパークラスで犬がそのサブクラスでポチがインスタンス
・現実をそのままソフトウェアに表現する手段
といった例え話でとっつきやすさを重視した説明が強調されている本が少なくない中で、本書は
「OOPは現実を全て反映するものではなく、PCに仕事の一部を肩代わりさせる手段の一つ」
「プログラムの仕組みと、現実世界をプログラムに落とし込むための考え方(汎用の整理術)は別物」
といったスタンスで冷静にOOPの説明をしています。

前半は、機械語→アセンブリ言語→高級言語→構造化言語と変遷してきた歴史と、それらで大規模開発を行う限界について触れながら、
OOPによるクラスライブラリやフレームワークといった「再利用部品群」作成機能によって、構造化プログラミングでカバー出来なかった弱点を補った点について書かれています。
その機能の具体的な役割としては、
・変数とサブルーチンをまとめる
・それらをクラス内部だけで使えるように隠す
・1つのクラスからインスタンスを複数作る
であると表現されています。

中盤は、OOPにおけるメモリとインスタンスの仕組みについて1章割かれていて、静的領域、ヒープ領域、スタック領域などわかりやすく説明されていました。
その後、OOPがもたらした部品やアイデアの再利用について書かれており、ここで
・クラスライブラリ
・フレームワーク
・コンポーネント
・デザインパターン
の説明がされていました。
ここまでは割と「プログラム」寄りの解説がなされていましたが、この辺りから業務分析や要件定義といった
「上流工程」とOOPの繋がりを意識した話になってきます。
なぜなら
・クラス化
・ポリフォーフィズム
・継承
といった考え方はプログラム設計には適用出来ても、現実世界にそのまま適用出来ないためです。
そこで現実世界とソフトウェアの世界を上手く繋ぐ手段として、集合論が利用されました(高校数学でやりましたね)。これはクラスとインスタンスの関係が集合と要素であるためです。
また、OOPのクラスと集合論は厳密には異なるけども自然と適用されていった流れについても短いですが書かれています。
次の章では、現実世界の整理を表現する手段、ソフトウェアを2次元で表現する手段としてUMLの概要について説明されています。

終盤は、ハードウェアの能力向上によりアプリケーションの寿命が延び、
保守性と再利用性が重要になったという点を念頭に、ソフトウェア全体の構造定義について説明されています。
そのためには強い凝縮度と弱い結合度により、独立性の高い部品で構成する必要があり、
上流工程での整理術と下流工程でのプログラミング技術という2つの技術が必要だと書かれています。
ここまではOOPについて書かれていましたが、
次の章ではOOPを取り巻く開発環境についてその変遷が書かれています。
ウォーターフォール型開発からはじまり、反復型開発プロセス(代表例としてRUPやXP)が生まれ、
後者の性質を持つ似たような開発手法をアジャイル開発と名付けて推進する、
といった歴史などです。
そして、それらを推進するための実践手法として、
・テスト駆動開発
・リファクタリング
・CI
が整備され、広まったようです。

最後は、OOPの次に来る技術としてアスペクト指向(AOP)やエージェント指向やサービス指向など、バズワード化したものを少し紹介し、近年関心を集めだしている、関数型言語の概要と基本的な説明について紹介していました。

感想

著者は「ソフトウェアは現実世界をそのまま反映するモノではない」と本の中で何度も言っています。
それだけ「現実世界をそのまま反映する」とイメージしている人が多い?のかもしれないですし、感違いに注意しましょうという主張を強く感じました。

途中、メモリーとインスタンスについて解説されている章がありましたが、個人的にとても分かりやすく、少し深く調べるとっかかりとして、とても良いと思いました。

昔「オブジェクト指向は集合論である」という話は先輩から聞いたことがありましたが、
その時はそこまでピンとは来ていませんでした。
しかし、「世界のあらゆるモノ(Object)が集合論によってクラスとインスタンスに整理される対象となり、オブジェクト指向が認識論や哲学にまで発展していった」という本書の説明が分かりやすく、集合論現実世界オブジェクト指向プログラムの仕組みへ落とし込むポイントなんだなと腑に落ちてきました。

一方で、中盤以降のUMLや上流工程に関しては実際にやった事がないとそこまでピンと来ないかもしれません。
終盤の関数型言語の章に関してもそうです。逆に
軽くでもやった後に読むと非常に腑に落ちてくる感じがしました。
なので、一通り仕事として触れてみた人が、改めて振り返り、表面的理解から一歩深い世界へ踏み入るきっかけとして良書だと思います。
かといってレベル的には初心者でも読みやすく、必ずしも上流工程に入ってからでないと理解出来ないという事はないです。バランスの良さを感じました。

また、あくまで、読み物として歴史的変遷や概念を始めて知る上では有効ですが、具体的にプログラミングの事やUMLの書き方などについて書かれているハウツー本ではないです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
15
Help us understand the problem. What are the problem?