kamogawaの日記: ハンガリアン記法 6
今日は仕事の納期だった。今回の客先はソフトの開発手法を
研究してるところだけあって、関数仕様までばっちり決めて
くれてたので、こっちはコーディングと単体テストだけすれば
良く、大変楽に仕事させていただいた。またよろしく!
良くできた客先で助かったんですが、一点だけ、もらった
コーディング規約によると、ソースはハンガリアン記法で
変数を名前付けしないといけないというのはがっくり来た。
で、昨日とか進捗報告と一緒にソースも送ったら、「変数に
プレフィックス付いてないよ」とちゃんとつっこまれてしまった。
(でもソースを査読してくれるのは本当にありがたい。普通の
客先はそんなとこまで見ないから、逆にそういうところは
突っ込まれないんだけどね。)「あとで置換しますんで」
って言っといた。
個人的にハンガリアン記法は大きらいだ。まず見にくい。
そして書きにくい。さらに変数の型を変えると、変数を使用して
るところを全部変えないといういらん作業も発生する。
俺のモットーたる「スムーズ&ラック(楽)」にことごとく反してる。
だから「うちの会社にはハンガリアン大好きッ子が多いけど、
世間的にはハンガリアン記法なんてもう死に絶えてるんだろうなー」
などと根拠なく思い込んでたんですが、なかなかどうしてgoogle君に聞いて
みると、結構好きな人はいるんですなー。(スラドでも)
でもさ、変数名見ただけで型が分かるから便利ってのは本当か?
俺全然便利じゃないよ。
unsigned long* size;
を
unsigned long* lpulSize;
って書いて何がうれしいんだ?変数長2倍になってるし、lpul
って何か違う意味含んでるんじゃねえのって気になるし。
とはいえ、変数名見ただけで型が分かると、うれしいこともある
とは思うんだよ。俺も bool 型 なら先頭に大抵 b_ ってつけてるし。
でもいつもじゃないんだよね。いらんノイズになって、ソースの
見通しが悪くなることの方が多いから。でもコーディング規約で
ハンガリアン記法を強制すると、ケースバイケースで使い分けができなく
なって、どうしても見づらいソースになっちゃう。メンバーで
記法を統一するには形式的なこともしょうがないとは思うけどさ、
ハンガリアン記法はよくないと思う。一見使うための根拠はもっとも
らしいけど(だからこそ広く使われちゃってるんだけど)メリット少なくて、
作業量増えて、メンテ性は下がるよ。それに、経験から言うと、
作業効率が下がるとメンバーの士気も下がるんだよ。
そうですねえ。 (スコア:0)
Smalltalk 系、LISP系、un*x系 C/C++、Mac 系 C ではどれもスタイルが異なりますよね。
(私は Old Mac で MPW を使っているので Objective-C スタイルはよく知らない。)
Win 系に慣れた人でのチームであれば、問題ないでしょう。
特に VC++ では MFC との整合性が取りやすくて便利ですし。
どれも文化に合わせた適材適所ですし。
あとは当人のこだわり次第ですか。
Re:そうですねえ。 (スコア:1)
確かに俺も「ハンガリアン記法をなぜ嫌いか」って聞かれると、
「センス悪いから」としか言えないですね。きっと。
いやー、でも他人の書いたハンガリアン記法のソースを
メンテしてきた経験から言うと、メンテナンス性の低下は確実に
あると思うんですよ。原因はいろいろあるんだけど、大きいのは
変数の型を変えると変数名まで変えないといけないという点。
他人が書いたソースで
lLength
っていう変数があったからって、これが本当に long型とは限ら
ないんですよね。なんか原因があって型を変えたり、他のソースから
コピペして型だけ変えるような場合、変数名は付け替えられてない
ソースもたまにはあるんですよ。
もちろんそれは「ソースを書いた奴がハンガリアン記法を
ちゃんと守ってないのが悪い」とも言えるわけですけど、
少なくともハンガリアン記法でソースを書くと、使わない
より多くのコストがかかるというのも確かに言えると思う
んですよね。そしてそういうソースがある以上、可読性を
犠牲にしてまで得ようとした変数名から変数型が分かるという
利点はなくなって、逆に誤解を植えつけるという弊害が起こってしま
うわけです。俺が「ハンガリアン記法はセンスが悪い」と
思うのは、人間であるプログラマに完璧を求めて、過失を
許さないとこです。人間は間違うもんだし、処理能力も
大したことない。その前提を忘れてるようなところが、
センス悪いなと思うんですよ。
リファクタリングツールがあればこういう労力もかなり少なく
なるでしょうが、リファクタリングツールをハンガリアン記法
のために使うのはなんか逆な気がします。いや、根拠の無い
感想ですが。
Re:そうですねえ。 (スコア:1)
それに対する反論としては、コンパイラ側がチェック機能を充実させるなどの手段であって、それらの手段が「不足」している現状では、ハンガリアン記法を採用するにあたって、そのありかたを批判するのは、後ろ向きだと思っています。
Copyright (c) 2001-2014 Parsley, All rights reserved.
Re:そうですねえ。 (スコア:1)
なんかよくわかんないんですけど、変数名の付け方とコンパイラの
チェック機能はなんか関係があるんですか?俺が理解してるところでは
ハンガリアン記法っていうのは変数名の付け方のルールであって、
ハンガリアン記法に則れば、変数を宣言するときに例えば
unsigned long* a;
って名づけるより、
unsigned long* data_length;
って名づけるより、
unsigned long* lpulDataLength;
っていう感じに名づけるのがいいよ、というルールなんだと思ってます。
(感じにっていうかちゃんとルールがあるみたいですが。こんな風に [vector.co.jp])
で、どの名づけ方をしても、コンパイラから見れば、意味は変わりません。
(少なくともC/C++コンパイラにとっては。)だから変数の名づけ規則は、
ただ人間が読みやすいかどうかだけの問題なんではないでしょうか?
ハンガリアン記法を使ったときのメリットは、変数名見ただけで、変数の
型がわかるから、宣言箇所をいちいち見に行かなくていいから楽だよ、
ということだと思います。で、俺はソースをさらっと見るときは
いちいち変数の型をきっちり考えながら読んでるわけじゃないから、
余計なプリフィックスが付いてるとうっとおしいよ、って思ってます。
要は「どんなソースが読みやすいか(書きやすいか)」っていう考え方の
違いであって、コンパイラがチェックできる領域ではないのでは?
ああ、それともハンガリアン記法の変数名をコンパイラが認識して、
自動的に型が割り振られる言語があればよいという話でしょうか。
それはちょっと面白いかもしれません。
もしかして俺なんか基本的なところで勘違いしてます?
Re:そうですねえ。 (スコア:1)
わたしもいまいち意味を掴みかねてるんでアレですが、とりあえず思ったことを。
わたし的理解だと、 こんな感じ。
・・・いや後半がイマイチ言葉にならないんですが。
で、(わたしが思っている)ハンガリアン記法の利点は、「書き手がソースを理解/整理するのを助ける」ことなんじゃないかと。
「読み手が読みやすくなる」ってのは、ある意味オマケだと思ってます。
あと、変数の型を変更する際に変数名を変更しなきゃならないのは事実です。が、そのような煩雑な作業が発生する(発生させる)ことによって変更部分周辺の見直しを強制する意味もあるんじゃないかと。
型違いの代入とかオーバーフローとか発生するでしょうし。
#あと、そんな面倒な「作業」をしたくなかったら、きっちり設計しろ、ってのも :-p
まぁ、どんなにツール類が充実しても、最終的なバグ潰しが出来るのは人間だけですからねぇ。
キカイが出来るのは文法チェックまでですから。
Re:そうですねえ。 (スコア:1)
「煩雑な作業が発生することによって変更部分周辺の見直しを強制する」ということは
あるかもしれません。それによって、バグの発生が少なくなるかもしれません。
でも、そうであるとする論拠がないのなら、それは可能性に過ぎません。
「煩雑な作業が発生することによって書き間違いが起こり、新たなバグが発生する」
ということもあるかもしれません。
これも同じく可能性に過ぎません。確実なのは、「ハンガリアン記法を用いると、
煩雑な作業が発生する」ということだけです。
型違いのオーバーフローは、確かにやっかいなバグです。ハンガリアン記法を
用いることにより、このバグを減らせるのなら、大きな利点といえるでしょう。
でも、ハンガリアン記法を使うとオーバーフローを減らせる、という論拠も
別にないですよね。「なんとなく減らせるっぽい。変数名から型が分かるし」
というだけのことです。もしかしたら効果はあるかもしれません。
ちょっと卑怯かもしれませんが、数週間前、ハンガリアン記法を使っている
プログラミンググループが設計、実装した関数の中で、unsigned char型を
使うべきところにchar型を使っていたために、オーバフローエラーが起こって
結果がおかしくなる問題が発生しました。このバグが発見されたのは、
他人によるソースレビューの結果でした。
これには私の経験上、きっちり間違いなく設計することは不可能だと
考えていますので、同意できません。また、ある時点で最適な設計が、
外部からの要求により、変更されるのもよくあることです。だからこそ、
プログラムは理解しやすく、また変更しやすくないといけないと
思うのです。(こう考えるのは私がリファクタリング、テストファースト
プログラミングを大好きだからかもしれません)
---
命名規則の比較は、結局好き嫌いの問題でしかないのかもしれません。
私としては、シンプルな変数名のソースが読みやすいけど、ハンガリアン記法の
ソースが読みやすい人も結構いる。その違いは、作業してきた環境に
よるところが大きい、ということなんでしょう。