contents
はじめに
一歩進んだプログラマとは何かと言われると正直答えられません。
ですが,ここに記されていることを実行していくと
少なくとも一歩進んだプログラマになれると思います。
あいまいでごめんなさい。
また,ここに書いていくTipsは
あまり言語に依存しないようにするつもりです。
技1:マジックナンバーを使わない
未だに私もよくやってしまうこと。
マジックナンバーとは,コードの中で出てくる意味のわからない数字のことです。
1
2
3
4
5
6
|
-
|
|
!
| void initColorTemplate()
{
colorTemplate[0] = 0x00;
colorTemplate[1] = 0xFF;
}
|
上の例は,カラーテンプレート配列を初期化しています。
これを次のようにしてみるとどうでしょう。
1
2
3
4
5
6
7
8
|
-
|
|
!
| const int COLORINDEX_BLACK = 0;
const int COLORINDEX_WHITE = 1;
void initColorTemplate()
{
colorTemplate[COLORINDEX_BLACK] = 0x00;
colorTemplate[COLORINDEX_WHITE] = 0xFF;
}
|
こうすると,ものすごく読みやすくなったと思いませんか?
配列の添え字に関わらず,定数(上の例で言うと0x00や0xFF)なども
直接代入せず,名前のついた定数を用意してやると
もっと読みやすくなるかもしれませんね。
どの程度まで定数を用意するかは時と場合によるかもしれません。
ちなみに,私がよくやる方法は列挙型を用いる方法です。
1
2
3
4
5
6
7
8
9
|
-
|
|
|
|
|
!
| enum ColorIndex
{
ColorIndex_Black = 0 ,
ColorIndex_White ,
ColorIndex_Terminate ,
ColorIndex_Begin = 0 ,
ColorIndex_End = ColorIndex_Terminate
};
|
上はC++で記述した列挙型ColorIndexです。
こうすると,添え字の数字が重複するミスもへります。
技2:例外入力はアサート(主張)する
これは会社に入ってから知った方法。
アサートの仕様は言語によって違うようですが
Cでは,条件が合わないようだったら,そこでプログラムが止まります。
1
2
3
4
5
6
7
|
-
|
|
|
!
| bool isExistPlayer( int x , int y )
{
assert( x >= 0 && x < mapWidth() );
assert( y >= 0 && y < mapHeight() );
return numOfPlayer( x , y ) > 0;
}
|
上の関数isExistPlayerは,指定した座標xとyの位置に
プレイヤーが存在するかどうかを返す関数です。
ここで,xとyがマップの範囲内を示しているかどうかをassertでチェックしています。
もし,範囲外を示しているようでしたら,コードはここで止まります。
if文で範囲外のときは,即リターンするのも手ではありますが,
assertにすることによって,関数を呼び出すユーザー側に
バグを早期に知らすことができるので,
私はなるべくassertを使うようにしています。
ただし,ファイルのセーブを失敗した,など
『あり得る例外』はthrowやリターンなどで対処したほうがよいでしょう。
assertの利点として,
リリースモードでコンパイルすると
assertコードは全てないとして出力されることがあります。
ですので,実行速度を気にすることなく
assertはどんどん記述することができます。
上の例ですと,mapWidth()やmapHeight()関数を
呼び出すオーバーヘッドがものすごく大きくても
リリース時は無関係になります。
デバッグモード時の処理時間は我慢してでもアサートをする価値はあります。
早期バグ発見のために,assertを多用することをおすすめします。