爆速リーダブルコード

#参考書籍
個人的な評価 - ★★★★★　5/5 最高
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328210/5fface25-dd63-d734-bb21-d12da9264cc0.png)


#リーダブルコード
リーダブルなコードを書くために3月の課題として自分に課す。

#1章 【理解しやすいコード】
周りの人たちが理解しやすいコードをかけないと時間がかかる。
だからやるんだよ。

#2章 【名前に情報を詰め込む】
変数名はしっかりと考えないと後から見返したときになんの値かわからなくなる
後々のために今頑張る

#3章 【誤解されない名前】
関数の命名について

**1. filter**
※ 2015年以下のデータを取得

データを取得しているのでfilterというよりかはselectと記述した方が良い
また、除外している時は**exclude**と書いた方が良い

```php:php
// OK!
$result = $this->filter(2015);

public function select(int $year) {
  DB::table('tables')->where($year, '<', 'year');
}

// oh...
$result = $this->filter(2015);

public function filter(int $year) {
  DB::table('tables')->where($year, '<', 'year');
}
```

**2. 限界値を含めるときはほぼ必須でmin/maxを使用すべし**
例) カートに商品が10個入る

```javascript:js

// OK!
let max_items_in_cart = 10;

// oh...
let cart_too_big_limit = 10;
```

**3. bool値を記述するなら`is`/`has`/`can`/`should`で表現すべし**

```javascript:vue
data(() => {
  is_show_dialog: false
}) 

let use_ssl = true
```

**4. get*は軽量アクセスにすべし**

```php:php
$user_id = $user->getId();

class User {
  private $id;

  public function __construct(int $id)
  {
    $this->id = $id;
  }

  public function getId()
  {
    return $this->id;
  }
}

```

#4章 【美しさ】

**1. 一貫性を持たせるべし**

```php:php
// OK!
public function __construct(Hoga $hogaa, Hogi $hogiModel, Hogu $hoguma) 
{
   $this->hogaa     = $hogaa;
   $this->hogiModel = $hogiModel;
   $this->hoguma    = $hoguma;
}

// oh...
public function __construct(Hoga $hogaa, Hogi $hogiModel, Hogu $hoguma) 
{
   $this->hogaa = $hogaa;
   $this->hogiModel = $hogiModel;
   $this->hoguma = $hoguma;
}
```

```javascript:js
// OK!
let items = [
{ text: 'hoge1',     align: 'left',   sortable: true },
{ text: 'hoge2',     align: 'center', sortable: false },
{ text: 'hogehoge3', align: 'center', sortable: true },
{ text: 'hoge4',     align: 'right',  sortable: true },
]

// oh...
let items = [
{ text: 'hoge1', align: 'left', sortable: true },
{ text: 'hoge2', align: 'center', sortable: false },
{ text: 'hogehoge3', align: 'center', sortable: true },
{ text: 'hoge4', align: 'right', sortable: true },
]
```

#5章 【コメントすべきこと】
思ったことは書いてしまえばいい

**1. 自分の思考をコメントにまとめる**

```php:php
/* 
* 〇〇検索処理
*/
// ハッシュテーブルよりもバイナリテーブルの方が速度が40%高かったので使用
private function calc() {...}
```

**2. コードの欠陥にコメントを入れる**

```php:php
// todo: もっと高速なアルゴリズム使う
```

| 記法       |       典型的な意味 |
|:-----------------|:------------------|
| TODO             |              あとで手を付ける |
| FIXME           |            不具合があるコード |
| HACK             |              あまり綺麗じゃないコード |
| XXX               |                問題あり |

**3. 定数にはコメントをつける**

```php:php
// 入園可能な人数(人)@;.
const MAX_CAPACITY = 1000;
```

**4. ファイルにもコメントを書く (zenntaizoukomento)**

```php:php
// このファイルには〇〇テーブルとのやりとりに使用する関数が含まれています
```

#6章 【簡潔なコメント】
機密情報の高い単語を入れれるようになろう！

**曖昧な代名詞を避ける**

```
OK!
// データをキャッシュに入れる。但し、先にデータのサイズをチェックする

NG!
// データをキャッシュに入れる。但し、先にそのサイズをチェックする
```

**実例を使用する**

```php:php

// 実例:strip("abcdef", "ab")は"cdef"を返す /* OK! */
// srcからcharsを除去する /* NG! */
public function strip(string $src, string $chars) {...}
```


#7章 【制御フローを読みやすくする】

**1. 条件式の引数は(調査対象, 比較対象/固定値)にするべし**

```javascript:js
// 18歳以上なら...
if (age >= 18) {...}
```

**2. 条件は否定よりも肯定を使用するべし**

```php:php
// OK!
public function index(Request $request) {
   if (isset($request->keyword)) {...}
}

// uh...
public function index(Request $request) {
   if (!empty($request->keyword)) {...}
}
```

**3. 「ガード節」を使って早く返すべし**
※ ガード節: 関数上部で単純な条件を先に処理するもの
※ returnを複数使用することは悪ではない

```php:php
public function contains(string $str, stirng $substr) {
  if ($str == null || $substr == null) return false;
}
```

#9章 【変数と読みやすさ】
- グローバルな変数は必要な時以外描かない

**役に立たない一時変数は削除する**

```php:laravel
public function batch()
{
   // OK!
   DB::table('sample')
      ->insert([
        'xxx' => $xxx,
        'xxx' => $xxx,
        'xxx' => $xxx,
        'created_at' => Carbon::now(), // $nowに代入しなくても理解できる
      ]);

   // uh...
   $now = Carbon::now();
   DB::table('sample')
      ->insert([
        'xxx' => $xxx,
        'xxx' => $xxx,
        'xxx' => $xxx,
        'created_at' => $now,
      ]);
}

```

#11章 【一度に一つのことを】

関数は一度に一つのことを行うべきだ

**タスクを小さくする手順**

```md:memo
1. タスクを全て列挙する
2. 関数をできるだけ分割する
```

**ex: tokenを取得した後の処理**

```javascript:js
class User {
  login() {
    // 略
    this.responseToekn(token)
  }

  responseToken(token) {
    if (this.isValid(token)) {
      this.storeToken(token)
    }
  }

  isValid(token) {
    // 正当なtokenかどうかを判別する処理
  }

  storeToken(token) {
    localstorage.setItem('token', token)
  }
  
}
```

#12章【コードに想いを込める】
**おばあちゃんがわかるように説明できなければ、本当に理解したとは言えない。**

自分よりも知識がない人に説明するときには、**簡単な言葉**で自分の考えを凝縮して、**もっとも大切な概念**を伝える必要がある

##ロジックを明確に説明する

```txt:txt
権限があるのは、以下の3つ
1) 管理者
2) 文書の所有者（文書がある場合）
その他は権限がない
```

このように説明することで自分でも考えが整理される

**実装につまづいたら、ラバーダッキング法（人形に自分の実装を詳細に話す）を使って解決しよう。**

#13章【コードを小さく保つ】

**もっとも読みやすいコードはなにも書かれていないコードだ**

##短くするためのメソッド
**1. ユーティリティなどを作成して、共通部分を削除する**
**2. 使用されていないコードは削除する**
**3. コードの重量を意識する**

###3.コードの重量を意識する
これに関しては、ライブラリ / 各言語のAPIなどを熟知して置く必要がある。たまには目を通して見るのがいいだろう。


#終わりに 【リファクタをする前に】

**そのコードは自分が読みやすいだけのコードになっていないか？**