その本の「はじめに」には、著者の「伝えたいこと」がギュッと詰め込まれています。この連載では毎日、おすすめ本の「はじめに」と「目次」をご紹介します。今日は平澤 章さんの『 オブジェクト指向でなぜつくるのか 第3版 知っておきたいOOP、設計、アジャイル開発の基礎知識 』です。

【まえがき】

 2000年以降、オブジェクト指向言語を使ったシステム開発が一般的になりました。Java、Python、C#、JavaScript、PHP、Rubyは、どれもオブジェクト指向プログラミングを全面的にサポートしています。フレームワークやデザインパターン、UML、アジャイル開発といった技術や手法も広く利用されるようになりました。オブジェクト指向は目新しい技術でなくなった一方で、実際にソフトウエア開発をするうえで、きちんと理解して使いこなさなければならない技術になりました。

 とはいえ、オブジェクト指向はソフトウエア開発の幅広い領域をカバーしており、個々の技術には深さがあるため、すべてを理解するのは容易ではありません。「モノ中心」というコンセプトとプログラミングの仕組みのギャップで混乱しやすい技術でもあります。

 そこで本書では、オブジェクト指向の全体像とそこに含まれる各種の技術、すなわちプログラミング、フレームワーク、デザインパターン、UML、モデリング、設計、アジャイル開発手法の概要を説明します。個々の技術をどうやって使うか(how)の説明は最小限にとどめる代わりに、それぞれが何者(what)で、なぜ必要なのか(why)を中心に解説します。混乱を避けるために、プログラミング技術と上流工程の整理術は別物と割り切るスタンスを取ります。全体像と目的を把握できれば、個々の技術がより理解しやすくなることでしょう。

 本書の初版は2003年から2004年にかけて執筆しました。当時はJavaや.NETが企業システム開発の主役になりつつある状況で、オブジェクト指向プログラミングだけでなく、UMLモデリングやデザインパターン、アジャイル開発手法などが大きな注目を集めていました。「オブジェクト指向を使えば現実世界をそのままプログラミングできる」「オブジェクト指向は従来とはまったく異なる技術なので、それ以前の手法や技術は捨てなければならない」といった極端な説明がされることもありました。

 そうした説明を聞いて、オブジェクト指向を適切に理解できず混乱する人たちを当時はよく見かけました。そんな人たちに向けて「オブジェクト指向は決して魔法の技術などではなく、極めて実践的な従来の延長線上の技術である」と伝えたいと思ったのが初版の執筆動機でした。

 一方で、最初に出会ったプログラミング言語がオブジェクト指向だった世代の人たちは、オブジェクト指向のコンセプトやプログラミングで混乱することはないだろうと考えていました。ところが、そうした人たちにとっても、この技術は簡単に身につくものではないようです。初めてプログラミングを学んだときにif文、for文、関数までは比較的スムーズに理解できたものの、クラス、インスタンス、コンストラクタ、継承、ポリモーフィズム、例外と一気にたくさんの仕組みが登場するオブジェクト指向プログラミングで苦戦する人たちは今でも少なくないようです。

 そこでこの改訂第3版では、そんなオブジェクト指向ネイティブ世代を対象読者にして、内容を見直すことにしました。初版では、「オブジェクト指向は現実世界をそのままプログラミングする技術である」という解釈を否定することに重点を置きましたが、そのトーンを弱め、オブジェクト指向がなぜ難しいのかをより客観的な視点で説明するようにしました。あわせて、すべての文章を読み返し、2021年の現状を鑑みて加筆と修正を行いました。

 大変喜ばしいことに、最近ではプログラミングに関心を持つ人が増え、IT技術者という職業の人気も以前より高くなってきたようです。一人でも多くの人が要件定義や設計、プログラミング、テストといった知的なソフトウエア開発に楽しんで取り組まれることを願っています。本書がいくらかでもそのお役に立てれば幸いです。

2021年2月 平澤 章

【本書の構成】

 本書は「導入」「プログラミング技術」「応用技術」「ゴール」および「特別解説」の5つに大きく分かれています(p.10~11の「本書で解説する主なキーワード」参照)。

【導入(1、2、7章)】

 第1、2、7章は導入です。

 第1章は全体の導入で、オブジェクト指向がソフトウエア開発の総合技術であるという全体像を示すとともに、この技術が難しいと思われてしまう理由について改めて考察します。

 第2章は前半部の導入です。ここでは第3章以降で説明するプログラミング技術を混乱せずに理解するため、オブジェクト指向言語の仕組みと現実世界が「似て非なるもの」であることを示します。

 第7章は後半部の導入です。ここではオブジェクト指向には「プログラミング技術」と「汎用の整理術」の2つの顔があり、それぞれを別物として分けて考えることで、全体像が把握しやすくなることを述べます。

【プログラミング技術(3~6章)】

 第3章から第6章までは、オブジェクト指向の中核であるプログラミング技術を説明します。

 第3章では、機械語から構造化言語までのプログラミング言語の進化の歴史を振り返ります。これによりオブジェクト指向がプログラミング言語の発展の歴史の中で必然性を持って登場した技術であることを示します。

 前半部の本題であるオブジェクト指向プログラミング(OOP)については、第4章と第5章の2つに分けて説明します。

 第4章では、オブジェクト指向プログラミングのもっとも基本的かつ重要な仕組みであるクラス、ポリモーフィズム、継承を紹介し、これらの仕組みがソフトウエアの保守性や再利用性を向上させる有効な技術であることを説明します。あわせて、多くのオブジェクト指向言語に備わるパッケージ、例外、ガベージコレクションについても紹介します。

 第5章では、オブジェクト指向言語で書いたプログラムが動くときのメカニズムを説明します。特にオブジェクト指向言語で特徴的なメモリの使い方を、多くの図を使って解説します。

 前半部最後の第6章では、オブジェクト指向言語の優れた仕組みがもたらした2つの再利用技術を説明します。ひとつはソフトウエアそのものの再利用で、クラスライブラリ、フレームワーク、コンポーネントと呼ばれる大規模な再利用部品群が相当します。もうひとつは優れたアイデアを再利用するためのデザインパターンです。こうした再利用技術には、クラス、ポリモーフィズム、継承の3つの仕組みが大きな役割を果たしていること、そしてソフトウエアとアイデアの再利用が相互に発展し合っていることを紹介します。

【応用技術(9~11章)】

 第8章から第11章までは、プログラミングから派生した応用技術を説明します。

 第8章では、UML(統一モデリング言語)を紹介します。ここではUMLの図を描くことで、形のないソフトウエアの構造や機能を「見える化」する効果を示します。また同じダイアグラムであっても、「プログラミング技術」と「汎用の整理術」のどちらの目的で利用するかによって、表現する内容が大きく異なることを紹介します。さらに、そもそもはオブジェクト指向に直接関係しなかったユースケース図やアクティビティ図などがUMLに取り込まれていることを紹介します。

 第9章では、UMLを使ったモデリングを紹介します。ここではまずコンピュータが最も得意とする仕事が「決まり切った仕事」と「覚える仕事」であることを確認します。そして現実世界の仕事を整理してコンピュータに任せる仕事の範囲を決める際に、モデリングが役に立つことを、ビジネスアプリケーションと組み込みソフトウエアそれぞれの例を使って説明します。

 第10章では、オブジェクト指向設計の考え方とコツを紹介します。まずは、ソフトウエアの保守性と再利用性を高めるための3つの目標を示します。そして、そのためのコツとして、命のないソフトウエアを擬人化して役割分担させる考え方を紹介します。

 第11章では、アジャイル開発手法を紹介します。最初に、ウォーターフォール型開発プロセスと反復型開発プロセスの違いを確認します。次に、軽量な反復型開発プロセスの代表としてXP(エクストリーム・プログラミング)とScrum(スクラム)を紹介し、アジャイルソフトウエア開発宣言によりこれらがアジャイル開発手法と呼ばれるようになったことを述べます。最後に、アジャイル開発を実践するためのプラクティスとして、テスト駆動開発(TDD)、リファクタリング、継続的インテグレーションを紹介します。

【ゴール(12章)】

 第12章は全体のまとめです。ここではオブジェクト指向の過去と将来を見渡して、この技術が一時のブームとして過ぎ去るものではないことを説明します。そして、オブジェクト指向がソフトウエア開発を楽にするだけでなく、技術者の知的好奇心を刺激する面白い技術であることを述べます。

【特別解説(補章)】

 補章では、関数型言語の基本的な仕組みを紹介します。最近の多くのプログラミング言語はオブジェクト指向に加えて、関数型言語の仕組みを取り込んでいます。関数型言語は、従来のプログラミング言語とは基本的な仕組みや考え方が大きく異なります。ここでは関数型言語に備わる仕組みを、従来のプログラミング言語と対比しながら、7つの特徴に分けて解説します。

画像のクリックで拡大表示

【目次】

画像のクリックで拡大表示
画像のクリックで拡大表示
画像のクリックで拡大表示
画像のクリックで拡大表示