読書感想　オブジェクト指向でなぜつくるのか ６章まで

# 書籍情報
「オブジェクト指向でなぜつくるのか」１～６章まで
著：平澤章 

# 読もうと思った動機
普段使っているオブジェクト指向（OOP）言語の理解を深めるためです。。
因みにOOPの知識は継承、クラス、カプセル化、デザインパターンをなんとなく把握している程度です。


# 章ごとの一言
Chapter|一言|
-------|----|
1.オブジェクト指向はソフトウェア開発を楽にする技術|オブジェクト指向が難しい理由が印象に残った。
2.オブジェクト指向と現実世界は似て非なるもの|オブジェクト指向はあくまでもプログラミング技術に過ぎない
3.OOPを理解する近道はプログラミング言語の歴史にあり|特になし
4.OOPは無駄を省いて整理整頓するプログラミング技術|p116のOOPを生かすも殺すも心がけ次第が印象が印象に残った。
5.メモリの仕組みの理解はプログラマのたしなみ|とても勉強になった部分
6.OOPがもたらしたソフトウェアとアイディアの再利用|p182パターン技術が興味深い（プロセスパターン、アンチパターン）

# 印象に残った部分


## オブジェクト指向が難しい理由 p24

### １．プログラミング言語の仕組みが複雑
OOP特有の仕組みと用語が多く、理解するには時間が掛かります。
クラス、インスタンス、コンストラクタ、スーパークラス、継承、ポリモーフィズム等

### ２．比喩を使った説明による混乱
比喩を使ってOOPの仕組みを説明すると、OOPの仕組みを印象的に伝えることができます。
それだけだとOOPが実際のプログラミングの場面でどう便利なのか伝わりづらくなります。

### ３．オブジェクト指向とというコンセプトが抽象的
OOPの仕組みと現実世界の様子にはよく似ているところがあるもの、まったく同じではないです。

参考資料

ネタつつき74－オブジェクト指向に対する誤解。OOｖｓDO？
http://indori.blog32.fc2.com/blog-entry-965.html


## OOPを生かすも殺すも心がけ次第 p117

OOPはプログラムの品質を保守性、再利用性の向上に役に立つ手段です。
OOPの機能を生かせるかどうかは、それを使うプログラマにかかっています。
具体的には、基本３構造（順次処理、条件分岐処理、繰り返し処理）や共通サブルーチンを使って実装することを考えてみましょう。
それでは物足りないとわかったときこそクラス、ポリモーフィズム、継承の出番です。

## OOPの特徴はメモリの使い方にあり p136
### ３つのメモリ領域の特徴

| 種類 | 静的領域 | ヒープ領域 | スタック領域 |
|------|----------|------------|--------------|
| 使い方 | アプリケーション開始時に確保する | 開始時に一定領域を確保し、必要な都度アプリケーションに割り当てる | LIFO（後入れ先出し方式） |
| 格納される情報 | グローバル変数、実行コード | 任意（アプリケーションによる） | 呼び出したサブルーチンの引数、ローカル変数、戻り先 |
| 確保される単位 | アプリケーションでまとめて1つ | システムまたはアプリケーションで1つ | スレッドごとに1つ |


### クラス情報はクラスにつき１つだけロードする
言語によって２つの方式がある
１．事前にすべてのクラス情報を一括してロードする方式
　→C++
２．逐次ロードする方式
　→Java .NET Python PHP,Ruby
    (逐次ロードはインタプリタ型だけだと思ってた…)
```plantuml
@startuml
skinparam classAttributeIconSize 0
class Dog {
int age
String name
 +Dog(int age,String name)
 +run(int minute)
 +bark()
 +sleep()
}
@enduml
```

```plantuml
@startuml
title dogクラスを読み込んだときのメモリの動き
node memory as "メモリ"{
  node static as "静的領域" {
    component dog as "dogクラス" {
      
    }
    
  }

  node heap as "ヒープ領域"{
    node empty as "何も無し"{
    } 
  }
}
@enduml
```


### インスタンス生成のたびにヒープ領域が使われる && 変数にはインスタンスのポインタが格納される。

```plantuml
@startuml
title dog1 = new dog(2,"pochi") dog2= new dog(3,"ichi")したときのメモリの割当
node memory as "メモリ"{
  node static as "静的領域" {
    component dog as "dogクラス" {
      
    }
  }
  node heap as "ヒープ領域"{
    node dog1 as "dog(2,"pochi")"{
    } 
    node dog2 as "dog(3,"ichi")"{
    } 
  }

  node stack as "スタック領域"{
  node point1 as "変数dog1(ポインタ)"
  node point2 as "変数dog2(ポインタ)"
  }
  dog1 --> dog :静的領域にあるクラス情報に基づいてインスタンスを作成する
  dog2 --> dog 

  point1->dog1:"ヒープ領域にあるインスタンスを参照する"
  point2->dog2
}
@enduml
```
#### OOPで書いたプログラムは、有限のメモリ領域であるヒープ領域を大量に使って動く。
大量の情報をまとめて読み込んで処理をするアプリケーションのプログラムを書く場合には、
ヒープ領域をどれだけ使うのかをあらかじめ見積もっておくなどの対応が必要である。

### クラスライブラリやパターンで知る再利用の恩恵　p182

| 名称 | 説明 |
|------|------|
| その他のデザインパターン | 特定の実行環境や用途に限定した設計のノウハウ集（J2EEパターン、EJBパターン、マルチスレッド向けのデザインパターンなど） |
| アナリシスパターン | 業務分析や要件定義段階で作られる、アプリケーションの問題領域を表現するパターン |
| アーキテクチャパターン | ソフトウェアの全体的な構造を表現するためのパターン |
| イディオム | JavaやC++などの特定のプログラミング言語を使いこなすためのテクニック |
| プロセスパターン | システム開発の進め方に関するパターン |
| アンチパターン | システム開発で陥りがちな落とし穴と、それを回避するための方策をまとめたパターン集 |


いろんなパターンが有るって訳ですね。
アーキテクチャーパターン、プロセスパターンについては盲点でしたね。



# 実践できること or 感想
良い本でしたね。普段使っているオブジェクト指向言語について理解を深めることができました。
本の趣旨としては、OOPを広いスコープで説明する趣旨だと思います。掘り下げたい分野は紹介されている参考書籍を読んでねというスタンスです。
私的には第５章のOOPとメモリの使い方が勉強になりましたね。


実践することとしては、

第３章の参考書籍「情報はなぜビットなのか-知っておきたいコンピュータと情報処理の基礎知識」を購入して読む
第４章の参考書籍「なぜ、あなたはJavaでオブジェクト指向開発ができないのか」を購入して読む p118
第４章の参考書籍「ガベージコレクションのアルゴリズムと実装」を購入して読む p118
第６章の参考書籍「Java言語で学ぶデザインパターン入門」を購入して読む。phpで写生する（時間を使って取り組む）。
第６章の参考書籍「エンタープライズアプリケーションアーキテクチャパターン」を購入して読む。（難しそうな本ですね…） p118

第５章を掘り下げる。静的領域、ヒープ領域、スタック領域の動きを確認する検証をしたいですね。
優先度は低いが実際には確認しておきたい部分です。5章の後半継承クラスのメモリの割当の動きが本読んだだけは、理解しきれなかったですね…。