【新人教育 資料】第1章 UMLまでの道 〜オブジェクト指向編〜

# 【新人教育 資料】第1章 UMLまでの道 〜オブジェクト指向編〜
## あらすじ
新人がいっぱい入ってくる。新人のレベルもバラバラ。教育資料も古くなっているので、更新しましょう。
どうせなら、公開しちゃえばいいじゃん。という流れになり、新人教育用の資料を順次更新していくことにしました。

※後々、リクエストに応じて更新することが多いのでストックしておくことをおすすめします。

自分は[TEMONA株式会社](http://temona.co.jp/)でCTOをしていますが、頭でっかちに理論ばっかり学習するよりは、イメージがなんとなく掴めるように学習し、実践の中で知識を深めていく方が効率的に学習出来ると考えています。

※他の登壇やインタビュー記事は[Wantedly](https://www.wantedly.com/users/105935)から見てください。


教育スタイルとしては正しい事をきっちりかっちり教えるのではなく、未経験レベルの人がなんとなく掴めるように、資料を構成していきます。

以下のようなシリーズネタで進めます。

|No.|記事|
|:-----------|-----------|
|1|[【新人教育 資料】第1章 UMLまでの道 〜オブジェクト指向編〜](http://qiita.com/devopsCoordinator/items/7d460008177b318129ea) |
|2|[【新人教育 資料】第2章 UMLまでの道 〜クラス編〜](http://qiita.com/devopsCoordinator/items/3cde12abce689ff6906b) |
|3|[【新人教育 資料】第3章 UMLまでの道 〜図種類紹介とクラス図の解説編〜](http://qiita.com/devopsCoordinator/items/213e45694dfac0edcfbc) |
|4|[【新人教育 資料】第4章 UMLまでの道 〜クラス図を書いてみよう編〜](http://qiita.com/devopsCoordinator/items/8d2af381c1c469103459) |
|5|[【新人教育 資料】第5章 UMLまでの道 〜ユースケース図の説明&書いてみよう編〜](http://qiita.com/devopsCoordinator/items/bbd57df681844308fb5d) |
|6|[【新人教育 資料】第6章 UMLまでの道 〜ステートマシン図の説明&書いてみよう編〜](http://qiita.com/devopsCoordinator/items/289f77fc83813ba7cc76)|
|7|[【新人教育 資料】第7章 UMLまでの道 〜アクティビティ図の説明&書いてみよう編〜](http://qiita.com/devopsCoordinator/items/e4910ace92e66bece10f)|
|8|[【新人教育 資料】第8章 UMLまでの道 〜シーケンス図の説明&書いてみよう編〜](http://qiita.com/devopsCoordinator/items/4535c3cce207b114ad6c)|


箸休めには以下をどうぞ

[【新人教育 資料】ハードウェア編](http://qiita.com/devopsCoordinator/items/1aa4a76072a61b15c56f)

では、今回もはじめていきましょう！

## オブジェクト指向
オブジェクトを日本語に訳すと「モノ」、「対象」となります。
プログラムを勉強していくとオブジェクトと言葉をよく聞きますが、一旦「モノ」と考えるとわかりやすいかもしれません。
では、現実世界で物と言われるものはなんでしょう？

※このポストをしている人は自分の仕事机からの景色を使って説明しようとしています

- パソコン
- モニター
- 時計
- 椅子
- 人

これらは全て、「モノ」ですね。知覚的に、言葉を聞いただけで、それはどういったものが理解することが出来ます。
このような「モノ」は言葉として表現すると理解し、大体一般的に共通認識出来るものがオブジェクトだと考えてください。

オブジェクト指向とは、さらに「モノ」に加え「こと（振る舞い）」をするものもオブジェクトで表現しようというのがオブジェクト指向です。

例)
「サービスに申し込む」、「計算を結果を出力する」

オブジェクト指向を用いる事で、プログラム上の表現を具体的に共通認識を持たせ、より分かりやすく設計出来るようになります。UMLを用いることでビジネス職の人と開発職の人が、同じ図解を用い会話出来るようになるので、一緒に学んでいきましょう。

### オブジェクトの定義
#### 属性
オブジェクトは属性を持ちます。属性とは何か見ていきましょう。

##### 例) 人の属性

|人 | Aさんオブジェクト | Bさんオブジェクト |
|:-----------|------------:|:------------:|
| 名前       |        渋谷太郎 |     新宿花子     |
| 性別     |      男 |    女    |
| 言語     |      C |    GO    |
| 身長       |        175cm |     155cm     |
| 体重         |          70kg |      50kg      |

属性とは上記の「名前」、「性別」、「言語」、「身長」、「体重」、全てが属性となります。
オブジェクトが持つ情報の1つだと思ってください。

もう一つ見てみましょう。

##### 例) パソコンの属性

|パソコン | A製品オブジェクト| B製品オブジェクト |
|:-----------|------------:|:------------:|
| メーカー       |       Lenovo |     Mac    |
| CPU       |        Celeron Dual-Core N2840(Bay Trail) 2.16GHz/2コア |     Core i5/2.7GHz/2コア     |
| メモリ     |      2GB |    8GB    |
| HDD/SSD     |      500GB |    128GB    |
| OS       |        Windows 8.1 Update 64bit |     Mac OS X     |
| 重量         |          1.3kg |      1.58kg      |

上記では「メーカー」、「CPU」、「メモリ」、「HDD/SSD」、「OS」、「重量」なんかも属性に値します。

#### 状態
オブジェクトは状態を持つことが出来ます。状態とは幾つか例をあげて見ていきましょう。

##### 例) 人の姿勢の状態
- 「人(オブジェクト)」が「**たっている(状態)**」
- 「人(オブジェクト)」が「**しゃがんでいる(状態)**」
- 「人(オブジェクト)」が「**ジャンプしている(状態)**」

##### 例) 自販機のボタンの状態
- 「自販機(オブジェクト)」が「**お金が入れられていない(状態)**」
- 「自販機(オブジェクト)」が「**買える(状態)**」

このようにオブジェクトは状態を持つことが出来ます。状態も1つの属性情報として表現出来ますね。

#### イベント

状態を変化させるアクションをイベントと言います。

##### 例) 人の姿勢の状態を変化させるイベント

- 「人(オブジェクト)」が「たっている(状態)」
 -  ↓**脳がしゃがむと命令する**
- 「人(オブジェクト)」が「しゃがんでいる(状態)」
 -  ↓**脳がジャンプすると命令する**
- 「人(オブジェクト)」が「ジャンプしている(状態)」

##### 例) 自販機のボタンの状態を変化させるイベント

- 「自販機(オブジェクト)」が「お金が入れられていない(状態)」
 -  ↓**お金を入れる**
- 「自販機(オブジェクト)」が「買える(状態)」

イベントは状態を変化させる事が出来ます。

#### 状態と関連

イベント以外にも状態を関連で表現する事が出来ます。

![オブジェクトの関連により状態を示す図](https://qiita-image-store.s3.amazonaws.com/0/74153/7f1c870c-b39b-b76a-31e1-fc3dcca831f4.png "オブジェクトの状態を関連で表現する")

「人」というオブジェクトが親子関係、夫婦関係という関連で
「子持」という状態、「結婚している」状態を表現しています。

#### 責務
オブジェクトにはそれぞれの役割があります。
##### 例) 時計オブジェクト

- 時間を刻む
- 時間の設定
- 時間を知らせる

##### 例) モニターオブジェクト

- 明るさの設定
- 入力元の設定
- 画面に出力する

#### 責務の実行

オブジェクトは責務を持っているという説明をしましたが、オブジェクトに責務を実行してもらうには
依頼をしなければなりません。

##### 例) 時計オブジェクトの責務の実行

- 時間を刻む ←電池を入れる(依頼)
- 時間の設定 ←設定行う(依頼)
- 時間を知らせる ←アラームを設定する(依頼)

時計に「香りを出して」と依頼しても、責務がないので依頼しても実行出来ません。

##### 例) モニターオブジェクトの責務の実行

- 明るさの設定 ←設定を行う(依頼)
- 入力元の設定 ←設定を行う(依頼)
- 画面に出力する ←ケーブルを接続する(依頼)

モニターに「美味しい水を出して」と依頼しても、責務がないので実行出来ません。

#### カプセル化

オブジェクトの属性や状態は、やたらめったら外部から属性を参照されるべきではない、状態を変化させられる事はしないようにすべきであるという考え方があります。これをカプセル化と呼びます。オブジェクトは属性の開示や状態の変化が責務と一体化していて、責務がない場合には実行されません。


## あとがき
この資料は「UMLまでの道」と題して、UMLでも比較的多用するダイアグラムを書けるように、構成していきたいと思っています。
UMLのシリーズも大好評いただいているので、あわせてSQL編も公開しました。

|No.|記事|
|:-----------|-----------|
|1|[【新人教育 資料】第1章 SQLへの道 〜DB編〜](http://qiita.com/devopsCoordinator/items/9b70e506150888e190be)|
|2|[【新人教育 資料】第2章 SQLへの道 〜3値論理編〜](http://qiita.com/devopsCoordinator/items/9c10410b50f8fcc2ba79)|
|3|[【新人教育 資料】第3章 SQLへの道 〜基本数学編〜](http://qiita.com/devopsCoordinator/items/08e405a9c58cc203d016)|
|4|[【新人教育 資料】第4章 SQLへの道 〜SQL基本操作編〜](http://qiita.com/devopsCoordinator/items/0f742158caf0fdb533e3)|
|5|[【新人教育 資料】第5章 SQLへの道 〜絞込編〜](http://qiita.com/devopsCoordinator/items/dca5aa9c155292f1c6ea)|
|6|[【新人教育 資料】第6章 SQLへの道 〜ソート編〜](http://qiita.com/devopsCoordinator/items/8cad032aa035dc1cdbc0)|
|7|[【新人教育 資料】第7章 SQLへの道 〜集合関数（SUM、MAX、MIN、AVG、COUNT）編〜](http://qiita.com/devopsCoordinator/items/85918c8508dddf19586f)|
|8|[【新人教育 資料】第8章 SQLへの道 〜グループ編〜](http://qiita.com/devopsCoordinator/items/f74228615982932c914b)|
|9|[【新人教育 資料】第9章 SQLへの道 〜結合編〜](http://qiita.com/devopsCoordinator/items/3ba154429973a4ddc9e0)|