コーディングスタイルは、好みの問題だという人がよくいます。
また一方で、それは品質に大きく影響するひとつの要素であることも否定できません。
すなわち、プログラマの好みがプログラムの品質に大きく影響し、何を好むかがプログラマの能力と直結するということです。
コーディングスタイルというと、まず、ヘッダやコメントの記述,字下げ,改行など可読性に関わることが非常に重要な要素として挙げられまが、ここでは、それとは別に、バグを作らないためのちょっとしたテクニックを紹介したいと思います。
定数と変数を比較するときに、
if ( x == 0 ) {
...
}
if ( x = 0 ) {
...
}
=
をひとつ書き忘れてもコンパイルエラーとはならず、実行時に何らかの不具合が発生するまでわからないことになります。
if ( 0 == x ) {
...
}
if ( 0 = x ) {
...
}
=
をひとつ書き忘れてしまった場合にはコンパイルエラーとなり、すぐにわかります。
if 文等を記載するときに、その配下のコードが単文の場合、
if ( 0 == x )
hoge();
{}
を省略する人がいます。hoge()
が複数の文からなるマクロだったりしたときは、意図通りのコードとならないことがあります。
if 文を記載するときに、
if ( 0 == x )
{
...
}
{
を if
とは別の行に記載するスタイルだと、
if ( 0 == x ) ;
{
...
}
;
を付けてしまってもコンパイルエラーとはならず、実行時に何らかの不具合が発生するまでわからないことになります。
if ( 0 == x ) {
...
}
{
を if
と同じ行に記載するスタイルにすると、余計な ;
を付けてしまうミスも起こりづらくなるでしょうし、
if ( 0 == x ) { ;
...
}
演算の順序を言語仕様の規定の順番に頼らず、( ) を使って明示的に記述することはバグの回避につながります。
※ このことは、Sun の Java のコーディング規約でも推奨する慣習として明記されています。
Cの場合、変数は関数の最初に宣言しなけらばならないので、大きな関数になってしまった場合、変数の管理が大変です。
ところが、実はこれは「関数の先頭」ではなく「ブロックの先頭」なのです。
そこで、大きな関数は、{ } でいくつかのブロックに区切って、局所的にしか使わない変数は、そのブロック内で宣言すればソースが見やすくなります。
以下は、ひとつの関数の中に局所的なブロックを作った例ですが、ここで、i
の使い方間違いではありません。
i
は、ブロック内とブロック外で別物となります。
void func()
{
int i;
i = sqrt(144);
{
int i;
for ( i=0; i<10; i++ ) {
...
}
}
fprintf(stderr, "sqrt(144) = %d\n", i);
}
#define MAX 10
const int MAX = 10;