contents Edit

はじめに Edit

一歩進んだプログラマとは何かと言われると正直答えられません。
ですが,ここに記されていることを実行していくと
少なくとも一歩進んだプログラマになれると思います。
あいまいでごめんなさい。

また,ここに書いていくTipsは
あまり言語に依存しないようにするつもりです。

技1:マジックナンバーを使わない Edit

未だに私もよくやってしまうこと。
マジックナンバーとは,コードの中で出てくる意味のわからない数字のことです。

すべてを展開すべてを収束
  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
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 
 
 
 
 
 
 
 
-
|
|
|
|
|
|
|
!
 
 
 
 
 
#spanend
#spanadd
 
#spanend
#spanadd
enum ColorIndex
#spanend
#spanadd
{
#spanend
  ColorIndex_Black = 0 ,
  ColorIndex_White ,
  ColorIndex_Terminate ,
  ColorIndex_Begin = 0 ,
  ColorIndex_End = ColorIndex_Terminate
#spanadd
};
#spanend
#spanadd
 
#spanend
#spanadd

上はC++で記述した列挙型ColorIndexです。

こうすると,添え字の数字が重複するミスもへります。

技2:例外入力はアサート(主張)する Edit


これは会社に入ってから知った方法。

アサートの仕様は言語によって違うようですが

Cでは,条件が合わないようだったら,そこでプログラムが止まります。
すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 
 
 
 
 
 
 
 
-
|
|
|
|
|
!
 
 
 
 
 
#spanend
#spanadd
 
#spanend
#spanadd
bool isExistPlayer( int x , int y )
#spanend
#spanadd
{
#spanend
  assert( x >= 0 && x < mapWidth() );
  assert( y >= 0 && y < mapHeight() );
  return numOfPlayer( x , y ) > 0;
#spanadd
}
#spanend
#spanadd
 
#spanend
#spanadd

上の関数isExistPlayerは,指定した座標xとyの位置に

プレイヤーが存在するかどうかを返す関数です。

ここで,xとyがマップの範囲内を示しているかどうかをassertでチェックしています。

もし,範囲外を示しているようでしたら,コードはここで止まります。

if文で範囲外のときは,即リターンするのも手ではありますが,

assertにすることによって,関数を呼び出すユーザー側に

バグを早期に知らすことができるので,

私はなるべくassertを使うようにしています。

ただし,ファイルのセーブを失敗した,など

『あり得る例外』はthrowやリターンなどで対処したほうがよいでしょう。

assertの利点として,

リリースモードでコンパイルすると

assertコードは全てないとして出力されることがあります。

ですので,実行速度を気にすることなく

assertはどんどん記述することができます。

上の例ですと,mapWidth()やmapHeight()関数を

呼び出すオーバーヘッドがものすごく大きくても

リリース時は無関係になります。

デバッグモード時の処理時間は我慢してでもアサートをする価値はあります。

早期バグ発見のために,assertを多用することをおすすめします。

    ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS