はじめまして。樋口です。
今のところ、C++/Java での自分の標準記法としては
g_* グローバル変数
s_* スタティック変数(ファイルスコープ変数、クラス変数)
m_* メンバ変数(オブジェクト変数)
なし メソッド引数
なし(wk*) 局所変数
p* ポインタ
となっています。
型は意識しないが、スコープだけは常に意識するという感じでしょうか。
「接尾辞に "_" だけをつける」というのは、
どうも目にやさしくない(これでも視力は1.5を保っているのですが...)のと、
「スコープ解決は頭からするべき」という持論のため、
あまり気に入ってません。
「this を使えば間違いなし」という話もありますが、
ちょっと冗長すぎるように感じています。
また、所によって this を使わずに書けてしまうと、
そういうコードを書いてしまいがちで、
そのコードに後からメンバ変数と同じ名前の変数が付け加えられた時に、
わかりにくいトラブルを引き起こしがちです。
(もちろん、テストを行えばすぐに見つけられるはずのものですが...)
型による名前付けは昔やってましたが今はやめてしまいました。
以前は MS のように nFoo や szBar なんて書いていたのですが、
やはりそんなに効果的ではないと感じて止めています。
型による名前付けは、あまり理解せずに使うと、
szName で「名前の文字列」を示し、nName で「名前の長さ」を示す
ように、型だけではなく、意味まで含めてしまうようなことをしがちで、
やっぱりよくないと思っています。
唯一の利点は、わざわざ宣言を見なくても
コードの一部を見ただけでおおよその型がわかることでしょうか。
例外的に p (ポインタ) は使うようにしています。
*pFoo, **ppFoo とか書くと、やっぱり気持ちいいので。
これは、一種の演算子みたいなもんですね。
しかし foo pFoo ppFoo なんてのが同時に出てくると、混同しやすくて、
やっぱりまずいのかなぁとか思ったりします。
とりあえず、コンパイラで「型が違う」とエラーを出してくれるので、
動き始めてから問題を起こすことはないのですが。
スコープによる名前付けのあたりは、
実はいまだに迷っていて気持ちよく定義できていないところです。
変数を誰が所持しているかは
コードの一部を読んだだけでわかるようにしておいた方がよい
と感じています。
また、
「そもそも、変数ごとに意味が異なるはずだから、
名前も変わるので衝突するはずがない」
のですが、データを作り出したりset/getしたりするときには、
どうしても似たような名前を使いたいわけで、
そこで衝突を起こしやすいというのもあります。
メソッド引数と、局所変数を分けるべきなのかは結構悩ましいところです。
メソッド引数自体も局所変数の一部ではないかとも思えるところですし、
一方で、メソッド引数の値を直接いじるのはよくないという話もあり、
名前を分けた方が常に意識できるのではないかと思うこともあります。
メソッドの引数をコピーして局所変数に渡して変更する場合は
局所変数に wk* なんてつけてますが、
ちょっとかっこ悪いかなぁと感じています。
適当なメタファが思いつかないのが悪いんでしょうかね?
とりあえず、このあたりの話って宗教戦争になりがちなので、
使いやすいと己が信じる道を進むのが正解でしょうね。
そんなことに時間を費やすのは人生の無駄ですし。
もちろん、チームに入ったら、
そのチームのコーディングルールに従うのは当然ですね。
あまりに納得がいかないものであれば、
変更要求することはかまわないと思いますけど。
// 樋口 勝也
// bugbear@....nu