プログラミングの学習をしているけどコードを少し書いただけでエラーがすぐに発生してしまうと感じる方も多いですよね。
特に最初の頃は、本や動画講座のコードを写しているだけなのにすぐにエラーが出てしまって「なんで動かないんだろう」と時間を費やしてしまうものです。
その原因は明確でバグの起きやすいコードを書いてしまっているからです。
しかし、急に「綺麗なプログラムを書け」と言われても一朝一夕でできるようになるものでもありません。現役のエンジニアでも「どうすればこのコードはもっと綺麗になるか?」と毎日頭を悩ましているでしょう。
その中でも、部分的にであれば今すぐ使える綺麗なコードを書くための方法があります。今回は、そんな初心者エンジニアの方に向けてエラーを出しにくい綺麗なコードを書く6つのポイントを紹介していきます。
for文 -> foreachに書き換える
for文をforeach文に変えることは良い手段です。理由としては、配列の要素数を最初から知らなくても実行できるためです。
具体例を見ていきましょう。
$array = [
'key' => 1,
'key2' => 2,
'key3' => 3,
];
$numOfElements = count($array); // 配列の要素数を取得
for ($i = 0; $i < $numOfElements; $i++) {
$value = $array[$i]['key']; // 1を取り出す
# code
}
$array = [
'key' => 1,
'key2' => 2,
'key3' => 3,
];
foreach ($array as $key => $value) {
$value // 1を取り出す
# code
}
これもどちらも同じ処理をしているのですが、for文でデータを取得しようと考えると
ということが、わかっていただけるかと思います。
特にWeb系であれば上記のような “key, value形式” と呼ばれるような配列を扱うことが一般的です。for文で書くと余計な処理が増え、可読性が下がってしまうのでforeach文を書くようにするといいですね。
else, else if文を書かない
if文のelse、else ifを書かないとコードが綺麗になります。
なぜ、elseやelse ifを書かなければコードが綺麗になるかというと、プログラムのネストが浅い状態でキープできるためです。
例を挙げてみましょう。
$param = 10;
if ($param > 5) {
echo "paramは5よりも大きい";
} else {
echo "paramは5以下である";
}
$param = 10;
if ($param > 5) {
echo "paramは5よりも大きい";
return;
}
echo "paramは5以下である";
上のコードと下のコードでは動作としては同じことをしていますが、カッコが少ないため下の方が読みやすいと感じるのではないでしょうか。
今はコード量が少ないので、あまり大きな変化は感じないかもしれませんが、実際のコードになると下記のようになります。
if (condition) {
# code...
} else {
# code...
if () {
foreach ($hoge as $fuga) {
# code
} else if (...) {
# code
} else {
#code
}
}
読みたくないと感じたのであれば正常です笑
このようなelseを書くことを許容してしまうと、ソースコードの読み通しが非常に悪くなります。できるだけ、else文は書かないようにしましょう。
三項演算子でスマートに実装する
三項演算子という書き方をご存知でしょうか。通常のif文と同じように三項演算子を書いてみると下記のようになります。
// 通常のif文
$param = 10;
if ($param > 5) {
echo "paramは5よりも大きい";
} else {
echo "paramは5以下である";
}
// 三項演算子
echo $param > 5 ? "paramは5よりも大きい" : "paramは5以下である";
5行必要としていた記述がわずか1行で書けてしまいましたね。
ちょっとしたif文を書くのであれば三項演算子を書いた方が読みやすく、書きやすいと言えるのではないでしょうか。
条件に合わないときは最初にreturnする
早期リターンとも言われますが、当てはまらない条件を始めにreturnしてしまうという少しレベルアップしたテクニックです。
具体的にコードを見ると
public function hogeFunction($param) {
if ($param === '') return;
# code
}
とこのように「処理を行いたくない条件の値」が来たときに最初にreturnしてしまって、後ろの処理を行わないという方法です。
このように実装することで、
- 予測しない条件の値を処理しないためバグが減る
- 処理の回数が減ることで速度改善が期待できる
- 後ろの条件分岐が減らせるため読みやすくなる
といったメリットがあります。実際の現場でもよく使われるテクニックなので覚えておくといいですね!
組み込みの関数を使う
車輪の再発明という言葉を聞いたことがあるでしょうか。
エンジニアとしてはあまり嬉しい言葉ではなく、「ライブラリなどで既に作られているものを自分で再度実装し直すこと」を指します。
このように自分で既にあるものを再度実装してはいけません。なぜなら、余計なコードを生み出したり、起こるはずでなかったバグが発生する可能性があるためです。
例えば、PHPには配列の先頭に要素を追加する array_unshift という関数があります。読む必要はありませんがこれをコードで書いてみると、
public function array_shift($array, $value) {
$newArray[] = $value;
foreach ($array as $element) {
$newArray[] = $element
}
return $newArray;
}
と7行余計なソースコードが増えることがわかります。このようなコードを自分で書いてしまう前に組み込みの関数(array_push, array_unshift)やライブラリが既に存在しないかをチェックしておくといいですね。
エンジニアとして自分の書くコードをいかに少なくするかを考えるのは腕の見せ所と言えます。
固定の文字列や数字を先頭でまとめる
特に初心者にありがちですが、固定の文字列や数字を使うハードコーディングはおすすめできません。
理由としては、柔軟性のないソースコードになってしまう可能性が非常に大きいためです。
例えば、下記のプログラム、statusが “approved” という固定の文字列のときに条件分岐の処理が行われるようになっています。
if ($status === 'approved') { ... }
しかし、”approved” というstatusがなくなるかもしれませんし、タイピングミスによってバグを引き起こす可能性もあります。他にも、statusを一括で変更したいと思ったときの修正も不便です。
このような特定の文字列にするのは賢くないため、ファイルやクラスの先頭でまとめておくのがいいでしょう。
$preparedStatus = [
'open' => 1,
'in review' => 2,
'approved' => 3,
'closed' => 4,
...
];
if ($status === $preparedStatus['approved']) { ... }
class化、関数化を意識する
ここで紹介する中で最も難しい項目ですが、自分の書いたコードをできるだけ関数化しておくといいでしょう。
関数とは、これまでに書いてきたような
public function hogeFunction() { ... }
のようなある意味を持つ塊のことです。
関数化をすることによって、「関心の分離」と言ってどの関数でどういった処理をするべきなのかを明確にしやすくなります。
おそらく経験が浅い方にとっては「ある意味を持つ塊ってなんやねん!」と思われると思いますが、こちらも具体的に解説していきましょう。
一番わかりやすい関数について
例えば、ブログ記事が投稿される処理について考えてみましょう。おおざっぱな処理の流れは下記のようになると思います。
(投稿される) -> タイトルを読み取る -> 本文を読み取る -> 記事を作成する -> 画面に出力する
この「タイトルを読み取る」といった処理が関数です。(厳密には違いますが理解のため)
つまり今回のケースで言えば
getTitle(), getBody(), createPost(), outputScreen()
といった関数が作られると考えることができます。
関数は適度に分けましょうと言われますが、僕の個人的な基準としては、
- 各メソッドは長くても50行、できれば30行以内
- ファイルの長さは800行以内、できれば500行以内
で考えて実装しています。最初におおまかな処理の流れを考えておくと関数を作るイメージがしやすいでしょう。
まとめ
ここまでの記事のポイントをまとめます。
- for文 -> foreachに書き換えよう
- if文のelse, else ifはできるだけ書かないようにする
- 早期returnを活用する
- 組み込みの関数を使う
- ハードコーディングを辞める
- 適切に関数やクラスをわける
綺麗なコードを書くのは現役のエンジニアでも四苦八苦しているので、必ずしもこれがいいというのは難しいです。
しかし、その中でも上記の6つのポイントは多くのエンジニアも無意識でやっているくらい基本的なポイントです。
他にも綺麗なコードを書く技術として「リーダブルコード」などは初心者でも読みやすくていい本なので読んでみるといいでしょう。