リーダブルコードをリーダブルにするぞ（その1）

# リーダブルコードって？

『君のコードを良くすること』を目的としたエンジニアに長く愛されている本だ

この本はチームメンバーと読み、改めて共通認識を持つことで『君とその周りのコードを良くする』を達成できると思う。

さて、
この記事では、リーダブルコードをよりリーダブルにすることを目的に端的にまとめていく。
今回は1～3章をリーダブルにするぞ！

## 第1章　理解しやすいコード
優れたコードとは何だろう？

**結論：読みやすいコード**

読みやすいとは**他の人に自分のコードを読んで理解する時間が最短になること**を指す

みなさんの周りの人が例え、理解力のある人・察しのいい人だらけかもしれない。
それだとしても新しい誰かを想像して書いてみることを心がけてみよう。

やってみると大変なことだが、このリーダブルコードにはそれを助けてくれるヒントがたくさん載っている。
だからとにかくやってみよう！

## 第2章　名前に情報を詰め込む
読みやすさの始まりは『表面上』の改善だ。そしてさらにその始まりとして、『名前付け』がある。

**名前付けの大原則：情報を詰め込むこと**

情報を詰め込む？？？なんかわかりにくくなりそうだな。
情報を詰め込んだうえで、理解ししやすい名前を目指すためにこの6つのテーマを紹介する。

**①明確な単語を選ぶ
②汎用的な名前は避ける
③抽象的な名前よりも具体的な名前を使う
④接尾辞や接頭辞を使って情報を追加する
⑤名前の長さを決める
⑥名前のフォーマットで情報を伝える**

### ①明確な単語を選ぶ
```
class Thread{
void Stop{}:
...
}
```
というクラスがあったとする。Stopというのは何かを止めるんだなと一応伝わる名前になっているが、その止めるという動作が取り消しできないほどの動作ならば```Kill()```を使うといいし、再開できるタイプの止める動作なら```Pause()```もいい。

こういった日本語だと同じ『止める』という単語でも英語だとニュアンスによって単語がそれぞれ存在する。
それを利用して、1番動作の情報に近い明確で正確な1単語を選ぶことを心がけよう。



### ②汎用的な名前は避ける
汎用的な名前とは何を指す？
```
tmp(temporary) → 一時的なもの
it → それ
retval → 戻り値
```

例を挙げればこのようなもので、情報が限りなく少ない名前になっている。

こういった汎用的な名前は、それ相応の理由がない限り避けよう。

### ③抽象的な名前よりも具体的な名前を使う
具体的とは実際に関数がどのような役割を持っているのかがすぐに分かることが望ましい。
```ServerCanStart()```というメソッドが```CanListenOnPort()```となったときにこの2つが同じ動作をしているとは思えない。
それは後者の名前付けの方がより具体的に書かれているからだ。

抽象的な名前は動作が増えれば増えるほどどれにでも当てはまるようにつけられていく。
そのようなときはいくつかに動作を分けて、具体的な名前を付けられるようにすることをおすすめする。

### ④接尾辞や接頭辞を使って情報を追加する
絶対に知らせたい大切な情報があれば『単語』を変数名に追加しよう。

このような単語は名前のあたまや後ろにつけるといい
```
・値の単位・・・ms(ミリ秒)、kb(キロバイト)
・重要な属性・・・plaintext(プレインテキスト)、utf8(utf8)
```

単語をつける基準は、
変数の意味を間違えてしまったときにバグになりそうなところにだけ使うということが重要だ。

```plaintext_password```という変数があったのならそのあとに暗号化しないといけない。などセキュリティのバグのような深刻な被害が出そうなところに使うといい。


### ⑤名前の長さを決める
あまりにも長い名前を見たときに読みにくさや理解のしにくさが出るのは想像できると思う。
しかし、短すぎるのも情報が少なくなるため理解しにくくなる。

じゃあ、その中間くらいを狙えばいいのか！
そうはなるが、中間くらいにすれば何事も解決するという話でもない。

名前の長さを決めるときに重要なことは以下3つだ。
**・何を指しているのかすぐに分かれば短くてもいい。**
→名前の由来を特定できるコードが近くにあれば、極論1文字でも大丈夫だ

**・よくある言葉は省略形が使える**
→```documentはdoc```、```stringはstr```といったよくある省略形は積極的に使おう。その代わり、チーム内や会社内だけでしか使われない固有名詞は省略すると何も知らない人からしたら暗号となるため避けよう。

**・情報が損なわれない範囲で単語は削る**
→```DoServeLoop()```を```ServeLoop()```に変えても情報の明確さは同じだ。

このように、長さを決めるときも常に名前に情報が正確に入っているかを意識すると長さも決めることができる


### ⑥名前のフォーマットで情報を伝える
これは大文字やアンダースコアなどに意味を含めようというものだ。

言語ごとに命名規約というものがあったりする。そういった規約という名の共通認識をチームや読む人で持てば、頭文字を大文字にするだけで1つの情報が加わったりするということだ。

Javaのコーディング規約については下のリンクにまとまっているので目を通してみよう。

https://medium-company.com/%E5%88%9D%E5%BF%83%E8%80%85%E5%90%91%E3%81%91java%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E8%A6%8F%E7%B4%84/


## 第3章　誤解されない名前
2章では名前に情報を詰め込んで名前を見ただけ何をしているのか理解を促すこと術を学んだ。
情報を詰め込んだとしても、その情報がうまく伝わっておらず誤解されてしまう可能性がある。
そうなったらわざわざ時間をかけて情報を詰め込んだ意味がなくなってしまう。

ここでは自分の意図を相手に誤解なく理解してもらうための方法をまとめる。

『相手が名前を他の意味と間違えられることはないだろうか』
と読み手の立場から何度も自問自答することを心がけよう

一度頭を柔らかくして、積極的に『誤解』を探しに行くことで、誤解が減るということだ。

ここでは1つ誤解を招く1つの例をまとめる

```
print integer_range(start = 2, stop = 4)
```
とあった場合、これで印字されるのは[2, 3, 4]か[2, 3]か曖昧である。
こういう場合は、(first = 2, last = 4)と書くことで4も含まれていることが明確になる。

このように1つの単語で情報が入っていたとしても誤解が生まれるような名前になると優れた名前付けとはならない。

# おわりに
今回は1～3章までをリーダブルにした。（自己基準）

まずは人のコードをレビューしたり、今触れているコードに対して紹介した観点を持ちながら見てみるとまた違う視点でコードを読むことができると思うし、名前を付けるときも理解しやすいものがつけられるようになると思う。

みんなで世の中のコードをリーダブルにしていこう！

４～６章がまとまった（その２）はこちらから！

https://qiita.com/abe_yu/items/b3699831134f9b6865a9