今回は私が思う読みやすいコードについて書いていきます。
仕事をしていて他人のコードを読む機会が多く、その中でこのコード読みやすい!このコード読みにくいって思ったものを紹介できたらなと思います。
#私が思う読みやすいコードとは!
読む人の脳のキャッシュに残さないコードです!ヽ(^o^)丿脳のキャッシュとは何でしょうか?以下の例をみてください。
public void main(String[] args) {
String a = "";
~処理A
~処理B
for (String b : args) {
~処理C
}
}
このような処理があります。この処理では、処理A、B、Cのなかで、変数aがどのように変わっていくかずっと気にしないといけません。つまり、ずっと脳内に残さないといけないのです。これが脳のキャッシュです。正直、たった一つの変数の値を気にしないといけないくらいでは、大丈夫です。ただ、これが2つ、3つとだんだん増えていくとより考えることが増えていきます。そしたら、コードを読むのがだんだん難しくなっていくのが簡単に想像できるでしょう。
こういったことを防ぐために、気にしてほしい例が何個かありますので紹介していきます!
#ひとつめ!
public String example1( ) {
if (条件1) {
処理A
return ~;
} else {
処理B
return ~;
}
}
この例では、条件1がtrueになったときに、処理Aを実施して、そして、なにか戻り値を返します。条件1がfalseの場合、処理Bを実施して何かを返します。
このコードの読みにくいところは、elseになってる点です。条件1がtrueになった場合、何かをreturnします。つまり、条件1がtrueになると関数が終了します。必ず終了するのに、elseにしてしまうと処理Aの処理がそれ以降の処理に影響するのではないのかというキャッシュを脳に残さないといけません。処理A、処理Bが長ければ長いほど理解が難しくなります。なので、こうするとベストです!
public String example1( ) {
if (条件1) {
処理A
return ~;
}
処理B
return ~;
}
このようにすると、条件1に一致するときには関数の処理が終了すると分かりやすくなります。処理Bをするときに、処理Aの内容を気にしなくてよくなります。なので、このやり方がベストです!
#ふたつめ!
正直、一つ目とほぼ同じですがcontinueとbreakの使い方です。
public String example2( ) {
for (~) {
if (条件1) {
処理A
continue or break;
} else {
処理B
return ~;
}
}
このようなコードをたまにみます!これもelseがいりません!処理Bをするときに、処理Aの内容を全く考えなくてもよいようにすべきです。
#みっつめ!
変更不可の修飾子をつける。Javaの場合、final。
この修飾子を使用すると一度定義された変数の値は変更することができなくなります。なので、コードを解読するときにあの変数の値はなにやったっけな?とか考えなくても良くなります。変数を使い回して、ある時点の値が何か理解するために、ロジックを追わないといけないなんて非効率極まりないので使用できるところは使用しましょう!
#よっつめ!
できるだけ、変数のスコープの範囲を小さくする。言い方を変えると、変数を使い捨てにすると言うことです。
スコープを小さくすることによって、値の変化を考えないといけない範囲が少なくなります。例えば以下のような感じです。
String a = "";
String b = "";
if (条件1) {
処理A
}
if (条件2) {
処理B
}
このような処理の場合、変数a, bは処理A、処理Bともに影響を受け、値の変化を気にしないといけません。
もし、この処理では、変数aは処理Aでしか利用しない。変数bは処理Bでしか利用しない。だったらどうでしょう?このソースなら処理A、処理Bともに読まないとこの事実が分かりません。
では、以下の例ではどうでしょう?
if (条件1) {
String a = "";
処理A
}
if (条件2) {
String b = "";
処理B
}
このように、ブロックスコープを利用すると、変数aは処理Aでしか利用しない。変数bは処理Bでしか利用しない。という事実が見てすぐ理解できます。ブロックスコープを利用できないようなパターンもあると思いますが、利用できるときはどんどん使用しましょう!
私がコードを読みやすくするために考えていることは以上です。
賛否両論あると思いますが、皆さんが良いと思うコードを書けるよう努力していきたいと思います。