省略してはいけないものもある | 悪態のプログラマ

悪態のプログラマ

とある職業プログラマの悪態を綴る。
入門書が書かないプログラミングのための知識、会社の研修が教えないシステム開発業界の裏話は、新人プログラマや、これからプログラマを目指す人たちへのメッセージでもある。

プログラミングでは、省略できるにしても、省略してはいけないものがある。

C言語の「const 修飾子」について考えてみよう。

職業としてのプログラミング 」さんにも書かれているように、関数のポインタ引数に const の指定が無ければ、「この関数は、受け取った引数の示す値を変更しますよ」と明示しているということである。同記事では、

 よくコメントで、INPUTのみでしか使いませんと書いてあるのもありますが、const指定の方が親切です。

と、柔らかい表現で結ばれている。しかし、私は「親切かどうか」といったレベルの話ではないように思う。

「const ポインタ」の引数には、「const でないポインタ」を渡すことは出来る。しかし、その逆はできないのである。つまり、その関数を使いたくても、渡したいデータを「const ポインタ」で持っている場合は使えないのだ。使いたければ、わざわざ貴重なメモリを消費して、別の領域にコピーしてから渡してやらなければならない。

たしかに、コメントに「INPUT のみ」と書いてあれば、内部で値が変更される心配はないということが分かる。それならば、呼び出し元で const ポインタを無理やりキャスト(const でないポインタに変換)することで、その関数を利用することは出来るだろう。

しかし、そのようなキャストはプログラミングの外道である。「const みたいな面倒なものをつけなくてもキャストすりゃ呼び出せるんだからいいだろう」などと考える人には、他人が使うような関数を作らせてはいけない。

もちろん、「const って何ですか?」とか「キャストはしないほうがいいんですか?」なんていうレベルは問題外である。


以前、あるプロジェクトで、大手企業(そのシステムの元請会社)の作った共通的ライブラリを使用させられたのだが、その関数群に、上記の問題があった。const 修飾子をつけるべきところに、全く付いていなかったのである。

大規模なプロジェクトだったので、このライブラリの利用者はかなり多かったはずである。皆、不本意ながらもキャストして呼び出していたのだろうか(※)?

こんなことで怒るのはおかしいと思われるかもしれないが、思い出しても腹が立つ。私の中で、ライブラリを作ったその有名な企業のイメージが下がったのは言うまでもない。




※私は、ただキャストして共通関数を呼び出すだけの関数(いわゆる「ラッパー」)を作って、せめて自分のサブプロジェクト内に無用なキャストが拡散しないようにしていたように思う。



C言語体当たり学習 徹底入門
前橋 和弥
技術評論社 (2001/05)
売り上げランキング: 101,577
おすすめ度の平均: 4.25
4 もどかしいけれど、身に着いてくる内容
4 無題
4 次につながる良書