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

* contents [#u8fd8022]

#contents

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

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

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

#code(c,){{

void initColorTemplate()
{
  colorTemplate[0] = 0x00;
  colorTemplate[1] = 0xFF;
}

}}

上の例は,カラーテンプレート配列を初期化しています。
これを次のようにしてみるとどうでしょう。

#code(c,){{

const int COLORINDEX_BLACK = 0;
const int COLORINDEX_WHITE = 1;

void initColorTemplate()
{
  colorTemplate[COLORINDEX_BLACK] = 0x00;
  colorTemplate[COLORINDEX_WHITE] = 0xFF;
}
}}

こうすると,ものすごく読みやすくなったと思いませんか?
配列の添え字に関わらず,定数(上の例で言うと0x00や0xFF)なども
直接代入せず,名前のついた定数を用意してやると
もっと読みやすくなるかもしれませんね。
どの程度まで定数を用意するかは時と場合によるかもしれません。

ちなみに,私がよくやる方法は列挙型を用いる方法です。

#code(c,){{

enum ColorIndex
{
  ColorIndex_Black = 0 ,
  ColorIndex_White ,
  ColorIndex_Terminate ,
  ColorIndex_Begin = 0 ,
  ColorIndex_End = ColorIndex_Terminate
};

}}

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

* 技2:例外入力はアサート(主張)する [#v88a09c6]
これは会社に入ってから知った方法。
アサートの仕様は言語によって違うようですが
Cでは,条件が合わないようだったら,そこでプログラムが止まります。

#code(c,){{

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