16

この質問は、ハンガリー記譜法の良い例を探すためのもので、これらのコレクションをまとめることができます。

編集:タイプのハンガリー語はそれほど必要ではないことに同意します。ジョエルが彼の記事で提供しているように、読みやすさと保守性を向上させるより具体的な例を望んでいます(私の答えによる)。

4

22 に答える 22

40

ハンガリー記譜法の良い例を求めることの問題点は、良い例とはどのようなものかについて、誰もが独自の考えを持っていることです。私の個人的な意見では、最高のハンガリー語表記法、ハンガリー語表記法ではないということです。この表記法は、もともと変数の型ではなく使用目的を示すことを目的としていましたが、通常は型情報、特にフォーム コントロールに使用されます (例: txtFirstNameは、誰かのファースト ネームのテキスト ボックスに使用されます)。これにより、可読性 (例: "prepIn nounTerms prepOf nounReadability") および型を変更する必要がある場合のリファクタリング (Win32 API には型が変更された "lParams" があります) の点で、コードの保守性が低下します。

おそらく、まったく使用しないことを検討する必要があります。例:

  • strFirstName - これは何の目的であるかが明らかであるため、単にfirstNameである可能性があります。型はそれほど重要ではなく、この場合は明らかなはずです。明らかでない場合は、IDE がお手伝いします。
  • txtFirstName - FirstNameTextBoxまたはFirstName_TextBoxに変更できます。読みやすく、単なるテキストではなくコントロールであることがわかります。
  • CAccount - MFC ではCがクラス名に使用されていましたが、実際には必要ありません。アカウントは十分です。大文字の名前は、型の標準的な規則です (プロパティやメソッドと混同しないように、特定の場所にのみ表示されます)。
  • ixArray (配列へのインデックス) -ix少しあいまいです。arrayIndexを試してください。
  • usState ( Stateの安全でない文字列) - 「米国の州」のように見えます。状態_UnsafeStringなどを使用することをお勧めします。おそらくそれをUnsafeStringクラスにラップして、少なくともタイプ セーフにすることもできます。
于 2008-10-14T17:48:14.550 に答える
28

他のハンガリーの投稿で言及されているように、今では古典的な記事は Joel のサイトからのものです。

http://www.joelonsoftware.com/articles/Wrong.html

于 2008-10-14T17:38:38.640 に答える
17

p

(ポインター用)。私が使用するほぼ唯一の接頭辞です。私はそれが変数に多くのことを追加すると思います(例えば、それはポインタです)ので、もう少し敬意を持って扱われるべきです。

ハンガリー語のデータ型はやや時代遅れになり、IDE は型が何であるかを (変数名にカーソルを合わせて数秒で) 教えてくれるので、それほど重要ではありません。しかし、ポインタをそのデータが良くないかのように扱うので、ユーザーがコーディング時に想定すべきではない仮定を行ったとしても、それが何であるかをユーザーに明らかにする必要があります。

于 2008-10-14T17:45:57.410 に答える
15

t

汚染されたデータ。信頼できないソースから受信したすべてのデータにプレフィックスを付けて、その変数を汚染されたものにします。汚染されたすべてのデータは、実際の作業を行う前にクレンジングする必要があります。

于 2008-10-14T17:57:42.613 に答える
9

ハンガリー語を使用して型を示すのは無意味です。コンパイラが既にそれを行っているからです。

ハンガリー語が役立つのは、同じ生の型を持つ論理的に異なる種類の変数を区別することです。たとえば、int を使用して座標を表す場合、x 座標の前に x を、y 座標の前に y を、距離の前に d を付けることができます。したがって、次のようなコードが得られます

dxHighlight = xStart - xEnd

yHighlight = yLocation + 3

yEnd = yStart + dyHeight

dyCode = dyField * 2

等々。エラーが一目でわかるので便利です。y に dy を追加すると、常に y が返されます。2 つの x を減算すると、常に dx が得られます。dy にスカラーを掛けると、常に dy が得られます。等々。次のような行が表示された場合

yTop = dyText + xButton

dy と ax を追加しても意味がないので、間違っていることが一目でわかります。コンパイラが知る限り、int に int を追加しているため、コンパイラはこれをキャッチできませんでした。

于 2008-11-30T05:52:00.843 に答える
6

言語固有のプレフィックスは使用しないでください。

を使用しております:

n: 番号
p: パーセンテージ 1=100% (金利などの場合)
c: 通貨
s: 文字列
d: 日付
e: 列挙
o: オブジェクト (Customer oCustomer=new Customer();)
...

すべての言語で同じシステムを使用しています。

SQL
C
C#
Javascript
VB6
VB.net
...

それは命の恩人です。

于 2008-11-29T08:04:24.633 に答える
5

Devil's Advocate: ハンガリー語表記法の最も良い例は、それを使用しないことです。:D

最新の IDE でハンガリー語表記を使用しても、タイプがわかっているため、何の利点もありません。名前も変更する必要があるため、変数の型をリファクタリングするときに作業が追加されます (そして、ほとんどの場合、変数を扱っているときは、それがどのような型であるかを知っています)。

また、表記法で順序付けの問題が発生する可能性もあります。ポインタに p を使用し、アドレスに a を使用する場合、変数を apStreet または paStreet と呼びますか? 一貫性がないと可読性が低下し、記法を書く順序を覚えなければならないときは、貴重な心のスペースを使い果たさなければなりません。

于 2008-10-14T17:49:41.380 に答える
5

ハンガリアン記法は動的言語で役立つことがあります。私は具体的にはサーバー側のアクション スクリプト (本質的には単なる JavaScript) を考えていますが、他の場所にも適用できます。実在する型の情報がまったくないため、ハンガリアン表記法は物事を理解しやすくするのに役立つ場合があります。

于 2008-10-14T17:51:48.723 に答える
4

本当に便利なハンガリー語は、メンバー変数の m_ だけです。(静的メンバーにも sm_ を使用します。これは、まだ存在する「その他の」スコープであるためです。) 80 億文字の長さの変数名を使用するワイドスクリーン モニターとコンパイラでは、型名を省略しても意味がありません。

于 2008-10-14T18:17:08.500 に答える
4

ソフトウェア プロジェクトを継承する場合、ハンガリー語表記法 (私が学んだキャメル ケーシング) は非常に重要です。

はい、IDE で変数に「ホバー」して、それがどのクラスであるかを調べることができますが、数千行のコードをページングしている場合は、その数秒間停止する必要はありません。 ..シングル....時間....

覚えておいてください - あなたやあなたのチームだけのためにコードを書いているわけではありません。また、2 年から 5 年後にこのコードを取得して拡張する必要がある人のためにも書いています。

于 2008-10-14T18:18:31.773 に答える
4

ハンガリー語の表記法について実際に読み始め、その本来の意図を理解しようとするまで、私はハンガリー語の表記法に強く反対していました。
Joels の投稿 "Wrong" と記事 "Rediscovering Hungarian Notation" を読んだ後、私は本当に考えが変わりました。うまくやれば、それは非常に強力であるに違いないと信じています。

Joel Spolsky による間違い
http://www.joelonsoftware.com/articles/Wrong.html

ハンガリー語表記法の再発見
http://codingthriller.blogspot.com/2007/11/rediscovering-hungarian-notation.html

ほとんどの否定論者は実際にそれを試したことがなく、真に理解していないと私は信じています. 実際のプロジェクトで試してみたいと思います。

于 2010-09-08T12:27:03.363 に答える
3

上にリンクされている Joel の記事と、一般的なハンガリー語表記法から学ぶべき重要なことは、変数について明白でない何かがあるときにそれを使用することだと思います。

記事の1つの例は、エンコードされた文字列とエンコードされていない文字列です。安全でない文字列にはハンガリー語の「us」を使用し、安全な文字列には「s」を使用する必要があるわけではありません。文字列が安全であることを示す識別子が必要です。か否か。スタンダードになれば、スタンダードを崩しているところが見えやすくなります。

于 2008-10-14T18:55:08.363 に答える
2

非常に古い質問ですが、私が定期的に使用する「ハンガリー語」の接頭辞をいくつか示します。

私の

ローカル変数の場合、名前がグローバルコンテキストで意味をなす可能性のある場所を区別します。myFooが表示されている場合は、他の場所でFoosを使用していることに関係なく、この関数でのみ使用されます。

myStart = GetTime();
doComplicatedOperations();
print (GetTime() - myStart);

tmp

ループまたはマルチステップ操作での値の一時的なコピー用。2つのtmpFoo変数が互いに数行以上離れている場合、それらはほぼ確実に無関係です。

tmpX = X; 
tmpY = Y;
X = someCalc(tmpX, tmpY);
Y = otherCalc(tmpX, tmpY);

tmpと同様の理由で、通常は長いループや関数で、古いもの新しいものがあります。

于 2009-05-28T00:04:15.347 に答える
2

ポインタに「p」を使用することに加えて、「cb」と「cch」を使用して、バッファサイズパラメータ(または変数)がバイト数か文字数かを示すというアイデアが好きです(私も見ました-まれに-'ce'は要素の数を示すために使用されます)。したがって、タイプを伝える代わりに、プレフィックスは使用または意図を伝えます。

確かに、私はおそらく必要なほど一貫してプレフィックスを使用していませんが、私はそのアイデアが好きです。

于 2008-10-14T18:30:06.930 に答える
2

メートル

ORM (休止状態など) を使用する場合、マネージド オブジェクトとアンマネージド オブジェクトを扱う傾向があります。管理対象オブジェクトを変更すると、明示的な保存を呼び出さなくてもデータベースに反映されますが、管理対象オブジェクトを処理するには明示的な保存呼び出しが必要です。オブジェクトの扱い方は、オブジェクトが何であるかによって異なります。

于 2008-10-14T18:02:04.070 に答える
2

インターフェイス コントロール、txtUsername、txtPassword、ddlBirthMonth を宣言するときだけが役立つことがわかりました。完璧ではありませんが、大きなフォームやプロジェクトに役立ちます。

変数やその他のアイテムには使用せず、コントロールだけに使用します。

于 2008-10-14T18:09:12.213 に答える
2

変数の名前は、それが何であるかを説明する必要があります。 変数の命名が適切であると、ハンガリー語表記が役に立たなくなります。

ただし、適切な変数名に加えて、ハンガリー語表記を使用する場合もあります。m_numObjects には、m_ と num の 2 つの「プレフィックス」があります。 m_はスコープを示します。これはthisに関連付けられたデータ メンバーです。 numは、値何であるかを示します。

「ハンガリー語」が含まれていたとしても、「良い」コードを読むときはまったく邪魔されません。右: 私はコードを読みますが、クリックはしません。(実際、私はコーディングや、ブードゥー教プログラミング特有のルックアップ機能を使用するときは、ほとんどマウスを使用しません。)

m_ubScale のようなものを読むと遅くなります (はい、私はあなたを見ています、Liran! )、その使用法 (コメントはありません!) を調べて、それが何をスケーリングするか (もしあれば?) を見つける必要があるためです。データ型 (たまたま固定小数点文字)。より適切な名前は、m_scaleFactor または m_zoomFactor で、固定小数点数または typedef としてコメントを付けます。(実際には、同じ固定小数点形式を使用するいくつかのクラスのメンバーが他にもいくつかあるため、typedef は便利です。ただし、そうでないものもありますが、m_ubWhatever というラベルが付いているものもあります!控えめに言っても、紛らわしいです。)

ハンガリー語は、情報の代わりではなく、変数名に追加することを意図していたと思います。また、多くの場合、ハンガリー語表記は変数の可読性に何も追加せず、バイトと読み取り時間を浪費します。

ちょうど私の2¢。

于 2008-11-30T06:54:35.397 に答える
2

ハンガリー記法がもはや特に有用ではないことに同意します。本来の意図は、データ型ではなくエンティティ型を示すことだと思いました。たとえば、顧客、従業員、およびユーザーの名前を含むコード セクションでは、ローカル文字列変数 cusName、empName、および usrName に名前を付けることができます。これは、似たような変数名を区別するのに役立ちます。エンティティの同じ接頭辞がアプリケーション全体で使用されます。ただし、OO が使用され、オブジェクトを扱っている場合、これらのプレフィックスは Customer.Name、Employee.Name、および User.Name で冗長になります。

于 2008-10-14T20:33:45.340 に答える
1

私は p をポインターにしか使用していません。それだけです。それは、私が C++ を使用している場合のみです。C# では、ハンガリー語表記は使用しません。例えば

MyClass myClass;
MyClass* pMyClass;

それで全部です :)

編集:ああ、それが嘘だと今気づきました。メンバー変数にも「m_」を使用します。例えば

class
{
private:
bool m_myVar;
}
于 2008-10-14T18:01:34.803 に答える
1

まあ、私はそれをウィンドウ制御変数でのみ使用します。btn_、txt_、lbl_ などを使用してそれらを見つけます。また、コントロールのタイプ (btn_ など) を入力して、コントロールの名前を調べることも役に立ちます。

于 2013-02-21T08:21:26.743 に答える
0

ハンガリー語表記の良い例はありません。使用しないでください。弱く型付けされた言語を使用している場合でも。あなたはもっと幸せに暮らせるでしょう。

しかし、それを使用しない何らかの理由が本当に必要な場合は、これが私のお気に入りで、 このすばらしいリンクから抽出されています。

ハンガリー語の記法における次のトリックの 1 つは、「変数の型を変更しますが、変数名は変更しないでください」です。これはほとんどの場合、Win16 の Windows アプリで行われます:- WndProc(HWND hW, WORD wMsg, WORD wParam, LONG lParam) から Win32 WndProc(HWND hW, UINT wMsg, WPARAM wParam, LPARAM lParam) への移行では、w の値がヒントになります。それらは単語ですが、実際には long を指します。このアプローチの真価は、パラメーターが 64 ビット幅になる Win64 移行で明らかになりますが、古い "w" および "l" プレフィックスは永久に残ります。

于 2008-10-14T17:57:20.023 に答える
0

次のように、データを操作するためにそこにあるローカル変数の接頭辞として、「temp」や「tmp」の代わりに「作業中」を意味する「w」を使用していることに気づきました。

Public Function ArrayFromDJRange(rangename As Range, slots As Integer) As Variant

' this function copies a Disjoint Range of specified size into a Variant Array 7/8/09 ljr

Dim j As Integer
Dim wArray As Variant
Dim rCell As Range

wArray = rangename.Value ' to initialize the working Array
ReDim wArray(0, slots - 1) ' set to size of range
j = 0

For Each rCell In rangename
    wArray(0, j) = rCell.Value
    j = j + 1
Next rCell

ArrayFromDJRange = wArray

End Function
于 2009-07-08T17:16:43.250 に答える