* 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を多用することをおすすめします。 |