2009年8月31日月曜日

定数化の重要性を訴えてみる

「ゲームのプログラミングの上で、知っていると非常に楽になれる」初心者向けの記事です。

例えば、以下のようなコードがあったとします。
(関数Data CreateData(string name)は、引数nameを参照し、そのデータから別のデータを生成してそれを戻り値として返す関数とします)
---------------------------------------
void Main()
{
Data dat1 = null;
Data dat2 = null;
Data dat3 = null;
dat1 = CreateData("hoge.txt");
dat2 = CreateData("hoge.txt");
dat3 = CreateData("hoge.txt");
}
---------------------------------------

(まあ、こんなコードを実際に使う例はないと思いますが…w
ここで、CreateData()の引数となっているhoge.txtの名前が「hoge2.txt」になったとします。このとき、上記の方法だと、hoge.txtとなっている部分全てをhoge2.txtに置き換える、すなわち3回の置換の必要が出てくるわけです。
しかしながら、以下のようにソースコードを書き変えると…

---------------------------------------
void Main()
{
const string data_path = "hoge.txt"

Data dat1 = null;
Data dat2 = null;
Data dat3 = null;
dat1 = CreateData(data_path);
dat2 = CreateData(data_path);
dat3 = CreateData(data_path);
}
---------------------------------------
元となっている定数「data_path」の値を書き変える、すなわち1回の置換だけで、1つ目のソースコードと同様の置換ができるわけです。

マジックナンバーは、いつどのように変わるか予測できないものです。たとえば、仕様変更で画面の大きさを640*480から800*600にしたとき、それに関わる全ての数値を全て置換するには膨大な労力がかかるでしょう。ですが、定数方式をとっていれば、この面倒な置換処理などとは別れられるわけです。

この通り、非常に便利な定数化。使わない手はないでしょう。

---------------------------------------
9/1 AM1:06追記。2つ目のソースのCreateData()の引数が文字列そのままになってました。正しくは「""」を抜いた状態です。(修正済み)
指摘してくださったsle様、ありがとうございましたm(_ _)m

2 件のコメント:

匿名 さんのコメント...

細かいことなんだけど、このままだとdata_pathを読みに行く。

Moneto さんのコメント...

>sle様
ご指摘ありがとうございますm(_ _)m確かに、あのままだとソースコードがおかしいことに…orz

ということで、記事を一部修正しました。