ここ20年で大幅に変わったのがプログラミング言語の記述方法だ。
Microsoft系だとMS-DOSの時代はC言語とアセンブラが基本だった。
Windows3.1や95の時代になるとC言語とアセンブラで記述されるとはほぼ無くなり、C++が基本となった。ただWindwosの機能をフルで使おうとすると、WindowsAPIが理解は必須なのでC言語の理解も必要だ。Visual Basicなんかもよく使われたが、WindowsAPIを呼び出すにはC言語の理解は必須だった。古のEXCELマクロなんかを使用している企業は、未だに理解が必要だろう。
WindowsXP位の時代になると高速性や省メモリーを目的としない限りC++で記述されることは少なくなり、.NET Frameworkが普及してC#で記述されることが多くなってきた。
何が違うかと言うと生産性の問題だ。今でもC言語とアセンブラで64Bit版のプログラムは作れるが非常に面倒だ。もちろんその方が高速だしメモリーも少なく済む。ただ現在はCPUも高速になったので高速化を考える必要もあまり無くなってきたし、メモリー管理とか少々適当でも問題ない。今時だと適当にメモリー確保して、不要になったらガベージコレクターにお任せで問題ないだろう。足りなければメモリーを増やした方が手っ取り早い。
CかC++でWinMain関数から記述するとか、そんなことは一部を除いてもう必要ないだろう。
メッセージポンプを自前で処理するなんて、今となってはやりたくもない。
例えば画面上のボタンをマウスで右クリックをすると
WM_LBUTTONDOWN 右クリックが押された
WM_LBUTTONUP 右クリックが離れた
というメッセージがWindowsからアプリケーションへ送られるのだが、じゃあそれからどうする?ってのをいちいち全部プログラムしなくてはならない。もちろん沢山ボタンがあったら、そのボタンごとに処理が必要だ。ウインドウハンドル(HWND)というものも意識しなくてはいけない。
今はそれがフレームワークとして用意されていて、何かのイベントの度にOnClick()とかの関数に飛んでくるので、そこだけプログラムすれば良いのである。ウインドウハンドルとか知らなくて良いし、そもそも気にする必要も無い。
一応VC++には、Microsoft Foundation Class Library(MFC)というものが用意されていて、この辺を上手に隠蔽してくれたが、コードを書くのが楽なだけで、やっぱり理解は必須だった。
そんな面倒だったプログラムを多少でも効率良く記述できるよう、昔からマイクロソフトが推奨していたのがハンガリアン記法である。C#になってからは非推奨だ。WindowsXP以降の時期だろうか。
変数名やクラス名を特別な接頭語を付けて宣言しようというものである。
たとえばカウント用変数を宣言する場合は
int count; // 非推奨
int nCount; // 推奨
と整数であることを示す「n」を頭に追加するのだ。
まぁ、これくらいなら良いだろう。
ファイル名が格納されている文字列へのポインタだと
const char* filename; // 非推奨
LPCTSTR lpszFilename; // 推奨
と記述するのを推奨していた。
lpはロングポインターでszは文字型で終端は0で終わっていることを示す。
型宣言のLPCTSTRはMicrosoftオリジナルだ。ロングポインターを示すLPの文字が入っているし、次のCはconst、その次のTはANSI型もしくはワイド型文字列のどちらも使える、STRは文字列という意味だ。同じように文字列へのポインタは
PSTR,LPSTR,LPCSTR,LPWSTR,LPCWSTR,LPTSTR,LPCTSTR…
とかまぁ色々あるのだけど、とても違いが分かりやすいね!
嘘。いやー今でも全然分かりにくい。
ポインターですら分からないのにロングポインターって何だよ?って方も多いだろう。歴史的遺物で事実上同じ物だ。一応16ビットか32ビット(もしくは64ビット)の違いがあるのだが、あまり意識する必要は無い。
こんなルールを半ば強制されたので正直かなりの方が挫折してしまった感じだ。そのためVC++のプログラマーは、かなり重宝された。
Microsoftとしては「まぁエンジニアなら、こうしておけば簡単に理解できるよね?」という感じでWindowsAPIが用意されている。
もちろんハンガリアン記法を使用しないプログラムでも全然良いのだが、WindowsAPIを呼び出すときは引数がハンガリアン記法を推奨しているので、C言語やC++でプログラムするときはハンガリアン記法でないと可読性が悪い。
C#の世代になると、Microsoftもさすがにハンガリアン記法を非推奨とした。昔に比べるとWindowsAPIを直接呼び出すことも少なくなってきたからだろう。
今風の言語だと面倒なだけだ。今は省入力で変数の候補とかでてくるし、変なコードを書くと警告をしてくれる。昔はコンパイルしないと分からなかったし、統合環境が無い、もしくは弱いのが当たり前だったので、それなりに効果があったようにも思う。
良く言われるのが例えば整数型から文字列型に変更する場合、全ての変数を変更するのか?と聞かれるのだが、もちろんである。空気を吸うように当たり前の行為だった。全く疑問は発生しない。
一応、整数と文字列では使える関数が全く違うため、変更箇所が明確になる効果はあった。
文字列は今時だとUTF-8が標準なので、ANSI型、ワイド型も気にすることは無いし、C#だったらString型が理解できていれば大抵OKだ。StringBuilderとの違いがわかれば十分だろう。
そのため、どうしてもWindowsAPIを呼び出すときだけは、過去の例にならってハンガリアン記法を使用しているくらいだろう。
ハンガリアン記法を嫌う方の言うことは最もである。
ところがである。残念なことに、自分はもうハンガリアン記法から抜け出せない。
学生の頃からあたりまえに「ハンガリアン教」の入信を強制され、それ以外の信仰は許されなかった。企業で製作するアプリケーションのコーディング規約とやらも「ハンガリアン教」を強制されていた。万が一逸脱すると上司から説教されてしまい、場合によっては評価が下がってしまうのだ。
そういえば市販の参考書も「ハンガリアン記法」しかなかったな。。。それ以外は知らなかった。
今でも自分はC,C++はともかく、JavaとかPHPだとか最近だと趣味で覚えているPythonだとかも、気がつくとハンガリアン記法に準じた変数を使っている。分かっていても気持ちが悪いのだ。
ちょっと、最近仕事でExcelのマクロを触っているのだけど、いかんいかん!他の人も見ているのに気がつくとハンガリアン記法だ!
全く困ったものである。。。
コメント