meryngii.neta

今日も新たな"ネタ"を求めて。

ストリーム関連の命名はあまりにひどい

C++の教科書で必ず最初に現れるcoutとか<<とかいう謎の物体。C++の入出力ライブラリはオーバーロードを駆使することで型安全を堅持している。これはStroustrup氏の自信作で、その内部はテンプレートによって汎用性の高い設計になっている。
しかし、ストリームに関するクラス・関数・変数の命名規則はかなり混沌としている。これは同じ標準ライブラリである後続のSTLなどと比べてみても、明らかにひどい。とてもお手本にすべきものではない。

  • 全て小文字を使う。
  • 単語間はアンダーバーなどを入れずにそのままつなげる。
  • たまに不規則に単語を1文字〜数文字に縮める。

例えばマニピュレータ。

resetiosflags
setiosflags
setbase
setfill
setprecision
setw

私が思うにこの理屈でいくとsetwはsetwidthとなるべきだろう。幅の指定はよく使われるから短くしようという配慮なのかもしれない。
ストリームバッファの関数名はさらにとんでもないことになっている。

eback()
gptr()
egptr()
pbase()
pptr()
epptr()

順に入力バッファの先頭・現在・終端、出力バッファの先頭・現在・終端のポインタを返す。これらはもう名前から動作を予測しろと言われても不可能に近い。
C++のストリームに関しては、C言語のprintfと比べられることが避けられなかったという特有の事情が存在する。printfは書式文字列のおかげでタイプ数がとても少なく済んでいる。C++でも負けじと簡略化しようとしてこういうことになったのかもしれない。
「名前なんてどうでもいい」と思う人もいるのだろうが、ソースの初見で最も頼りになるのは間違いなく名前だ。ハンガリアン記法を強制したりなどといった過剰な命名規則の意識は不必要だが、1分くらい立ち止まって名前を考える努力は必要だと思う。
命名規則はいろいろあるから、自分の環境に合わせて好きなものを使えばいい。私が考える最低限の命名規則は次の二つだ。

  • アンダーバーでもキャメルケースでも何でもいいから単語を区切る。
  • 一文字の名前は使わない。*1

混沌としたソースを見るたびにこのくらいには何とかしてほしいなあと思う。

*1:i, jなどの使いかたがはっきりしたものは使ってもいいと思う。