どーも、エリ狐です。
エリ狐は社会人1年目よりIT企業でお仕事しておりまして、今は6年ほどIT業界にいます。
この6年間で「ひどいコード」をたくさん見てきました。もちろん自分が書いている時もありました。
そしてなぜ、そのコードがひどいのか、それを改善するにはどんな決まりや技法が使えるのかを考えた際に、全てを解決するたった1つの決まりごとに気づきました。
それは…
「コードは誰でも理解できるように書くべし」
ということです。
これがコードを書くうえで一番大切な決まりごとです。
今回はこの決まりごとについて、なぜそんなに大切なのか理由も交えてまとめていきます。
優れたコードとは?
多分、プログラマの多くは経験を基に直感で決めてると思うのー
例えば以下のコードのように、どちらも動作は全く同じな場合、皆さんはどちらを選びますか?
1 2 3 |
for (int i = 1; i < 10; i++) { System.out.println("i = " + i); } |
1 2 3 4 5 |
int i = 1; while ( i < 10 ){ System.out.println("i = " + i); i++; } |
上記の2つは同じ実行結果となるので、どちらも正解です。
したがって、プログラムには正解がなく、求めているアウトプットが正しいものであれば全て正解なのです。
while文はfor文から「初期化式」を外に出し、「ステップを進める式」を繰り返し実行される文に移したものである。
初期化式やステップを進める式が複雑である場合、while文を用いたほうが良い場合がある。
しかしながら、前提となる「知識」がなければあまり気にしない慣れている方を採用するでしょう。
■パターン1
1 2 3 4 5 |
if(hoge == 0){ a = "xxx"; }else{ a = "yyy"; } |
■パターン2
1 |
a = (hoge==0) ? "xxx" : "yyy"; |
これらを比較すると、パターン1の方がコードから実行を結果を読み取れる「安心」があります。
一方でパターン2は1行でまとめられているので、行数がなく「簡潔」です。
皆さんがコーディングする際には、どちらを採用しますか?
「安心」と「簡潔」のどちらを優先すべきでしょうか。
読みやすいコードの決まりごと
先ほどのコードは開発をする上でよく直面します。
長年コーディングをしていくと「読みやすさの定義」なるものに気づきました。
「コードは他の人が短い時間で理解できるように書くべし」
ということです。
「コードを理解する」ということは、単純にやってることが分かるだけではなく、変更を加えたり、バグを見つけたり、他のコードと連携するための方法を見つけたりすることを指します。
「理解するまでの時間」とはそのコードを自分で扱えるようになるまでかかる時間のことをいいます。
このコード使ってるのオレだけだしー
「昨日の自分は赤の他人」というように、自分で書いたプログラムはよく忘れるものです。
例えば、1週間前の昼ごはんに何食べた?とか、4日前の10時にツイートしていた文言なんて覚えていないことが多いですよね。
したがって、他人が短時間で理解できるプログラムを書くことは、コーディングを効率化させるためにも大切なことなのです。
また、自分が書いた「使い捨てな気持ちで書いたプログラム」が他のプロジェクトで再利用されることも大いにあります。
短いコードと長いコード
コードは短い方が良い!というわけではありません。
先ほどのIf文を例にします。
■パターン1
1 2 3 4 5 6 7 |
if(hoge == 0){ // 0の場合 a = "xxx"; }else{ // 0以外の場合 a = "yyy"; } |
■パターン2
1 |
a = (hoge==0) ? "xxx" : "yyy"; |
コメントをつけると「コードは長くなる」が、パターン1の方が理解しやすいでしょう。
このように、コメントをつけるとコードは長くなりますが、「理解するまでの時間」を短くする方が大切です。
まとめ
理解しやすいコードというのは、優れた設計や試験のやりやすさに繋がります。
「読みやすいコードの決まりごと」を最優先に意識しましょう。
ググってネットに転がっているコードを流用したがるエンジニアが多いですが、常に一歩下がって「このコードは分かりやすいか?」と自問自答してみることが大切です。