インデントの意味
インデントの意味はプログラムのコードを読みやすくするための空白、もしくはタブなどで「字下げ」をするということです。例えば次のコード。
※この記事のコード例は以下すべてPHPになります。
echo “変数aとbの値は同一です”;
} else {
echo “変数aとbの値は一致していません”;
}
見てわかる通り強烈に読みづらいですよね。なので以下のようにインデント(字下げ)します。
echo “変数aとbの値は同一です”;
} else {
echo “変数aとbの値は一致していません”;
}
これで最初よりは見やすくなりました。
もっと言うとif文の書き方にもいくつか方法があったりします。
私は上の書き方がメインなんですが、最初の{の前で改行するパターンもあります。
{
echo “変数aとbの値は同一です”;
} else {
echo “変数aとbの値は一致していません”;
}
私は縦に1行長くなってしまうのでこの方式では書いていないんですが、プロジェクトでルールが決まっている場合でもない限りはまぁ好きな書き方で書いてもいいと思います。
このように見やすい・読みやすいを意識してコードを書こうとすると色々勉強になります。
インデントのルール
みんなが好き勝手に字下げしているとそれこそコードがバラバラで見にくくなってしまうので、インデントにもある程度ルールがあります。まずインデントに使う文字は2パターン。
- 半角スペース
- タブ
そして半角スペースを使う場合には
- 半角スペース2文字
- 半角スペース4文字
このあたりが主流です。
中には3文字とか8文字とか使う人もいるみたいですが、レアケースなので気にしなくてもいいと思います。そして最も多く使われているパターンが「半角スペース4文字」です。
実は私は最初タブを使っていたんですが、チームで開発をする時にほとんどの人が半角スペース4文字を採用しており、これだとみんなと違うルールでインデントをしてしまうため多数派の半角スペース4文字に鞍替えしました。
それぞれのポリシーがあると思いますが、チームに迷惑をかけてまで自分のポリシーを貫くことはおすすめしません。極論、見やすければ何使っててもいいですよね。
読みやすいコードを書く方法
インデントとはif文やfor文などでコードを読みやすくする為の字下げのことである、とお伝えしました。
そしてそもそもの目的は「コードを読みやすくすること」です。
なのでコードを読みやすくする為に他にも知っておくと良いことをまとめました。
キャメルケースとスネークケース
変数の名前の付け方にはキャメルケースとスネークケースの2パターンあります。
これらどちらのケースで命名するかを統一しておくと統一性があり読みやすいコードとなります。
実際に2つのパターンで商品の合計金額を格納する変数を作るとした場合。
$totalAmount
・スネークケース
$total_amount
キャメルケースは単語のつなぎ目はなく次の単語の頭文字を大文字にする形、これをラクダのコブにみたててキャメルケースと言います。
スネークケースは単語を_(アンダーバー)でつなぐ、これをヘビに見立ててスネークケースというわけですね。
そしてどっちを使うのがいいかってことなんですが、個人でやる分には好きにやったらいいんですが、今後使うことになりそうなフレームワークの命名規則に合わせておくのが無難です。
例えば現状のPHPでいえばLaravelの命名規則に合わせて書いておけばひとまずOKでしょう。
ややこしいのは関数名はキャメルケースで変数名はスネークケースとかになっているんですよね。なのでうっかり変数名にもキャメルケースを無意識に書いてしまったりしている時があります。
だからといってバグが起きるわけでもないのですが、コードレビューとかで指摘されると思うので気付いて直せる範囲なら直しておきましょう。
それを直したら重大なバグを誘発してしまいそう…とかいう状況では無理に直すという判断をしなくても仕方ない場面もあるとは思います。
横に長くしすぎない
例えばif文において条件を10個も20個も横に並べてスクロールしなければ条件を全て把握することができない、このコードはかなり見づらいので改行で数段に切り分けるか、そもそも条件を見直してもっと文字書く書くようにする工夫が必要です。
こんな実例は実際の業務ではないのですが一応以下に書いておきますね。
echo “変数の値は1から5の間です”;
}
ここでは5までにしましたがこれを100まで書いたとんでもなく横に長いコードとしましょう。
条件文を改行するのはあまり好きではないので、そもそもの条件を見直すと。
echo “変数の値は1から5の間です”;
}
この書き方が正解でもないですし、他にもいろいろな書き方がありますが最初よりはスッキリしましたよね。
条件が長くなりすぎる時はうまく考えると条件をシンプルにかけると思います。
ネストを避ける
ネストとは入れ子のことです。ちょうど上記の例で行くとネストが一つ深くなる書き方は以下の通り。
if ($val <= 5) {
echo “変数の値は1から5の間です”;
}
}
ネストが深くなればなるほど読みづらく理解しづらくなります。
ネストせずに一階層で済むように工夫する癖をつけてくと良いと思います。
コメントの入れ方
正直私も適切なコメントとは何ぞやをまだ完璧に理解しているとは言えないのですが、
- コメントを入れておくと後で読んだ時に理解しやすいのあれば書いておく
- わかりきったことまでいちいち全部コメントを書かない
くらいが基本なのかなと思います。
こんなコードはNG
読みやすいコードの逆をいけば完成です。
個人的には縦に異様に長い、もしくは1文が横に異様に長いなどとにかく無駄に広がっているケースのコードは読みづらいなと感じます。
かといってなんでもかんでも超最小単位で区切ってあっちこっちいくのも好きじゃないので難しいんですけどね。
読みやすい・読みづらいには個々人の主観に関わる部分もあります。
プログラミングのご法度
プログラミングでやってはいけないことの一つとしてマジックナンバーというものがあります。
簡単に言うとコードの中に突然出てくる謎の数字です、例えば以下のコード。
echo “処理が成功しました”;
}
1って何だ、その後の出力的には成功が1って意味なのか?と疑問を抱きコードを読むだけはわからず仕様書を引っ張り出してきて該当箇所を確認しなければよくわからない。こういう謎の数字がマジックナンバーです。
回避するには数字を定数にして意味を持たせる方法が一つあるかと思います、以下のような形。
STATUS_ERROR = 2;
if ($status == STATUS_COMPLETE) {
echo “処理が成功しました”;
}
これで謎の数字1は成功時のステータスコードであることが理解しやすくなります。
自動インデント可能なテキストエディタ
話が大分インデントからそれてしまいましたが、改行するたびにいちいちインデントに半角スペースを手で打っていたんじゃしんどいですよね。
テキストエディタの中には自動的にインデントに対応してくれるものがあるので、利用してみるとコードを書く速度を早められると思います。
主なエディタとしては
- TeraPad
- Sublime Text
- Atom
このあたりですかね、TeraPadの場合は表示→オプション→基本からオートインデントにチェックする必要があります。