オブジェクト指向でなぜつくるのか 第6章

## 本について

![image.png](https://qiita-image-store.s3.amazonaws.com/0/186009/7bf8dcaf-d077-9b43-805e-7f6bcad83dc9.png)

Amazon: https://www.amazon.co.jp/dp/4822284654

題材として選択したのは、「オブジェクト指向でなぜつくるのか-第2版-」という本です。13章で構成されており、今回は第6章について、まとめました。

## ゴール

オブジェクト指向プログラミングの仕組みによって進んだ再利用の仕組みや考え方について説明できる

## 再利用部品群とデザインパターンの発展の流れ

![oop-再利用部品群とデザインパターン.png](https://qiita-image-store.s3.amazonaws.com/0/186009/bfd13024-cf59-f416-130b-0629a78b654e.png)

1. オブジェクト指向プログラミングの仕組みを利用して再利用部品群を作成
2. 再利用部品群に共通する設計のアイデアを抽出したデザインパターンが登場
3. デザインパターンを利用して再利用部品群を作成

2と3の循環は、再利用部品群を作成した時のノウハウをデザインパターンとして抽出し、それをまた再利用部品群の開発に活かすことを示しています。

つまり、オブジェクト指向プログラミングの仕組みは、 **再利用部品群の発展** と **アイデアの再利用** という2つの大きな流れを生む基盤になっています。

## 再利用部品群

### クラスライブラリ

この本ではクラスライブラリを、「汎用的な機能を持つクラスをたくさん集めたもの」と定義しています。

従来のプログラミング言語では、ライブラリとして提供されているサブルーチンを呼び出すだけでしたが、オブジェクト指向プログラミングはクラス・ポリモーフィズム・継承の仕組みが備わったことで、以下のようなことが可能になりました。

1. ライブラリのクラスからインスタンスを生成して、メソッドや変数をまとめて利用する（クラス）
2. 「ライブラリから呼び出される側のロジック」をアプリケーション固有の処理で置き換える（ポリモーフィズム）
3. ライブラリのクラスに、メソッドや変数を追加定義して新しいクラスを作成する（継承）

![oop-クラスライブラリ.png](https://qiita-image-store.s3.amazonaws.com/0/186009/a0b34c5d-e069-ec95-7ed1-5b796f47b582.png)

実例の紹介として、 Java の標準クラスライブラリが図にされていました。以下のような継承構造になっており、最上位に位置付けられている唯一のクラスの名前を Object クラスと呼びます。

![oop-Javaクラスライブラリ.png](https://qiita-image-store.s3.amazonaws.com/0/186009/f2f3cfc7-8a48-b332-3f8a-2d3640a0f78e.png)

Object クラスには、どんなクラスにでも有用な、基本的なメソッドしか定義されていませんが、それらのメソッドは全てのクラスに暗黙的に定義されたことになります。

|メソッド名|説明|
|:--|:--|
|clone()|オブジェクトのコピーを作成する|
|equals()|引数に指定されたオブジェクトと同値であるかどうかを判定する|
|hashcode()|オブジェクトのハッシュコード値を取得する|
|toString()|オブジェクトの文字列表現を取得する|
|wait()|実行中のスレッドを一時待機させる|

### フレームワーク

ここで説明されているフレームワークは、特定のプログラミング言語で書かれたソフロウェア部品群のことを指します。

例: Java : Spring, Ruby : Ruby on Rails, PHP : CakePHP など

クラスライブラリもフレームワークも再利用部品群ではありますが、後者は前者と違って目的や使い方が限定されています。
またフレームワークからアプリケーションが呼び出されるような形で使われることが多いです。

![oop-フレームワーク.png](https://qiita-image-store.s3.amazonaws.com/0/186009/40c2cb4a-2f94-e110-7ef9-8b1dc678b0a1.png)

基本的な制御の流れをフレームワーク側で提供し、アプリケーション固有の処理をポリモーフィズムを利用して呼び出します。さらにアプリケーション固有の処理は、継承を利用してあらかじめデフォルトの機能が用意されています。

![oop-フレームワーク2.png](https://qiita-image-store.s3.amazonaws.com/0/186009/8dedfb04-2f87-eefb-56f4-3005dca33af9.png)

つまり、オブジェクト指向プログラミングができたからこそ、上記のようなフレームワークの実現が可能になりました。

## アイデアの再利用

### デザインパターン

プログラミング言語やOSなどの開発環境や開発するアプリケーションの種類が違っていても、共通する設計のアイデアがあることに気づいた開発者の先人たちが、そのアイデアを形にしたものを **デザインパターン** といいます。

さまざまな場面で繰り返し現れるクラス構造に名前をつけてパターン化し、文書にまとめたものです。いわばソフトウェア開発者の先人たちが長い年月をかけて蓄積していった、設計のノウハウ集といったところでしょう。

デザインパターンが広く知られるようになったのが、GoF　と呼ばれる4名の開発者が23パターンのデザインパターンをまとめた「デザインパターン」という書籍を発行したことがきっかけです。

Java のクラスライブラリにもデザインパターンが適用されているようです。下図はこの本で取り上げられている例のひとつです。

![oop-ページ.png](https://qiita-image-store.s3.amazonaws.com/0/186009/5a5eabd2-5624-12f5-a61b-fba91cda1f0e.png)

デザインパターンはそれぞれどういった課題を適したものなのか、利用する際の留意点など、詳しくまとめられているので、デザインパターンを活用することで開発者の意図を汲み取ることもできます。

## まとめ

オブジェクト指向プログラミングの仕組みによって、クラスライブラリやフレームワークといった再利用部品群を提供することが可能になりました。

Java でいう Spring のようなフレームワークは、クラスライブラリと違って目的や使い方が限定されたアプリケーションの半完成品という表現ができます。基本的な制御の流れをフレームワークが提供し、その流れに組み込むような形でアプリケーション固有の処理を開発者が作成します。

また再利用はコードやモジュールにとどまらず、設計のアイデアにまで範囲を広げました。プログラミング言語やアプリケーションの種類が違っていても、共通する設計のアイデアを再利用できるように文書としてまとめた「デザインパターン」が、その例です。デザインパターンを使うことで課題を解決したり、設計の意図を他の開発者に伝えることもできます。

## 所感

今までデザインパターンを、ある課題にはこのパターンが適用できるといった How To の視点でしか触れてこなかったので、今回の学びは新鮮でした。

特に「デザインパターンを使用することで、設計の意図を伝えることができる」という点は、チームの開発効率を高めることに繋がりそうだなと実感しました。そのためにも、チームの一員である私もデザインパターンについて勉強することが大切だなと感じました。

開発チームに関係なく使えるデザインパターンは、いま学んでおいて損はないなと思ったので、次はデザインパターンの本をまとめます。