プログラムの教科書は関数の使い方を教えてくれますが、見やすいコードの書き方は教えてくれません。
しかし、プログラムは見やすさが非常に重要です。
後で修正を加えたい場合に、見直してわからないプログラムだと困ります。他にも、全体像が見やすくないとテストを入れる際に不便です。
そこで、今回は見やすいコードを書くための条件について、「リーダブルコード」を参考に説明していきたいと思います。
特に、初心者向けとして非常に簡単なものをピックアップして詳しく説明します。
名前
プログラム作成において、最も気を使うべきものは変数や関数の名前です。
アルゴリズムは初学者にはハードルが高いですが、命名であれば初心者でも取り組みやすい分野であり、知っていれば誰でも気を使うことが出来ます。
ここでは最も重要な基本規則についてのみ触れましょう。
わかるために必要な情報を入れる
サンプルコードだと、コードを書き写すためにイニシャル一文字の変数がよく使われますが、これは実際のコードではタブーです。
基本的に、その変数や関数が何を表しているのかをコメントなしに理解できるようにしましょう。
例えば、get()という関数やsizeという変数は情報が少なく挙動がわかりません。IndexGet()やmemory_sizeなどの名前にしてあげることで、ひと目で分かる関数や変数になり、周囲のコードを見る手間が省けます。
また、よくあるtmpも意味のない名前なので、極力避けたほうが良いです。数行しか使わないならありですが、基本的にforce_tmpなどの名前にしたほうが用途がわかりやすいです。
命名規則に迷った場合には、「型が想像できる名前」を意識するとユーザーが使いやすい名前にしやすいでしょう。
//駄目なコード
int p_i;
//良いコード
int particle_index;
適度な長さにする
わかり易い名前に仕様と意識しすぎると、変数が長くなりすぎる場合があります。
基本的に中身がわかるだけの長さがあれば良いですが、上手く短く表現したいのであればスコープを意識すると良いです。
狭いスコープで扱われる変数は誤解することが少ないので、短い名前で表してしまっても大丈夫です。
あとは、関数はキャメル文字(大文字と小文字の組み合わせ)、変数はスネーク(アンダーバーで単語を繋いだもの)だとぱっと見でわかりやすいです。
大文字派マクロは定数に使用するので、できるだけ他での仕様は控えましょう。
if (index < 10) {
//短いスコープなら変数が短くてもOK
int tmp = x_height;
x_height = y_height;
y_height = tmp;
}
//関数はキャメル文字
memberInitialize();
//変数はスネーク
int member_num = 10;
//マクロや定数は大文字
const float G = 9.81;
美しさ
プログラミングにおいて、美しいコードを書くことも重要です。
見た目をこだわることは気分を上げるだけではありません。全体像を一覧しやすくします。
変数や関数の命名にこだわるのは、その行を見ただけで処理を理解することが目的でした。しかしそれを1行ずつ確認していくには途方もない時間がかかります。
そこで、整列やコメント位置の調整により、コードのまとまりを一覧できるようにすることで、見やすいコードを作成します。
改行
似た内容は似た見た目にしたほうが見やすいです。そのため、適切に改行を行いましょう。
一行にまとめて書くよりも、行数が増えたほうが見やすい場合が多いです。
for文やif文の波括弧は行末においても次の行の頭においてもどちらでも大丈夫です。
//駄目なコード
for(int i = 0; i < 10; i++) { cout << "i" << endl; if(i==8) {continue;}}
//良いコード
for(int i = 0; i < 10; i++)
{
cout << "i" << endl;
if( i == 8 )
{
continue;
}
}
空白
空白を適切に入れることで整列したコードを書くことが出来ます。
整列は地味ですが、きれいに見えるだけでなく、問題が見つけやすいという特徴があります。
タブ文字を適切に入れて整列するようにしてください。
//駄目なコード
memset(position, 0, 5);
memset(velocity, 0, 5);
memset(force, 0, 5);
//見やすいコード
memset(position, 0, 5);
memset(velocity, 0, 5);
memset(force, 0, 5);
グループ分け
同じものは同じ場所に置くことで、コードが見やすくなります。
宣言などは直前に行うのが一般的ですが、微調整できる場合はまとめたほうが見やすいこともあります。
適度に同じものをまとめたほうが良い場合も多いです。
//駄目なコード
float block_position;
・
for(int i = 0; i < 10; i++){
}
・
・
float block_velocity;
float block_force;
//良いコード
float block_position;
float block_velocity;
float block_force;
・
・
・
for(int i = 0; i < 10; i++){
}
コメント
コメントは迷ったらつけましょう。コメントが有ることで若干コードが見にくくなるかもしれませんが、理解が早くなることは何よりも価値があります。
たくさんあるコメントよりももっと勝ちがあるのが、効果的な短いコメントです。
whyとwhat
コメントには様々な情報を乗せることが出来ます。
例えば、「なぜこのようなコードにしたのかの目的」「どのように動作するのか」などwhyとwhatを書くことが出来ます。
どちらが優れているということはありません。わかりやすいと思う方を載せましょう。
ただ、whyがあることでwhatが理解しやすくなることはありますが、whatからwhyを理解するのは少し大変です。
目的が見えにくいコードの場合は、whyも書いてあげると親切です。
//クラスのメンバーを出席番号順に整列する
//任意の2つの物体に対して衝突検知する
駄目な変数や関数をコメントで補わない
変数名や関数名がわかりにくい場合は、コメントで応急処置をせずに根本から直しましょう。
コメントは非常に便利ですが、万能ではありません。見にくいコードをコメントでツギハギすると取り返しのつかない見にくいコードが出来ます。
変数名や関数名の重要性は述べましたが、コメントとこれらを合わせることでわかりやすいコードを作りましょう。
//駄目なコード
//ブロックのx方向位置
int b_x;
//ブロックの衝突
bCol(b_x);
//良いコード
int block_pos_x;
//ブロック同士の法線方向力による衝突
blockCollide(block_pos_x);
ファイルや関数名には全体像を書く
関数やファイルの動作がひと目でわかれば、詳細を見る必要がなくなります。
そのため、ファイルや関数には意図を書くようにしましょう。
ざっくりとしたルールとしては、ファイルや関数のように大きな塊に対しては作成の意図(why)を入れて、関数内の処理についてはどんな動作をしているか(what)を入れると良いです。
//Init.cpp
//解析パラメータ、幾何形状の初期化を行う
//ジオメトリを初期化する
//壁の形状と剛体形状を読み込んで配列に格納する
geoInit(wall_position);
スコープと制御フロー
変数のスコープは狭くする、制御のネストは少なくする、が見やすいコードのルールです。
変数のスコープが広いとどこで宣言した変数か探すのが大変ですし、ネストが深すぎるとフローを読むのが大変です。
必要なものは使うところでまとめることを意識しましょう。
//駄目なコード
int c;
if( i < 10 )
{
c = 10;
cout << c;
}
//良いコード
if( i < 10 )
{
int c = 10;
cout << c;
}
おわりに
今回は見やすいコードの書き方について説明しました。
プログラミングにおいて、動作することが最重要であるため、きれいに書くことは見逃されがちです。
ただ、きれいに書くことは速く書くことと両立できます。見やすいコードは修正もし易いからです。
プログラムが一発で動作することは稀です。そのため、修正の時間も考えて、丁寧に見やすいコードを作っていきましょう。
参考:リーダブルコード