本記事の目的
この記事を読んでプログラマ初心者の方が、少しでも良いコードを書けるようになることが目的です。
ソースコードを見やすくするために心がけておくこと
###良いコードとは
そもそも良いコードとは何でしょうか?良いコードとはここでは以下のことについて考えられているコードとなります。
- 読みやすい・・・インデントやコメントの量、変数名などが適切なコード
- 適切なコメント・・・whatではなくwhyや条件分岐などコードを書いた人にしかわからない場所にコメントがあり、無駄なコメントがない。
- 速い、見た目がよい・・・こちらは読みやすいとほぼ同じですね。
- 修正個所がすぐに分かる・・・コメントで //修正 //ここまで というやり方もありますが、こちらはプロジェクトに従うのが一般的だと思います。
- 機能の追加・削除が楽・・・オブジェクト指向で作られているとこういった点が楽になります。
なぜ良いコードでなければいけないのか
ソースの書き方は人によっていろいろ異なります。 実行結果は同じな処理をしていてもソースは全く違うということもあります。
何をやっているかわかりやすいきれいなソースもあれば、本人以外(まれに本人にも)解読不能な汚いソースもあります。 プログラムの実行結果さえちゃんとしていればソースの方は別にきれいでも汚くても構わないのではと思うかもしれませんが、他人と一緒につくったりする時はそうは行きません。
ただでさえ他人の書いたソースというのは読みにくいものなのでできる限り見やすいソースを心がけるべきです。
同じコードを複数書かない
同じコードを2度3度書くのは良いコードとは言えません。なぜなら似たようなコードが複数の箇所にあるようなソースコードは、保守性を著しく低下させてしまいます。仕様変更が入った際に、コピーした複数のコードに対して同じような修正を行わなければなりません。こういった共通部分は1つにまとめます。
分かりやすい変数名やメソッド名を付ける
例えば i や j ではそれが何を指しているのかが分かりません。適当でどうでもいい数字なら構わないかもしれませんが、なるべく避けるようにしましょう。例えば数を数える場合 i ではなく count 等を用いるといいでしょう。
メソッド名、クラス名の命名方法としてこちらを参考にしてみるのがいいと思います。
うまくメソッド名を付けるための参考情報
今さら聞けない、変数や関数の命名規則と、まず覚えるべき英単語200
インデントをしっかりとつける
基本中の基本ではありますが、インデントはしっかりとつけるようにしましょう。
int count 1;
if( count > 1){
Console.WriteLine("countは1より大きいです。");
}
else if(count <= 10)
{
counsole.WriteLine("countは10以下です");
}
else
{
counsole.WriteLine(count);
}
このくらいの長さならまだ大丈夫ですが長くなればなるほど読みにくくなってきます。ですのでしっかりとインデントするようにしましょう。
コメントの付けすぎはダメ!!
コードは機械に、コメントは人間に向けて書く考える人もいるかもしれません。
しかし、私たち人間はコードとコメント、つまりソースコード全体で意図を汲み取ることができます。
コードで意図を明瞭に表現する、関係のないものは取り除くなど コメント以外で表現する方法を考え、どうしてもコメントでしか表現できないものをコメントとして残す ようにする。そうすることで、ソースコードがとても読みやすいものになります。
不要なコードはコメントアウトで処理しない
使わなくなった関数やステップをコメントアウトしてとって置くことがあります。コメントアウトされたコードは、今のコードと関係のないものになっていることが多いです。そのため、コードの可読性が著しく損なわれます。
戻すことが当分ないと思ったら、思い切って削除してしまうことです。削除された事実はSubversionやGitなどのバージョン管理システムで残すことができます。
いざとなれば、バージョン管理システムから復元することもできます。ソースコードは「今」の状態を保つように心がけることが、読みやすいコードのカギです。
マジックナンバーは使わない
マジックナンバーとは
コード上で意味を持った数字のことをマジックナンバーと言います。
なぜ使ってはいけないのか
マジックナンバーは数字を直接書いてしまうと、どのような意味かわかりにくくなります。
int freeTrialExpire = 60 * 60 * 24 * 7 * 2;
このように書かれると何を行っているのかが分かりません。気の利いたプログラマなら
int freeTrialExpire = 60 * 60 * 24 * 7 * 2; // 期間は2週間
とコメントを残すかもしれません。
しかし、マジックナンバーは定数や変数として定義すると、コメントがいならないほどわかりやすくなります。
int SecOfWeek = 604800;
int freeTrialExpire = 2 * SecOfWeek;
ネストを深くしすぎない
ネストとは
ネストとは入れ子にすることです。
例えば
public int func1(int a, int b)
{
int result;
if (a > 10)
{
if (a > 20)
{
if (a > 30)
{
result = b;
}
else
{
result = 3;
}
}
else
result = 2;
}
else
result = 1;
return result;
}
こういうものです。
なぜネストが深くなるのか
ネストを深くする人は、弾けるケースを最初にはじいていない、スキップできる要素を最初にスキップしていない場合が多いです。
複雑な条件分岐がネストしてしまう場合は、わざわざ難しい方法や順序で分岐判定を行っていないかちょっと考えてみるべきだと思います。
どうすればいいのか(具体例あり)
先ほどのコードを利用すると
public int func1(int a, int b)
{
int result;
if (a > 10)
{
if (a > 20)
{
if (a > 30)
{
result = b;
}
else
{
result = 3;
}
}
else
result = 2;
}
else
result = 1;
return result;
}
このネストを浅くするには
public int func1(int a, int b)
{
if (a < 10){
return 1;
}
if (a < 20){
return 2;
}
if (a < 30){
return 3;
}
return b;
}
こういった処理で事足ります。
ただし、今回は入力チェックを行っているため、コードの初めでreturnをしていますが、コードの途中でreturnをすると後程説明するgoto文と同じになりますので注意が必要です。
制御の見通しが悪くなるようなgoto文を書かない(C#)
###なぜgoto文を書かないのか
goto文を使うとプログラムの流れが読みにくくなるからです。
for 文や if 文ならば、ここで始まって、ここで終わるというのがはっきり分かりますが、goto文はどこにでも行けてしまい(便利な反面)プログラムが読みにくくなります。
実際使用する必要のないことのほうがほとんどです。プログラムは上から下に処理が流れるように記述することで他の人が読みやすくなり、良いコードになります。
ですのでやむ負えない場合を除き制御の見通しが悪くなるようなgoto文は書かないようにしましょう。
##まとめ
- 変数名やメソッド名は分かりやすい名前を書く。
- コメントはできる限りわかりやすく、無駄なものは書かない。
- マジックナンバーは使わない。変数を利用する。
- ネストは深くしすぎない。深くても2つまで。
- インデントをしっかりつける。
- プログラムは上から下に処理が流れるように記述する。
以上を考えながらプログラムをしていくことで、他人が読みやすい「良いコード」が書けるプログラマを目指しましょう。