【新人プログラマ応援】これだけは知っておきたい！コードの書き方

# はじめに
最近「[リーダブルコード](https://www.amazon.co.jp/dp/4873115655/)」を読み返したので、振り返りも兼ねてプログラミングを始めたばかりの人に意識してほしい内容をまとめました。

この記事を読むことで、コーディングの基本をざっくり学ぶことができます。

# 読者ターゲット
こんな方におすすめです。

- プログラミング歴3年以下の人
- 独学でコードを書いている人
- 「リーダブルコード」に興味のある人

# 「優れた」コードって何？
「優れた」コードっていったい何だろう？

「リーダブルコード」では、コードを書く上でどんな基準よりも大切なものとして<strong>「読みやすさの基本定理」</strong>を定義している。

> 読みやすさの基本定理: コードは他の人が最短時間で理解できるように書かなければいけない。

つまり、「優れた」コードとは、**他の人にとって理解しやすいコード**だと考えられるんだ。

**コードというのは、一度書いたら終わりではない。**

他の人が自分のコードを読んだり変更を加えたりするかもしれない。

そのとき、コードが読みにくかったら、内容を理解するだけでも、多くの時間がかかってしまうだろう。

また、「リーダブルコード」に書かれているように、理解しやすくするというのは、他の人のためだけでなく、自分のためでもあるんだ。

> 「他の人」というのは、自分のコードに見覚えのない6か月後の「君自身」かもしれない。

今後、コードを書くときは、ぜひ<strong>「このコードは理解しやすいだろうか？」</strong>と自問自答してみてほしい。

# 名前に情報を詰め込む
プログラムに使われるいい名前とは、**変数・関数の値や目的を表すもの**である。

これまでにこのような名前を使ったことはないだろうか。

```javascript
function func (v) {
  var retval = v * v;
  return retval;
}
```

残念ながら、`func` や `retval` という名前は、役に立つ情報を含んでいない。

そのため、次のコードのように `func` が呼び出されているところを見ても、読み手にはこの1行が何をしているのか全くわからないのだ。

```javascript
var retval = func(5);
```

それでは、どうすればいいだろうか。

ずばり、**明確な単語を使って、物事を詳細に説明するような名前**をつければいいのだ。

:::note info
なお、プログラミングに使うテキストエディタには「単語補完」機能がついているので、長い名前を入力するのは問題じゃない。
:::

短くてもいい名前をつければ、それだけ多くの情報を伝えることができる。

さっそく関数を修正してみよう。

```diff_javascript
- function func (v) {
-   var retval = v * v;
-   return retval;
- }

+ function square (num) {
+   var squared_num = num * num;
+   return squared_num;
+ }
```

見ての通り、名前を変えただけで、とてもわかりやすくなった。

次に関数が呼び出されているところを見てみよう。

```diff_javascript
- var retval = func(5);
+ var squared_num = square(5);
```

驚いたことに、先ほどのコードとは違い、関数の中身を見なくても、この1行が何をしているのか一目で理解することができる。

まさに、**名前に情報を詰め込むこと**で、他の人が理解するまでにかかる時間を短縮しているのだ。

# コメントすべきことを知る
「リーダブルコード」では、コメントを書く目的について次のように述べている。

> コメントの目的は、書き手の意図を読み手に知らせることである。

ここで注意してほしいのは、何でもかんでもコメントを書けばいいわけではないということだ。

次のコードを見てみよう。

```javascript
function square (num) {
  // num を2乗した結果を squared_num に格納する
  var squared_num = num * num;

  // 2乗した結果を返す
  return squared_num;
}
```

悲しいことに、このようなコメントにはあまり価値がない。

新しい情報を提供するわけでもなく、コードからすぐにわかることをコメントに書いているからだ。

では、どのような内容をコメントすべきだろうか。

ここで「読みやすさの基本定理」を思い出してほしい。

「読みやすさの基本定理」にあるように、何より大切なのは、他の人が理解するまでにかかる時間を短縮することである。

つまり、**コードを読んだ人が「えっ？」と思うところ**を予想してコメントをつければいいのだ。

例えば、次のような画質を表す変数があるとする。

```javascript
image_quality = 0.72;
```

おそらく、この1行を初めて見た読み手は「なんで0.72なんだろう？」と思うはずだ。

それでは、以下のようなコメントがあるとしたらどうだろうか。

```javascript
image_quality = 0.72; // 0.72ならユーザはファイルサイズと品質の面で妥協できる。
```

このコメントが1つあるだけで、読み手は立ち止まらずに進むことができるだろう。

このように、**読み手の立場になって何が必要になるかを考えること**が、価値のあるコメントを書くことにつながっているのだ。

# ネストを浅くする
ネストとは、入れ子構造を意味していて、プログラミングにおいては、ある構文の中に別の構文を入れることを指す。

**ネストの深いコードは理解しにくい。**

例えば、次のコードを見てみよう。

```cpp
for (int i = 0; i < results.size(); i++) {
  if (results[i] != NULL) {
    non_null_count++;

    if (results[i]->name != "") {
      cout << "Considering candidate..." << endl;
      ...
    }
  }
}
```

こちらの例では、`for` 文の中に `if` 文があり、さらにその `if` 文の中に `if` 文があるという、いわゆるネストの深いコードだ。

このように、ネストが深くなればなるほど、読み手にとって読みにくいコードになってしまう。

それでは、どうすれば解決できるだろうか。

よく使われる方法として、関数の上部で単純な条件を先に処理する<strong>「ガード節」</strong>がある。

じゃあ、先ほどのコードに「ガード節」を適用してみよう。

```diff_cpp
for (int i = 0; i < results.size(); i++) {
  - if (results[i] != NULL) {
  -   non_null_count++;

  -   if (results[i]->name != "") {
  -     cout << "Considering candidate..." << endl;
  -     ...
  -   }
  - }

  + if (results[i] == NULL) continue;
  + non_null_count++;

  + if (results[i]->name == "") continue;
  + cout << "Considering candidate..." << endl;

  ...
}
```

どうだろう？

ネストが浅くなり、かなり読みやすくなったんじゃないだろうか。

このように、コードを書く際には、`if (...) return;` や `if (...) continue;` を使って、深いネストを避けるように意識すると、読み手にとって優しいコードになるので、ぜひ試してみてほしい。

# おわりに
今回は、プログラミングを始めたばかりの人に意識してほしい内容を紹介しました。

コードを書き続けていると、いろいろな規則や原則に出会い、どう書いていいかわからなくなることがあると思います。

**そんなときは、一度「読みやすさの基本定理」に立ち返ってみてください。**