ページ 1 / 3
ハンガリー記法について
Posted: 2005年11月10日(木) 21:24
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整数
このようなのですが、やはり使うほうがいいのでしょうか。
色々なサイトを見ると肯定も否定もありました。
皆さんはハンガリー記法を使っているのでしょうか?それとも使っていないのでしょうか?
ちなみに僕は使っていませんが、使おうかなと思っております。
お答えお願いいたします。
Re: ハンガリー記法について
Posted: 2005年11月10日(木) 23:46
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を使ったり、などとごっちゃにしてたりもします(^^;)
だんだんと、どの変数がどの型か覚えておくのが面倒になってきまして、
自然と似非ハンガリー記法になってました。
他の方のコードを読んだり、見せたりなどの互換性を考えれば、
ハンガリー記法を覚えておいた方が便利ですし、使ったほうが良いかとおもいますが、
そこを気にしなければ、好きにして良いと思います。
・・・って書くと、詳しい方から「ちゃんと使え!」ってお叱りを受けそうですね(苦笑)。
Re: ハンガリー記法について
Posted: 2005年11月11日(金) 00:20
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などを使う機会はあまりありません。
Posted: 2005年11月11日(金) 10:09
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と間違いやすいからかな…。
まぁ、型なんてのは、何通りもの書き方が用意されており、変数名にいたっては、プログラマーが好きに決めていいときているので、どの書き方が一番よいのかを、"よく考えた上で" 使えばいいんだと思います。考えていさえすれば、なんかあったときになんとかできます(複数人でやると、こうもいかない場合があるようですが…
Re: ハンガリー記法について
Posted: 2005年11月11日(金) 11:00
by NoWest
> 色々なサイトを見ると肯定も否定もありました。
> 皆さんはハンガリー記法を使っているのでしょうか?それとも使っていないのでしょうか?
> ちなみに僕は使っていませんが、使おうかなと思っております。
> お答えお願いいたします。
プログラミングの本を買うと結構、変数のネーミング法ってな項で
解説されていますよね。
私も以前から周りの人間はどうしているのか気になっておりました。
そう言ってる私はh(ハンドル) p(ポインタ)以外は基本的にハンガリー記法は使わない主義です。
変数は一箇所に定義するのではなく、その変数を使う直前に定義するように心がけていますし、グローバル変数等も極力使わない事にしています。
※可読性という意味で「まとめて変数を定義」には反対なんで。。。
何より現在のABは型違いを警告としてデバックメッセージ吐いてくれるので変数名に拘る事もそれほどないですし。
Re: ハンガリー記法について
Posted: 2005年11月11日(金) 11:50
by hanchan
> 皆さんはハンガリー記法を使っているのでしょうか?それとも使っていないのでしょうか?
> ちなみに僕は使っていませんが、使おうかなと思っております。
> お答えお願いいたします。
私は特にハンガリー記法に則って変数名を付けたりはしていないですね。
自分で解りやすいようにしています。
例えばStringならば「str~」とか、大体が型名の先頭三文字で付けています。
以下のサイトを見るとどうやら変数が全て同じ型で会った頃の名残のようです。
http://itpro.nikkeibp.co.jp/free/ITPro/ ... 0031002/1/
自分が解る範囲で付けるのがよいかと思います。
数人で共同開発する場合は統一して付けた方が良いと思いますが。
Re: ハンガリー記法について
Posted: 2005年11月11日(金) 20:10
by イグトランス
> そう言ってる私はh(ハンドル) p(ポインタ)以外は基本的にハンガリー記法は使わない主義です。
私はABではまだそうしていません。
たとえば*Byteではpbがバイナリデータ(Byte配列へのポインタ)で、
pszなら文字列(\0終端)へのポインタという区別をつけています。
#C/C++なら前者はBYTE *で後者はchar */TCHAR *などと型が別になるのでで良いのですが
#ABの*Charにはまだ移行しきれていませんので。
> 変数は一箇所に定義するのではなく、その変数を使う直前に定義するように心がけていますし、グローバル変数等も極力使わない事にしています。
> ※可読性という意味で「まとめて変数を定義」には反対なんで。。。
これは概ね同意です。
> 何より現在のABは型違いを警告としてデバックメッセージ吐いてくれるので変数名に拘る事もそれほどないですし。
それはそうなのですが、ポインタ型間の変換には甘いのが残念です。
返信@yu0627
Posted: 2005年11月11日(金) 20:37
by yu0627
皆さん、返信ありがとうございます。
変数は一箇所に定義するのではなく、その変数を使う直前に定義するように心がけていますし、グローバル変数等も極力使わない事にしています。
※可読性という意味で「まとめて変数を定義」には反対なんで。。。
僕の場合は変数の宣言は出来るだけ一箇所にまとめています。
その代わりしっかりと変数のコメントはしてありますが。
例えば
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
'グローバル変数宣言
Dim SoftNameVer As String 'ソフト名とバージョン
Dim MIDIPath[MAX_PATH] As Byte 'MIDIファイルのパス
Dim MIDIFolder[MAX_PATH] As Byte 'MIDIファイルが入ったフォルダ
Dim MIDIFileName[MAX_PATH] As Byte 'MIDIファイルの名前
Dim lpExt[10] As Byte 'MIDIファイルの拡張子
Dim mop As MCI_OPEN_PARMS 'MCI_OPEN_PARMS構造体
Dim IsPlayOrRecord As Long '再生中か録音中かを識別するためのフラグ
Dim OsVerInfo As OSVERSIONINFO 'OSの情報を格納する為の構造体
Dim MIDILong As Double
Dim MIDIM As Long, MIDIS As Long
'ここから録音デバイスの変数
Dim Play_Flag As DWord
Dim Record_Flag As DWord
Dim Stop_Flag As DWord
Const NumOfBuffers = 5 'バッファ数
Const BufferLength = 100*1024 'バッファ長
Dim hWaveIn As HWAVEIN
Dim hWaveOut As HWAVEOUT
Dim WaveHdr[ELM(NumOfBuffers)] As WAVEHDR
Dim WaveOutFormatEx As WAVEFORMATEX
Dim WaveInFormatEx As WAVEFORMATEX
Dim hMmio As HMMIO
Dim MmioInfo As MMIOINFO
Dim MmioCkInfo As MMCKINFO
Dim MmioCkInfoSub As MMCKINFO
Dim WaveData[ELM(NumOfBuffers)] As *Byte
Dim WaveInCaps As WAVEINCAPS
'ここまで
Dim hCombo As DWord 'コンボボックスのハンドル
Dim citem As COMBOBOXEXITEM 'コンボボックス内容追加のための構造体
'ここまで
こんなかんじです。自分では理解できていない変数についてはブラックボックス状態でコメントはつけていません^^;
僕の場合はハンドルは「h」をつけますが、あとはつけている所もつけていない所もあります。実際言いますと。
まぁ、型なんてのは、何通りもの書き方が用意されており、変数名にいたっては、プログラマーが好きに決めていいときているので、どの書き方が一番よいのかを、"よく考えた上で" 使えばいいんだと思います。考えていさえすれば、なんかあったときになんとかできます(複数人でやると、こうもいかない場合があるようですが…
「よく考えた上で」ですか...。
コンパイラを作るのって、かなり大変そうですね。機械語って0と1の羅列だそうですが。
Posted: 2005年11月11日(金) 23:02
by 高信期
マイクロソフトでは.NETになってからハンガリアン記法は非推奨になって、
パスカル形式、キャメル形式、大文字形式を併用しているそうです。
私自身はp, h, C, Iのみハンガリアン記法を使用しています。
あまりプレフィックスを多用すると返って見づらくなるので。
Posted: 2005年11月11日(金) 23:29
by マティ
自分はBASICからはじめたので、以下の順位で変数の定義を行っています。
①基本的にループ関連の変数は、i,j,k・・・って感じで使用します。
(iから始まるのは、フォートランの変数で整数はi以降の文字で始まる規定あった為のようです)
②APIを使用する場合は、そのAPIの定義をそのまま使用します。
(内部で定義したクラスも含みます。)
③グローバル変数は一箇所で定義します。
④関数で使用する変数に関しては、その関数より上位の関数に影響を与えない限り、ローカル変数として宣言し、ベーシック風に定義します。
(APIを使用する場合は②で規定した通りAPIに準拠します。)※ただし関数は画面2面以内(50行以内)で記述します。
ある程度データタイプによる規則性を決め、ループ等の変数に関しては、iから始める等の柔軟性を持たせた方が、仕様変更に強いような気がします。
ただし、(数百万ステップの)大規模システムではどちらが良いか分かりません。
アセンブラで数百万ステップのプログラムでもAPI,クラス,構造体さえきちんと管理できれば、それ以外の変数名は大差ありませんでした。
唯一、利点があるとすると引継ぎかも知れませんが・・・
長い変数名でプログラムを作成すると変数を判断するのが結構難しくなります。
返信@yu0627
Posted: 2005年11月13日(日) 10:03
by yu0627
マイクロソフトでは.NETになってからハンガリアン記法は非推奨になって、
パスカル形式、キャメル形式、大文字形式を併用しているそうです。
そうなんですか。
他のサイトで調べてみると、
・すべてがオブジェクトでそのオブジェクトごとに接頭字を付けようがない。
・基本型(整数、実数、文字列等)にだけ接頭字をつけるとしてもこの型名も言語ごとに異なる。
という訳でしょうか。
MicroSoftのVB/C++/Javaは.NETになってから使う気がなくなりました。
というより買うお金がないだけですが。.NET FrameWork(?)をインストールしなければならないし、エミュレーター上で動かしているようなのでABよりも実行速度が遅いかも...。そのあたりはどうなんでしょうか。
基本的にループ関連の変数は、i,j,k・・・って感じで使用します。
(iから始まるのは、フォートランの変数で整数はi以降の文字で始まる規定あった為のようです)
ループ関連の変数名がiやi2、j/kが多いのはそういうことだったんですね。φ(.. ) メモメモ
アセンブラで数百万ステップのプログラムでもAPI,クラス,構造体さえきちんと管理できれば、それ以外の変数名は大差ありませんでした。
アセンブラをされているんですか。あれってかなり大変だそうですね。C言語やBasicなどの高級言語よりも実行速度は速いそうですが。
Posted: 2005年11月13日(日) 10:29
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を使うときは自分もこの方法です。(と言っても大学で使う程度ですが)
返信@yu0627
Posted: 2005年11月28日(月) 20:47
by yu0627
変身が遅くなりました。
やっぱりハンガリー記法を使うことにしました。
その方が機能的なプログラミングをできると思ったので。
ありがとうございました。
次はオブジェクト指向だ...。
Re: 返信@yu0627
Posted: 2005年11月28日(月) 22:15
by イグトランス
> .NET FrameWork(?)をインストールしなければならないし、エミュレーター上で動かしているようなのでABよりも実行速度が遅いかも...。そのあたりはどうなんでしょうか。
ちなみにこれC++だけはAB同様.Net Frameworkを使わないネイティブのプログラムも作れます。
#逆にAB .Netがあったら面白そうだと考えてみたり。
返信@yu0627
Posted: 2005年11月29日(火) 20:21
by yu0627
ちなみにこれC++だけはAB同様.Net Frameworkを使わないネイティブのプログラムも作れます。
#逆にAB .Netがあったら面白そうだと考えてみたり。
そうなんですか。φ(.. ) メモメモ
確かにAB.Netあったら面白そうですね。ただ.NET FrameWork対応の開発環境作るのは難しそうです。
#オブジェクト指向のツボを呼んでいますがあまりつかめていない...。
オブジェクト指向=構造体の中にプロシージャや変数も入っている。
「.」使うところから最初こう思っていました。
でも読むと違うんですね。
ABユーザーガイド2版が出たらABDXとオブジェクト指向について書かれるのかな...。