Top > PG一般 > 一歩進んだプログラマになるための技

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
 
-
|
|
|
|
|
!
 
enum ColorIndex
{
  ColorIndex_Black = 0 ,
  ColorIndex_White ,
  ColorIndex_Terminate ,
  ColorIndex_Begin = 0 ,
  ColorIndex_End = ColorIndex_Terminate
};

上はC++で記述した列挙型ColorIndexです。
こうすると,添え字の数字が重複するミスもへります。

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

これは会社に入ってから知った方法。
アサートの仕様は言語によって違うようですが
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を多用することをおすすめします。


リロード   新規 下位ページ作成 編集 凍結 差分 添付 コピー 名前変更   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: Wed, 16 Aug 2006 00:53:16 JST (6457d)