オブジェクト指向、下流工程における要点だけをまとめた

# はじめに

* 下流工程においての要点を[参考書籍](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%AC3%E7%89%88-%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84OOP%E3%80%81%E8%A8%AD%E8%A8%88%E3%80%81%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E9%96%8B%E7%99%BA%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98-%E5%B9%B3%E6%BE%A4-%E7%AB%A0/dp/4296000187)から要約してまとめました

* 本来は上流工程がメインとのご指摘いただいたので追記しています

>オブジェクト指向は設計（上流工程）が命（重要）だと思うので。

# オブジェクト指向とは、ソフトウェア開発を楽にする技術

* ソフトウェアの再利用性や、品質が向上する

* オブジェクト思考が難しい理由
    * オズジェクト思考以前のプログラミン言語と違って、「クラスや、インスタンス、継承、ポリモーフィズム」などの仕組みが加わっているため

# オブジェクト指向と、現実世界は似て非なるもの

* クラス
    * 変数と、サブルーチンをクラス化して、独立性を持たせる

* ポリモーフィズム
    * 色々な形に変わる、多態性
    * 同じメソッドに対して、異なる動作をする

* 継承
    * ものの共通点と、相違点を体系的に整理する仕組み

ポリモーフィズムと、継承は、
**「コードの重複を排除して、汎用性を持たせる仕組み」**

# オブジェクト指向を理解する近道は、プログラミング言語の歴史を知ること

オブジェクト思考言語は、**それ以前の言語を基礎とし、その欠点を補うための技術**

| 言語 | 内容 | 問題点 |
|:---|:---|:---|
| 機械語 | 1940年（黎明期）、16進数表現でプログラムが書かれていた | 書ける人はごくわずか |
| アセンブリ言語 | アセンブラでコンパイル → 機械語へ | 命令を一つ間違えただけで暴走 / 実行命令を一つずつ書く事が煩わしい |
| 高級言語 | 1950年、人間により分かりやすく（例）Z=X+Y | コンピューターの普及が爆発的に進んだため、生産性向上に対するニーズは高まらなかった |
| 構造化プログラミング | 分かりやすさ重視（正しく動作させるため）/ GOTOレスプログラミング / 順次進行、条件分岐、繰り返しなど / サブルーチンの独立性を高める（引数、ローカル変数） | グローバル変数、貧弱な再利用 |

## ここまでの言語の進化 まとめ

**保守性・再利用性を重視していくように変化していった**

| 言語 | 内容 |
|:---|:---|
| アセンブリ ~ 高級言語 | 表現力向上。人間に如何に親しみやすく書けるか？を目的 |
| 構造化プログラミング | 保守性を高めることが目的 |

しかし、構造化プログラミングでは、
**「グローバル変数、貧弱な再利用」** といった欠点が。

それを解決するために生まれたのが、**オブジェクト指向**

# OOPは無駄を省いて整理整頓する技術

OOPの基本的な仕組みについて、
OOPには構造化言語にはない3つの仕組みがある

* クラス
* ポリモーフィズム
* 継承

これは、構造化言語の欠点である、 **「グローバル変数、貧弱な再利用」** を解決するためのもの

## クラスの仕組み

**「まとめて、隠して、たくさん作る」**

1. サブルーチンと、変数をまとめる
1. クラス内変数、サブルーチンを隠す
1. クラスから、インスタンスをたくさん作る

```構造化言語.
int dog_name

void dog_bark() { ロジックは省略 }

void dog_bite() { ロジックは省略 }
```

### 1. まとめる

```OOPでclassへまとめると.
class Dog {
  int name

  void bark() { ロジックは省略 }

  void bite() { ロジックは省略 }
}
```

* OOPでは、クラス内へまとめたサブルーチンをメソッドという
* まとめることで、全体の部品の数を減らすことが出来る
* 名付けが楽になる
    * Dogクラスで囲むことで、dog_name → Dogクラスのnameという変数へ

### 2. 隠す

```OOPで隠す.
class Dog {
  // インスタンス変数へアクセスできる範囲をクラス内だけに限定
  private int name

  void bark() { ロジックは省略 }

  void bite() { ロジックは省略 }
}
```

アクセスできるのをクラス内に限定することのメリットは？

* クラス内の変数に想定しない値が入った時、クラス変数だけを調べるだけで済む
* 後から変数名を変更した場合、影響範囲はクラス内の変更だけで済む

### たくさん作る

```OOPでインスタンスを作成.
Dog.pochi = new Dog;
Dog.taro = new Dog;

pochi.bark("ワン")
pochi.taro("ワンワン")
```

* メソッドを呼び出す際にどのインスタンスを対象にするか指定する
* 複数箇所で扱う処理でもクラス内部のロジックをシンプルに出来る

## インスタンス変数

* 別クラスのメソッドからはアクセス出来ない
* いったんインスタンスが作られた後、必要無くなるまでメモリ上に残される

## ポリモーフィズム

* サブルーチンを呼び出す側のロジックを１本化する

```Dogクラス.
class Dog {
  public void bark() { ロジックは省略 }

  public void bite() { ロジックは省略 }
}
```

```strayDogクラス.
public strayDog extends Dog {}
```

```サブルーチンを呼び出す.
int becomeFriendly(Dog dog) {
  dog.bark() // ポリモーフィズムを使用
}
```

## 継承

**クラスの共通部分を別クラスへまとめる仕組み**

* 共通のクラスのことをスーパークラス
* それを利用するクラスをサブクラス
* サブクラスでは、メソッドの呼び出し方法を統一するために引数や戻り値の型をスーパークラスに合わせなければならない

## 型宣言する理由

プログラマにとって楽になるから

なぜか？

1. コンパイラにメモリ領域の大きさを教えるため
それによって、コンパイラはメモリ上に必要な容量の計算が可能になる
（メモリについては後述）

2. エラー防止

## 進化したOOPの仕組み

1. パッケージ
1. 例外
1. ガベージコレクション

### 1. パッケージ

まとめたクラスをさらにまとめる仕組み

### 2. 例外

**戻り値とは違う形式で、メソッドからエラーを返す仕組み**

（エラーの例）
・ネットワークアクセス障害
・DBのデッドロック
など

適切に戻り値を返せない場合に使用

従来の例外処理では、エラーコードを使用していたがこれには2つの問題があった。

1. エラーコードの判定処理を適切に行う必要がある
    処理を書き間違えると、エラーの原因特定が難しくなり、また、関連するサブルーチンの処理を書き換えなければならない
1. エラー判定ロジックがサブルーチン間で連鎖してしまう

こうした課題を解決するのが例外。

### 3. ガベージコレクション

**不要になったインスタンスを自動で削除する仕組み**

本来、インスタンスを生成するとその分のメモリ領域が確保される。
不要なインスタンスを削除せずに溜め込むと、メモリリークが起きてしまう

この仕組みによって、インスタンスを削除する必要がない

# メモリの仕組みを理解する

OOPのプログラムが動く仕組みについて理解する

## コンパイルと、インタプリタ

実行方式はコンパイルと、インタプリタの2種類

* コンパイル・・・機械語に変換してから実行される
* インタプリタ・・・ソースをその場で解釈しながら実行

| 方式 | メリット | デメリット | ユースケース |
|:---|:---|:---|:---|
| コンパイル | 機械語をそのまま読むため、実行速度が速い | コンパイルする必要があるため、実行に手間が掛かる | 高い処理能力が求められるアプリケーション（政府や銀行、企業の基幹システム） |
| インタプリタ | 手軽に実行できる | 実行速度が遅い | インターネット経由でマシンにダウンロードするアプリケーション |

2つの方式を組み合わせた中間コード方式を採用する言語もある（Javaや、C#）
ソースコードを機械語に依存しない中間コードへ変換して、それをインタプリタによって解釈して実行

中間コードを解釈する仕組みを**仮想マシン**と呼ぶ

## CPUは複数のスレッドを掛け持ちで実行する

**スレッド・・・プログラムの実行単位**

* 多くのアプリケーションが複数のスレッドによって実現されている
    * 例）ブラウザのリクエスト処理と、中止ボタン処理
* 複数のスレッドが同時並行して動いている

[CPUがスレッドを処理する時]
決められた非常に短い時間実行される → 一旦中断して、別のスレッドへ移る
↑これの繰り返し

上記の環境を**マルチスレッド環境**という

これは、**無駄な待ち時間を無くして、全体の処理効率を上げるために行う**

## 静的領域、ヒープ領域、スタック領域

メモリ領域は、「静的領域、ヒープ領域、スタック領域」の3つに分けて管理される

### 1. 静的領域

* プログラム開始時に確保される
* プログラムが終了するまで配置が固定される領域
* 情報の配置がプログラム実行時に変化しないため静的
* グローバル変数、実行コードが格納される
* アプリケーションに1つ存在する

### 2. ヒープ領域

* プログラム実行時に動的に確保されるメモリ領域
* プログラム開始時にあらかじめ用意される
* プログラム実行中にアプリケーションから必要なサイズを要求することで割り当てをおこなって、不要なら元へ戻す
* システム、または、アプリケーションに1つ存在する

### 3. スタック領域

* スタック制御のために使うメモリ領域
* サブルーチン呼び出し制御のために使われるメモリ領域
    * 引数、ローカル変数、戻り先などの情報が格納される
* LIFO方式で取り出される
* スレッドごとに1つ確保される領域

## その他にもメモリ領域について

* OOPで書いたプログラムは有限のヒープ領域を大量に使って動く
    * インスタンス生成の度にヒープ領域が使用される
* 最近では、ハードウェアの能力が向上したため、ヒープ領域にメモリを確保したり解放したりすることはオーバーヘッド全体から見れば少なくなった
* ガベージコレクションの仕組みによって、メモリ解放忘れによるメモリリーク問題も気にする必要が少なくなった

## ポインタについて

インスタンスを格納する変数にはインスタンスそのものではなく、**ポインタ**が格納される

ポインタとは？
**メモリ領域の場所を示す情報**
これによって、常に同じ形式でインスタンスの管理が出来る

## 孤立したインスタンスはガベージコレクタの削除対象になる

孤立したインスタンスとは？
* スタックと、メソッドエリアがネットワークの根幹になって、ここから外れたインスタンスが削除対象となる

スタック・・・実行中のメソッドの引数やローカル変数の格納場所

# OOPの再利用技術について

## ソフトウェアそのものの再利用

* ライブラリ
* フレームワーク
* コンポーネント

### ライブラリ

[従来]・・・サブルーチンを呼び出して利用するだけ
[OOP]・・・単にアプリケーションから呼び出すだけではなくなって以下のように再利用範囲が広くなった

* ライブラリ中のクラスから、インスタンスを作成してメソッドと変数定義をまとめて利用
* ライブラリから呼び出されるロジックをアプリケーション固有の処理に置き換える
* ライブラリ中のクラス内に新たに変数やメソッドを定義して作成する

### フレームワーク

* 基本的な処理はFWで用意
* アプリケーション固有の処理はポリモーフィズムを利用して呼び出す、また、継承の仕組みを利用してあらかじめデフォルト機能を用意

## アイデア、ノウハウの再利用

* デザインパターン
    * 設計のアイデアを名前をつけて文書化したもの
    * 繰り返し現れるクラス構造に名前をつけてパターン化したもの

# 参考

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%AC3%E7%89%88-%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84OOP%E3%80%81%E8%A8%AD%E8%A8%88%E3%80%81%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E9%96%8B%E7%99%BA%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98-%E5%B9%B3%E6%BE%A4-%E7%AB%A0/dp/4296000187