間違ったコードは間違って見えるようにする - The Joel on Software Translation Project
後半に、ハンガリアン記法の本来の用途が解説されている。ずっと、変数名に型情報を表すのがハンガリアン記法だと思い込んでいました。というかどこ見てもそう書いてあるし。
確かにこれならまだ意味はあるなあ。
しかしOOP的には変数名を工夫して人力で判断するんではなく、意味の違う情報を持つものは違う型(クラス)にするべきなんだろうな。
struct row_type { int data_; explicit row_type(int data) : data_(data) {} //operator int() { return data_; } int get() { return data_; } }; struct column_type { int data_; explicit column_type(int data) : data_(data) {} //operator int() { return data_; } int get() { return data_; } }; int main() { column_type col(4); row_type row(3); /* 全部エラーになる row_type aaa(col); row = col; if(row == col) { } */ cout << "Column:" << col.get() << endl; cout << "Row:" << row.get() << endl; return 0; }
型そのものを別にしてやれば、意味的に違う変数同士の代入はコンパイラがエラーにしてくれるので、うっかり見逃してしまうこともなくなる。
最初はoperator int()
を用意していたのだけど、これを定義しちゃうとexplicit指定したコンストラクタも素通りしてしまうみたいなのでget関数を用意する羽目になり、値を取り出すのが面倒なことになってしまった。