ハンガリー記法について

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
メッセージ
作成者
yu0627
記事: 154
登録日時: 2005年5月31日(火) 14:53

ハンガリー記法について

#1 投稿記事 by yu0627 »

こんばんは。yu0627です。
ActiveBasicオフィシャルユーザーズガイドでソースコードを見ていたときに
変数名の前に「lp」「lpsz」「dw」「fs」などの文字が付いているのに気が付きました。
そこで調べてみたところ、”ハンガリー記法”というものだということが分かりました。

b ブール値(1バイト)
c 文字(1バイト)
n short整数
l long整数
u long符号なし整数
w short符号なし整数(WORD)
dw long符号なし整数(DWORD)
p ポインタ
lp longポインタ
f 16ビットのビットフィールド(フラグ)
fn 関数
h ハンドル
pt スクリーン座標を持つlong整数
sz NULLで終わる文字列へのポインタ
lpsz NULLで終わる文字列へのlongポインタ
rgb RGBカラー値を持つlong整数

このようなのですが、やはり使うほうがいいのでしょうか。
色々なサイトを見ると肯定も否定もありました。
皆さんはハンガリー記法を使っているのでしょうか?それとも使っていないのでしょうか?
ちなみに僕は使っていませんが、使おうかなと思っております。
お答えお願いいたします。
淡幻星
記事: 183
登録日時: 2005年7月19日(火) 07:02
お住まい: 宮城県
連絡する:

Re: ハンガリー記法について

#2 投稿記事 by 淡幻星 »

> b ブール値(1バイト)
> c 文字(1バイト)
> n short整数
> l long整数
> u long符号なし整数
> w short符号なし整数(WORD)
> dw long符号なし整数(DWORD)
> p ポインタ
> lp longポインタ
> f 16ビットのビットフィールド(フラグ)
> fn 関数
> h ハンドル
> pt スクリーン座標を持つlong整数
> sz NULLで終わる文字列へのポインタ
> lpsz NULLで終わる文字列へのlongポインタ
> rgb RGBカラー値を持つlong整数
は~、こうなっているのか φ(. .)メモメモ<ハンガリー記法
勉強させていただきました(^^;)

> 皆さんはハンガリー記法を使っているのでしょうか?それとも使っていないのでしょうか?
私はn, p, lp ,f ,h などは使ってますが、他はあまり。
使ったり使わなかったりですね。気分次第。
ついでに、Long型にnを使ったり、などとごっちゃにしてたりもします(^^;)

だんだんと、どの変数がどの型か覚えておくのが面倒になってきまして、
自然と似非ハンガリー記法になってました。

他の方のコードを読んだり、見せたりなどの互換性を考えれば、
ハンガリー記法を覚えておいた方が便利ですし、使ったほうが良いかとおもいますが、
そこを気にしなければ、好きにして良いと思います。


・・・って書くと、詳しい方から「ちゃんと使え!」ってお叱りを受けそうですね(苦笑)。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

Re: ハンガリー記法について

#3 投稿記事 by イグトランス »

私の場合、関数内のローカル変数ではサボり気味になりますが基本的にABでは使っています。
p, hなどは欠かしません。
lpは使いません。Win32ではポインタの区別はないのでpに統一しています。
szはByte/Char配列の文字列、pszをBytePtrや*Charの文字列にしています。
ptは専らPOINTAPI型に使っています。
String型にはstrを使っています。
Int64/QWordにはll/qwにしています。
ブール値にはbだけでなくf(Flagの意)やisも使います。
HWNDはhwnd、HBITMAPはhbmpなどと固有の型を持つハンドルはそれを含めてハンガリアンとしています。

> ついでに、Long型にnを使ったり
私もやります。というよりも符号付き整数型全般を n にしています。
lやllなどを使う機会はあまりありません。
山本
Site Admin
記事: 535
登録日時: 2005年5月30日(月) 15:08
連絡する:

#4 投稿記事 by 山本 »

おぉ、実は私も気になっている話題です。


ハンガリー記法については、様々な意見があるようですが、現時点のコーディングレベル(言語仕様、ターゲットアプリの設計段階から見た)と照らし合わせると、あったほうが便利かな~と思います。

逆に、データ型うんぬんというより、データ構造そのものの最適化により、適切なネーミングでの表現が可能になったときに、ハンガリー記法というものが不要になるのでは!?と勝手に解釈しております(言ってみれば、理想論ですな)。


ABでもC/C++でも、私が好んで使うものとしましては、

・b ブール型
・w Word型
・dw DWord型
・i 整数型
・dbl Double型
・p ポインタ型(lpというのは、あまり好きじゃないです)
・h ハンドル型
・rgb RGBカラー
・obj オブジェクト
・C クラス
・I インターフェイス

あたりでしょうか…。コンパイラを作る身としては、ポインタ関連の相互関係には無くてはならない存在です。

あと、nに関しては、"整数型" としての意味も持ち合わせるようですので、必ずしも、short型(ABではInteger型)に限って使わなければならないということはないようです。


Windowsプログラミングの資料をあさると、lpなんたら、というのがよくでてきますが、Long Pointer略してlpはあまり好きではないです。しかし、Win64では当たり前のように利用され始めているLONG_PTR型。32ビットでも64ビットでもいける型として人気が高いみたいです。

ちなみに、DWORD64なんかは、率先して使いたくない型です。QWORDって、何で採用されなかったんだろ??DWORDと間違いやすいからかな…。


まぁ、型なんてのは、何通りもの書き方が用意されており、変数名にいたっては、プログラマーが好きに決めていいときているので、どの書き方が一番よいのかを、"よく考えた上で" 使えばいいんだと思います。考えていさえすれば、なんかあったときになんとかできます(複数人でやると、こうもいかない場合があるようですが…
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

Re: ハンガリー記法について

#5 投稿記事 by NoWest »

> 色々なサイトを見ると肯定も否定もありました。
> 皆さんはハンガリー記法を使っているのでしょうか?それとも使っていないのでしょうか?
> ちなみに僕は使っていませんが、使おうかなと思っております。
> お答えお願いいたします。

プログラミングの本を買うと結構、変数のネーミング法ってな項で
解説されていますよね。

私も以前から周りの人間はどうしているのか気になっておりました。


そう言ってる私はh(ハンドル) p(ポインタ)以外は基本的にハンガリー記法は使わない主義です。

変数は一箇所に定義するのではなく、その変数を使う直前に定義するように心がけていますし、グローバル変数等も極力使わない事にしています。
※可読性という意味で「まとめて変数を定義」には反対なんで。。。

何より現在のABは型違いを警告としてデバックメッセージ吐いてくれるので変数名に拘る事もそれほどないですし。
hanchan
記事: 12
登録日時: 2005年7月27日(水) 10:12

Re: ハンガリー記法について

#6 投稿記事 by hanchan »

> 皆さんはハンガリー記法を使っているのでしょうか?それとも使っていないのでしょうか?
> ちなみに僕は使っていませんが、使おうかなと思っております。
> お答えお願いいたします。
私は特にハンガリー記法に則って変数名を付けたりはしていないですね。
自分で解りやすいようにしています。
例えばStringならば「str~」とか、大体が型名の先頭三文字で付けています。

以下のサイトを見るとどうやら変数が全て同じ型で会った頃の名残のようです。
http://itpro.nikkeibp.co.jp/free/ITPro/ ... 0031002/1/

自分が解る範囲で付けるのがよいかと思います。
数人で共同開発する場合は統一して付けた方が良いと思いますが。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

Re: ハンガリー記法について

#7 投稿記事 by イグトランス »

> そう言ってる私はh(ハンドル) p(ポインタ)以外は基本的にハンガリー記法は使わない主義です。

私はABではまだそうしていません。
たとえば*Byteではpbがバイナリデータ(Byte配列へのポインタ)で、
pszなら文字列(\0終端)へのポインタという区別をつけています。
#C/C++なら前者はBYTE *で後者はchar */TCHAR *などと型が別になるのでで良いのですが
#ABの*Charにはまだ移行しきれていませんので。

> 変数は一箇所に定義するのではなく、その変数を使う直前に定義するように心がけていますし、グローバル変数等も極力使わない事にしています。
> ※可読性という意味で「まとめて変数を定義」には反対なんで。。。
これは概ね同意です。

> 何より現在のABは型違いを警告としてデバックメッセージ吐いてくれるので変数名に拘る事もそれほどないですし。
それはそうなのですが、ポインタ型間の変換には甘いのが残念です。
yu0627
記事: 154
登録日時: 2005年5月31日(火) 14:53

返信@yu0627

#8 投稿記事 by yu0627 »

皆さん、返信ありがとうございます。
変数は一箇所に定義するのではなく、その変数を使う直前に定義するように心がけていますし、グローバル変数等も極力使わない事にしています。
※可読性という意味で「まとめて変数を定義」には反対なんで。。。
僕の場合は変数の宣言は出来るだけ一箇所にまとめています。
その代わりしっかりと変数のコメントはしてありますが。
例えば こんなかんじです。自分では理解できていない変数についてはブラックボックス状態でコメントはつけていません^^;

僕の場合はハンドルは「h」をつけますが、あとはつけている所もつけていない所もあります。実際言いますと。
まぁ、型なんてのは、何通りもの書き方が用意されており、変数名にいたっては、プログラマーが好きに決めていいときているので、どの書き方が一番よいのかを、"よく考えた上で" 使えばいいんだと思います。考えていさえすれば、なんかあったときになんとかできます(複数人でやると、こうもいかない場合があるようですが…
「よく考えた上で」ですか...。

コンパイラを作るのって、かなり大変そうですね。機械語って0と1の羅列だそうですが。
最後に編集したユーザー yu0627 [ 2005年11月12日(土) 20:54 ], 累計 1 回
高信期

#9 投稿記事 by 高信期 »

マイクロソフトでは.NETになってからハンガリアン記法は非推奨になって、
パスカル形式、キャメル形式、大文字形式を併用しているそうです。

私自身はp, h, C, Iのみハンガリアン記法を使用しています。
あまりプレフィックスを多用すると返って見づらくなるので。
マティ
記事: 161
登録日時: 2005年8月23日(火) 00:15
お住まい: 沖縄県
連絡する:

#10 投稿記事 by マティ »

自分はBASICからはじめたので、以下の順位で変数の定義を行っています。

①基本的にループ関連の変数は、i,j,k・・・って感じで使用します。
(iから始まるのは、フォートランの変数で整数はi以降の文字で始まる規定あった為のようです)

②APIを使用する場合は、そのAPIの定義をそのまま使用します。
(内部で定義したクラスも含みます。)

③グローバル変数は一箇所で定義します。

④関数で使用する変数に関しては、その関数より上位の関数に影響を与えない限り、ローカル変数として宣言し、ベーシック風に定義します。
(APIを使用する場合は②で規定した通りAPIに準拠します。)※ただし関数は画面2面以内(50行以内)で記述します。

ある程度データタイプによる規則性を決め、ループ等の変数に関しては、iから始める等の柔軟性を持たせた方が、仕様変更に強いような気がします。
ただし、(数百万ステップの)大規模システムではどちらが良いか分かりません。

アセンブラで数百万ステップのプログラムでもAPI,クラス,構造体さえきちんと管理できれば、それ以外の変数名は大差ありませんでした。

唯一、利点があるとすると引継ぎかも知れませんが・・・
長い変数名でプログラムを作成すると変数を判断するのが結構難しくなります。
yu0627
記事: 154
登録日時: 2005年5月31日(火) 14:53

返信@yu0627

#11 投稿記事 by yu0627 »

マイクロソフトでは.NETになってからハンガリアン記法は非推奨になって、
パスカル形式、キャメル形式、大文字形式を併用しているそうです。
そうなんですか。
他のサイトで調べてみると、

・すべてがオブジェクトでそのオブジェクトごとに接頭字を付けようがない。
・基本型(整数、実数、文字列等)にだけ接頭字をつけるとしてもこの型名も言語ごとに異なる。

という訳でしょうか。
MicroSoftのVB/C++/Javaは.NETになってから使う気がなくなりました。
というより買うお金がないだけですが。.NET FrameWork(?)をインストールしなければならないし、エミュレーター上で動かしているようなのでABよりも実行速度が遅いかも...。そのあたりはどうなんでしょうか。
基本的にループ関連の変数は、i,j,k・・・って感じで使用します。
(iから始まるのは、フォートランの変数で整数はi以降の文字で始まる規定あった為のようです)
ループ関連の変数名がiやi2、j/kが多いのはそういうことだったんですね。φ(.. ) メモメモ
アセンブラで数百万ステップのプログラムでもAPI,クラス,構造体さえきちんと管理できれば、それ以外の変数名は大差ありませんでした。
アセンブラをされているんですか。あれってかなり大変だそうですね。C言語やBasicなどの高級言語よりも実行速度は速いそうですが。
Sinryow
記事: 141
登録日時: 2005年5月31日(火) 09:34
お住まい: 北海道
連絡する:

#12 投稿記事 by Sinryow »

自分も最近ハンガリアン記法を使用し始めています。
変数名を見るだけで型が分かるのは実際便利ではあるのですが,表記が面倒なので,何かガイドラインを設けなければ・・・と思っているところです。
※某所で配列に対するハンガリアン記法が「a」と書いてあったので使っているのですが,何となく見た目が悪いので・・・。

ちなみに自分は某所で
・「b」は1ビット
・「by」は1バイト
と書かれているのを読み,それ以降Byte型は「by」にしていますが,これも結構見た目が悪いので(爆)変えようかな・・・と思っています。

最近作っているプログラムについては,個人的なガイドラインとしては
●ローカル変数,関数の仮引数,クラスのメンバ変数はハンガリアン記法。
●グローバル変数,関数,クラス,構造体はパスカル形式(下参照)。
●ポインタ型については,Win32APIで「lp-」としているものに引き渡すポインタは「lp-」。それ以外は「p-」。(実際はほとんど「lp-」になっていますが)
●整数型については,サイズそのものが特に重要でない場合(ループ変数等)は「n-」,そうでない場合は「s-」「l-」など型情報を持ったものを使用。
※ただのループ変数なら,単に"i"とか"j"とかを使いますが・・・。

> パスカル形式、キャメル形式、大文字形式
そういう呼び方があるんですね。知りませんでした。
http://sonic64.com/2005-09-13.html
Javaを使うときは自分もこの方法です。(と言っても大学で使う程度ですが)
' ============================================================
' Sinryow Game Home Page - http://www.sinryow.net/
' Sinryow ActiveBasic Center - http://ab.sinryow.net/
' ============================================================
yu0627
記事: 154
登録日時: 2005年5月31日(火) 14:53

返信@yu0627

#13 投稿記事 by yu0627 »

変身が遅くなりました。
やっぱりハンガリー記法を使うことにしました。
その方が機能的なプログラミングをできると思ったので。
ありがとうございました。

次はオブジェクト指向だ...。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

Re: 返信@yu0627

#14 投稿記事 by イグトランス »

> .NET FrameWork(?)をインストールしなければならないし、エミュレーター上で動かしているようなのでABよりも実行速度が遅いかも...。そのあたりはどうなんでしょうか。

ちなみにこれC++だけはAB同様.Net Frameworkを使わないネイティブのプログラムも作れます。

#逆にAB .Netがあったら面白そうだと考えてみたり。
yu0627
記事: 154
登録日時: 2005年5月31日(火) 14:53

返信@yu0627

#15 投稿記事 by yu0627 »

ちなみにこれC++だけはAB同様.Net Frameworkを使わないネイティブのプログラムも作れます。
#逆にAB .Netがあったら面白そうだと考えてみたり。
そうなんですか。φ(.. ) メモメモ
確かにAB.Netあったら面白そうですね。ただ.NET FrameWork対応の開発環境作るのは難しそうです。

#オブジェクト指向のツボを呼んでいますがあまりつかめていない...。
 オブジェクト指向=構造体の中にプロシージャや変数も入っている。
 「.」使うところから最初こう思っていました。
 でも読むと違うんですね。
 ABユーザーガイド2版が出たらABDXとオブジェクト指向について書かれるのかな...。
返信する