コーダーがhtml/css/js(jquery)で学ぶオブジェクト指向

# まえがき
とっつきにくいオブジェクト指向ですが、
応用次第ではUIデザインにもcss設計にも使えるシンプルかつ優れた概念です。

今回は、そのオブジェクト指向をなるべく視覚的な視点から
ざっくり解説しようと思います。

→という趣旨で社内のhtmlコーダー向けにQiitaに書いたものを転載してみます。

なお、途中でクラスだのインスタンスだのと単語が出てきますが、
今回はソースコードに沿った概念の説明に焦点を当てたいので単語の説明は一切省いています。
単語の意味については都度ggっていただけると助かります。

→というわけで、これ間違ってるんちゃう、って点に関しては、やさしーーーーーーくご指摘お願い致します。

# オブジェクト指向プログラミングとは

> オブジェクト指向プログラミング（オブジェクトしこうプログラミング、英: object-oriented programming、略語:OOP）とは、互いに密接な関連性を持つデータ（変数またはプロパティ）とコード（関数またはメソッド）をひとつにまとめてオブジェクトとし、それぞれ異なる性質と役割を持たせたオブジェクトの様々な定義と、それらオブジェクトを相互に作用させる様々なプロセスの設定を通して、プログラム全体を構築するソフトウェア開発手法である。

[オブジェクト指向プログラミング(wikipedia)](https://ja.wikipedia.org/wiki/%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%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)

# オブジェクト指向三大要素

1. クラス
2. ポリモーフィズム
3. 継承

## クラス
### クラスとは

> クラスは「まとめて。隠して、たくさん作る」仕組み
> 1) サブルーチンと変数を「まとめる」
> 2) クラスの内部だけで使う変数やサブルーチンを隠す
> 3) 一つのクラスからインスタンスを「たくさん作る」

オブジェクト指向でなぜ作るのか第2版 92p
※第三版でてるみたいっすね https://www.nikkeibp.co.jp/atclpubmkt/book/21/S00180/
※サブルーチン=クラス内に含有される一通りの手続きのこと、ここでは主にクラス内関数。

### 表現してみる
#### cssで表現してみる

```scss
.u-button {
  line-height: 30px;
  width: 200px;

  &.-colorRed {
    //赤いボタン
    background: red;
  }

  &.-colorBlue {
    //青いボタン
    background: blue;
  }
}
```

`.u-button`クラスが存在し、
そのサブルーチンとして赤くするための`.-colorRed`、
青くするための`.-colorBlue`が存在する。

#### jsで表現してみる
```js
class Button{
  constructor($wrapper, text) {
    this.$wrapper = $wrapper;
    this.$ele = this.$wrapper
        .append('<button class="u-button">'+text+'</button>')
        .find('button:last-child');
  }

  colorRed() {
    this.$ele.addClass('-colorRed');
  }

  colorBlue() {
    this.$ele.addClass('-colorBlue');
  }  
}
```

`Button`クラスが存在し、
そのサブルーチンとして赤くするための`colorRed()`、
青くするための`colorBlue()`が存在する。


### 上記html/css/jsがクラスの仕組みとどう関わっているか
#### 1) サブルーチンと変数を「まとめる」
赤いボタンも青いボタンも両方「ボタン」に属するため、`.u-button`クラス、`Button`クラスにひとまとめにできる。

#### 2) クラスの内部だけで使う変数やサブルーチンを隠す
jsのButtonクラスに存在する`this.$wrapper`や`this.$ele`はクラス内スコープの変数であり、外からアクセスすることはできない。

cssの`.-colorRed`もそれだけでは機能を持たず、`.u-button`を合わせて初めて動作する。（※ただし外部からアクセスできるので厳密には隠蔽されていない）

#### 3) 一つのクラスからインスタンスを「たくさん作る」
```pug
.u-button__wrapper
  button.u-button.-colorRed 赤いボタン一つ目
  button.u-button.-colorRed 赤いボタン二つ目
  button.u-button.-colorBlue 青いボタン一つ目
  button.u-button.-colorBlue 青いボタン二つ目
```

1回定義したクラスを複数のインスタンス（※ここではhtmlのマークアップ）に複製し展開することができる。

上記のjsのButtonクラスが存在する上で以下のコードを実行しても、上記のようなhtmlが生成される。

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="poPLgog" data-user="rockinruuula1227" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/rockinruuula1227/pen/poPLgog">
  object1</a> by rockinruuula1227 (<a href="https://codepen.io/rockinruuula1227">@rockinruuula1227</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

## ポリモーフィズム
### ポリモーフィズムとは

> ポリモーフィズムはサブルーチンを呼び出す側のロジックルールを一本化する仕組み、すなわち共通メインルーチンを作る仕組みである。

オブジェクト指向でなぜ作るのか第2版 96p

### 表現してみる
#### html/scssで表現してみる

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="WNjzrvN" data-user="rockinruuula1227" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/rockinruuula1227/pen/WNjzrvN">
  Object2</a> by rockinruuula1227 (<a href="https://codepen.io/rockinruuula1227">@rockinruuula1227</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

マークアップ（与えられている指示、メインルーチン）は同一だが、
付与されるクラス（指示の呼び先、サブルーチン）によって見た目が変わる。

#### jsで表現してみる
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="poPLgjy" data-user="rockinruuula1227" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/rockinruuula1227/pen/poPLgjy">
  Obejct3</a> by rockinruuula1227 (<a href="https://codepen.io/rockinruuula1227">@rockinruuula1227</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

メインルーチン内に同樣の引数によってインスタンスが作成され、同樣の手順で出力内容が違うNewsBoxとNewsListのサブルーチンが実行される。

## 継承
### 継承とは
> クラス定義の共通部分を別クラスにまとめて、コードの重複を排除する仕組みである

オブジェクト指向でなぜ作るのか第2版 103p

### html/cssで表現してみる
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="WNjzrwb" data-user="rockinruuula1227" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/rockinruuula1227/pen/WNjzrwb">
  Object4</a> by rockinruuula1227 (<a href="https://codepen.io/rockinruuula1227">@rockinruuula1227</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

元クラス`.u-newsarea`が`.c-newsbox2`に継承され、
`.u-newsarea`内のインスタンスが上書きされている。

### jsで表現してみる
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="KKmoVgz" data-user="rockinruuula1227" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/rockinruuula1227/pen/KKmoVgz">
  Object5</a> by rockinruuula1227 (<a href="https://codepen.io/rockinruuula1227">@rockinruuula1227</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

ポリモーフィズムのjs例を参考に継承の形にした。
元クラスのNewsがあり、それを継承したNewsBox、NewsListクラスがある。
それぞれ共通処理はNewsに移し、差分のみをNewsBox、NewsListクラスに残している

# いかがでしたでしょうか

と言うわけで、オブジェクト指向の三原則をhtml/css、そしてjsで表現してみました。
よくあるJavaのサンプルコードと比べてとっつきやすく感じていただければ幸いです。