Part 10.メモリレイアウト(3)


しかし、第三者からしてみれば、UCS2 moji[32]の先頭の2バイトが文字列長を表していて、格納できる文字列の最大長は31文字だなんて想像がつくだろうか?


出来ることならそういう特殊なルールを定めるべきではないし、特殊なルールを定めたならばそれを可能な限りコメントとして残しておくほうがもちろん好ましい。


「コメントがなくともプログラムを読めばわかる」と言う人がいる。しかし、それはそのデータが用いられて初めて推測がつくだけであって、UCS2 moji[32]と書いてあるだけで「この先頭の2バイトが文字列長なのだ」などと思う人などいないし、そんなことを思う人はむしろおかしい。


UCS2 moji[32]だけでは常識的に考えても、'\0'を終端文字列としている可能性は否めないだろう。あるいは、場合によっては終端文字列は用意されてなくて、余った領域すべてをzero fillする必要があるかも知れない。



デカルトが「我思う故に 我あり」と言ったが、自分のなかで“思う”だけで
その瞬間からそれは真実として実在することが可能となるのだ。

だから、プログラマは、そのような甘美な言葉の響きにいつまでも酔い痴れるべきではない。自分が“思う”だけで、それが実在してしまうという現実の恐ろしさを直視するべきである。


例えば、可能な限り自分の意図をソースコードとして表現しておく、というのは有効な手段である。今回の場合ならば、



byte buffer[64];
と書いてあるよりは、


ushort Length;
UCS2 StringBody[31];

と書いてあるほうが、意図が伝わりやすい。自分がコーディングする上でも、こうなっているほうが書きやすい。(誰が「Length」とタイプする代わりに、「(ushort)moji[0]」や、「(buffer[0] + ( (ushort)buffer[1]<<8))」などとタイプしたいだろう?)


そして、ソースコードとして表現できないことは、コメントに残すべきである。これがコメントを残すときの最低限のポリシーである。過剰なコメントは可読性を下げるが、ソースコードからだけでは読み取れないことは少なくともコメントとして残されるべきである。


また、やむを得ず、byte buffer[64];と書く必要があるなら(組み込み系でコンパイラの制約がある場合もあるだろうし、自作のスクリプト言語がtypedefを使えない場合もあるだろう)「先頭2バイトがlittle endian 16bitで文字列長を表現していて、残り62バイトは文字列本体、UCS2で格納され31文字分に相当。」とぐらいコメントを残すべきだ。


(つづく)