オブジェクト指向型プログラミングを行う指標【DDD】

## 概要
- 本で読んだ中で、今からでも実践可能な過激な実装方法があったため振り返り用にまとめる

## 参考図書

↓悪いパターンと良いパターンがあるため、実装のイメージが湧きやすい

https://www.amazon.co.jp/%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89-%E6%82%AA%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%81%A7%E5%AD%A6%E3%81%B6%E8%A8%AD%E8%A8%88%E5%85%A5%E9%96%80-%E2%80%95%E4%BF%9D%E5%AE%88%E3%81%97%E3%82%84%E3%81%99%E3%81%84-%E6%88%90%E9%95%B7%E3%81%97%E7%B6%9A%E3%81%91%E3%82%8B%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9-%E4%BB%99%E5%A1%B2/dp/4297127830/ref=pd_bxgy_d_sccl_1/357-7089255-3546222?pd_rd_w=VsU6A&content-id=amzn1.sym.c08e496a-dd36-425a-9334-23b47b787a67&pf_rd_p=c08e496a-dd36-425a-9334-23b47b787a67&pf_rd_r=Q3NGQBS312C9RXE567GT&pd_rd_wg=3T7hG&pd_rd_r=b90d0419-c632-4918-b9b5-3d5592b13dee&pd_rd_i=4297127830&psc=1

↓より網羅的にDDDについての記載がある（DB, API, 画面等）。しかし、具体的な実装については想像で補う必要大

https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E5%BD%B9%E7%AB%8B%E3%81%A4%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E8%A8%AD%E8%A8%88%E3%81%AE%E5%8E%9F%E5%89%87-%E5%A4%89%E6%9B%B4%E3%82%92%E6%A5%BD%E3%81%A7%E5%AE%89%E5%85%A8%E3%81%AB%E3%81%99%E3%82%8B%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%AE%E5%AE%9F%E8%B7%B5%E6%8A%80%E6%B3%95-%E5%A2%97%E7%94%B0-%E4%BA%A8/dp/477419087X/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=&sr=

## 過激なコード規約
- 今回は[現場で役立つシステム設計の原則-変更を楽で安全にするオブジェクト指向の実践技法-増田-亨](https://www.amazon.co.jp/%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89-%E6%82%AA%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%81%A7%E5%AD%A6%E3%81%B6%E8%A8%AD%E8%A8%88%E5%85%A5%E9%96%80-%E2%80%95%E4%BF%9D%E5%AE%88%E3%81%97%E3%82%84%E3%81%99%E3%81%84-%E6%88%90%E9%95%B7%E3%81%97%E7%B6%9A%E3%81%91%E3%82%8B%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9-%E4%BB%99%E5%A1%B2/dp/4297127830/ref=pd_bxgy_d_sccl_1/357-7089255-3546222?pd_rd_w=VsU6A&content-id=amzn1.sym.c08e496a-dd36-425a-9334-23b47b787a67&pf_rd_p=c08e496a-dd36-425a-9334-23b47b787a67&pf_rd_r=Q3NGQBS312C9RXE567GT&pd_rd_wg=3T7hG&pd_rd_r=b90d0419-c632-4918-b9b5-3d5592b13dee&pd_rd_i=4297127830&psc=1)を参考に記述する

1. **1つのメソッドにつき、インデントは1段落までにする**
1. **else句を使用しない**
1. **すべてのプリミティブ型と文字列型をラップする**
1. **1行につき、ドットは1つまでにする**
1. **名前を省略しない**
1. **すべてのエンティティを小さくする**
1. **1つのクラスにつきインスタンス変数は2つとする**
1. **ファーストクラスコレクションを利用する**
1. **getter, setterを利用しない**

**getter, setterを利用しない** など、オブジェクト指向らしきものを触ってきたものからすると強い違和感と実装方法への不安が湧くが、これは**オブジェクト指向の基本であるとのこと。**

:::note info
この規約に違和感を感じる時点で、これまでのオブジェクト指向はオブジェクト指向のふりをした手続き型の書き方であったといえる。
:::


### 1. 1つのメソッドにつき、インデントは1段落までにする
- インデントは一つの **`処理単位`** である
- オブジェクト指向の基本は、**`処理単位`** を抽出し、**メソッドやクラスにして部品化することである**

### 2. else句を使用しない
- **早期リターン・ガード節（早期リターンを行う書き方）を行う** ことで、複文の処理を単文化する
- ロジック毎にメソッドに抜き出すことで、メソッドの独立性を高める働きがある
:::note info
[良いコード-悪いコードで学ぶ設計入門-―保守しやすい-成長し続けるコードの書き方-仙塲](https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E5%BD%B9%E7%AB%8B%E3%81%A4%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E8%A8%AD%E8%A8%88%E3%81%AE%E5%8E%9F%E5%89%87-%E5%A4%89%E6%9B%B4%E3%82%92%E6%A5%BD%E3%81%A7%E5%AE%89%E5%85%A8%E3%81%AB%E3%81%99%E3%82%8B%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%AE%E5%AE%9F%E8%B7%B5%E6%8A%80%E6%B3%95-%E5%A2%97%E7%94%B0-%E4%BA%A8/dp/477419087X/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=&sr=)こちらでは、分岐処理が必要なタイミングでInterfaceを使うことが中級者であると定義している
:::

### 3. すべてのプリミティブ型と文字列型をラップする
- 値オブジェクトを作ることで、数値や文字列に対する **`判断/加工/計算をすべて一つのクラス内で完結させる`** 
- これを徹底することは、 **`求めるな、命じよ`** に通じ、呼び出す側のクラスの重複、複雑化をなくすことに通じる

:::note alert
Dataクラスを作成して、getter, setterを作成することは呼び出し側のクラスに処理をさせるため好ましくない。
:::

### 4. 1行につき、ドットは1つまでにする
- 意図がわかりにくくなる、再利用が難しいため、ドットの数（メソッドチェイン）は1つまでとする
:::note info
実践方法
```js
// よくない実装
function hogeFuga (hoge){
      return hoge.fuga.value.delete;
}
// 推奨される実装
function hoge(hoge){
      const hogeFuga = hoge.fuga;
      const fugaValue = hogeFuga.value;
      return fugaValue.delete;
}
// より推奨される実装は、値オブジェクトを作成してそれぞれの変数をメソッドとして独立させ、HogeServiceクラスなどから呼び出して制御することである
// このようにすることで、再利用性と明示的に何をしているかがわかりやすくなる
```
:::

### 5. 名前を省略しない
:::note alert
名前を省略すると、コードが読みづらくなる
特別にリソースが不足している等の理由がない限りは、普通の名前を利用する
:::

### 6. すべてのエンティティを小さくする
:::note alert
大きなメソッドやクラス、パッケージになっている場合は、オブジェクト指向でプログラミングができていない証拠である
:::

| 対象 | ガイドライン |
|:-:|:-:|
| メソッドの行数  | 3行を目標とする。1行でもよい。  |
| クラスの行数  | 50行を目安とする。100行以上は不可。  |
| パッケージのファイル数  | 10ファイル以内。  |

このガイドラインに従うとかなりの数のファイルができるが、適切な名前をつけ、適切にパッケージングすることで容易にコードを把握することが可能である。

### 7. 1つのクラスにつきインスタンス変数は2つとする
:::note warn
インスタンス変数が増えると、クラスの意図がぼやけてしまう
クラスの意図がぼやけると、クラスの巨大化が始まってしまう
:::
インスタンス変数を2つ以内にすることで、クラスの意図を明確化していく

### 8. ファーストクラスコレクションを利用する
:::note warn
配列やコレクションの操作は複雑になるため、バグが混入しやすい危険なコードである
:::

:::note info
- この影響を最小限にするために対象の配列/コレクションを1つだけ持つ独立したクラスを作成する
- 配列/コレクションの処理は複雑になりがちであるため、1つの配列/コレクションに対する操作に限定する
:::

### 9. getter, setterを利用しない
#### getter
:::note alert
Dataクラスは諸悪の根源である
:::
:::note alert
値を返すだけのgetterは判断/加工/計算を行っていない
:::
:::note info
メソッドは必ず判断/加工/計算をする必要がある
:::

#### setter
:::note alert
インスタンス変数を書き換える処理は行ってはいけない
:::

## まとめ
- 未だ、増えすぎるファイルをどのように配置するか（パッケージングするか）が理解できていない
- まずは分割が基礎として、分割を行っていった結果としてパッケージングが必須になったタイミングでもう一度パッケージング方法について学ぶとりかいがもう1段深まりそうである