現実世界でもハンガリー語の命名規則を使用している人はいますか?[閉まっている]

StackOverflow https://stackoverflow.com/questions/5428

質問

この規則を学ぶ価値はあるのでしょうか、それとも読みやすさや保守性を損なうものなのでしょうか?

役に立ちましたか?

解決

使用しているほとんどの人が ハンガリー語表記 それの誤解されたバージョンに従っていますが、それはかなり無意味だと思います。

元の定義を使用したい場合は、そのほうが理にかなっているかもしれませんが、それ以外はほとんどが糖衣構文です。

読んでみると、 ウィキペディアの記事 この件に関しては、2 つの矛盾する表記法が見つかります。 システムのハンガリー語表記 そして アプリのハンガリー語表記.

本来の良い定義は、 アプリのハンガリー語表記, しかし、ほとんどの人は システムのハンガリー語表記.

2 つの例として、変数の前に長さの l、面積の a、体積の v を付けることを考えてみましょう。

このような表記を使用すると、次の式が意味を持ちます。

int vBox = aBottom * lVerticalSide;

しかし、これはそうではありません:

int aBottom = lSide1;

プレフィックスを混合している場合、それらは方程式の一部とみなされ、ボックスの場合は体積 = 面積 * 長さは問題ありませんが、長さの値を面積変数にコピーすると危険信号が発生するはずです。

残念ながら、他の表記法はあまり役に立ちません。次のように変数名に値の型を接頭辞として付けます。

int iLength;
int iVolume;
int iArea;

数値には n、整数には i、浮動小数点には f、文字列には s などを使用する人もいます。

元のプレフィックスは、方程式の問題を見つけるために使用されることを意図していましたが、変数宣言を探す必要がなくなるため、コードが少し読みやすくなるように進化しました。現在のスマート エディターでは、変数の上にカーソルを置くだけで、省略形だけでなく完全な型を見つけることができるため、この種のハンガリー語表記はその意味の多くを失っています。

ただし、自分で決めるべきです。ただ言えるのは、私はどちらも使っていないということです。


編集 使用していない間に簡単なお知らせを追加します ハンガリー語表記, 私はプレフィックスを使用しますが、それはアンダースコアです。クラスのすべてのプライベート フィールドの前に _ を付け、それ以外の場合はプロパティの場合と同じように名前を綴り、タイトルケースの最初の文字を大文字にします。

他のヒント

ハンガリー語の命名規則は、正しく使用すれば便利ですが、残念なことに、誤用されることが多い傾向があります。

Joel Spolsky の記事を読む 間違ったコードを間違ったものに見せる 適切な視点と正当化のために。

基本的に、型ベースのハンガリー語表記であり、変数にはその型に関する情報が接頭辞として付けられます (例:オブジェクトが文字列、ハンドル、int などであるかどうか) はほとんど役に立たず、通常はオーバーヘッドが追加されるだけで、メリットはほとんどありません。悲しいことに、これはほとんどの人がよく知っているハンガリー語の表記法です。ただし、想定されているハンガリー語表記の目的は、変数に含まれるデータの「種類」に関する情報を追加することです。これにより、何らかの変換プロセスを介する場合を除いて、混合を許可すべきでない種類のデータを、他の種類のデータから分割することができます。たとえば、ピクセルベースの座標と他の単位での座標、または安全でないユーザー入力と安全なソースからのデータなど。

こう見ると、変数に関する情報を見つけるためにコードを詳しく調べていることに気付いた場合は、おそらくその情報が含まれるように命名スキームを調整する必要があります。これがハンガリーの規則の本質です。

ハンガリー語表記に代わる方法は、プリミティブ型に依存するのではなく、より多くのクラスを使用して変数の使用目的を示すことです。たとえば、安全でないユーザー入力に対して変数プレフィックスを使用する代わりに、安全でないユーザー入力に対しては単純な文字列ラッパー クラスを使用し、安全なデータに対しては別のラッパー クラスを使用できます。これには、厳密に型指定された言語では、コンパイラによってパーティション化が強制されるという利点があります (型指定がそれほど強くない言語でも、通常は独自のトリップワイヤ コードを追加できます) が、無視できない量のオーバーヘッドが追加されます。

UI 要素に関しては、私は今でもハンガリアン表記法を使用しています。ここでは、いくつかの UI 要素が特定のオブジェクト/値に関連付けられています。

ラベル オブジェクトの場合は lblFirstName、テキスト ボックスの場合は txtFirstName。たとえ両方に「FirstName」という名前を付けることは絶対にできません それ 両方のオブジェクトの関心事/責任です。

他の人は UI 要素の命名にどのように取り組んでいますか?

これは無意味 (そして気が散る) ですが、私の会社では、少なくとも int、string、boolean、double などの型に対して比較的頻繁に使用されています。

のようなもの sValue, iCount, dAmount または fAmount, 、 そして bFlag どこにでもいます。

かつて、この大会には正当な理由がありました。さて、それは癌です。

ハンガリアン記法は、より読みやすいコードへの「道」に沿った興味深い脚注だと思います。適切に実行されれば、実行しないよりも望ましいと思います。

ただし、それを言うなら、私はそれをやめて、代わりに次のようにしたいと思います。

int vBox = aBottom * lVerticalSide;

これを書きます:

int boxVolume = bottomArea * verticalHeight;

2008年です。80 文字の固定幅画面はもうありません。

また、それよりもはるかに長い変数名を記述している場合は、とにかくオブジェクトまたは関数へのリファクタリングを検討する必要があります。

フォローアップの質問で申し訳ありませんが、インターフェイスの前に「I」を付けることはハンガリー語表記として認められますか?もしそうなら、現実世界で多くの人がそれを使用していることになります。そうでない場合は、これを無視してください。

私はハンガリアン記法を、短期記憶の能力を回避する方法だと考えています。心理学者によると、私たちが保存できるのはおよそ 7 ± 2 チャンク 情報の。プレフィックスを含めることによって追加された情報は、他のコンテキストがない場合でも、識別子の意味についての詳細を提供するのに役立ちます。言い換えれば、変数がどのように使用されているか、宣言されているかを見なくても、その変数が何のためにあるのかを推測することができます。これは、次のような oo テクニックを適用することで回避できます。 カプセル化 そしてその 単一責任の原則.

これが実証的に研究されたかどうかは知りません。私は、9 個を超えるインスタンス変数を持つクラス、または 9 個を超えるローカル変数を持つメソッドを理解しようとすると、労力の量が劇的に増加するという仮説を立てます。

最近はタイプよりもスコープの方が重要ではないでしょうか。

  • l ローカル用
  • for 引数
  • メンバーのm
  • gはグローバル

古いコードをリファクタリングする最新の手法では、型を変更したためにシンボルを検索して置換するのは面倒です。コンパイラーは型の変更を検出しますが、スコープの誤った使用を検出しないことがよくあります。ここでは賢明な命名規則が役に立ちます。

ハンガリーのディスカッションを見ると、人々がコードをより明確にする方法や間違いをより目立つようにする方法について真剣に考えているのを見てうれしく思います。それはまさに私たち全員がすべきことです。

ただし、名前を付ける以外にも、自由に使える強力なツールがあることを忘れないでください。

抽出方法 メソッドが長くなりすぎて変数宣言が画面の上部からはみ出してしまう場合は、メソッドを小さくすることを検討してください。(メソッドが多すぎる場合は、新しいクラスを検討してください。)

強力な型指定 摂取していることがわかった場合は、 郵便番号s を整数変数に格納し、それらを 靴のサイズ 整数変数を使用する場合は、郵便番号のクラスと靴のサイズのクラスを作成することを検討してください。そうすれば、人間による慎重な検査を必要とせずに、コンパイル時にバグが検出されます。これを行うと、通常、コードの周囲に散りばめた郵便番号と靴のサイズに固有のロジックが大量に見つかり、それを新しいクラスに移すことができます。突然、すべてのコードがより明確になり、よりシンプルになり、特定のクラスのバグから保護されます。おお。

総括する:はい、アイデアを明確に表現するためにコード内で名前を使用する方法をよく考えてください。また、呼び出すことができる他の強力な OO ツールにも目を向けてください。

私はそれほど厳密な意味のハンガリー語表記法を使用していませんが、いくつかの一般的なカスタム オブジェクトを識別しやすくするために、ハンガリー語表記法を控えめに使用していることに気づきました。また、gui コントロール オブジェクトにそのコントロールの種類をプレフィックスとして付ける傾向があります。たとえば、labelFirstName、textFirstName、buttonSubmit などです。

私はボタン、テキストボックス、ラベルなどの UI 要素にハンガリー語の名前付けを使用しています。主な利点は、Visual Studio Intellisense ポップアップでのグループ化です。自分のラベルにアクセスしたい場合は、「lbl....」と入力するだけです。Visual Studio は、すべてのラベルをグループ化して提案します。

ただし、データ バインディングを活用して Silverlight や WPF の作業をさらに行った後は、コード ビハインドから参照する必要がなくなったので、すべてのコントロールに名前を付けることさえなくなりました (実際にはコード ビハインドがもう存在しないため)。 ;)

問題は規格が混在していることです。

正しいことは、全員が同じことをするようにすることです。

int Box = iBottom * nVerticleSide

元の接頭辞は、方程式の問題を見つけるために使用されることを目的としていましたが、変数宣言を探す必要がないため、コードを少し読みやすくするように委任されました。今日のスマート編集者では、任意の変数の上にホバリングして完全なタイプを見つけることができますが、それの略語だけでなく、このタイプのハンガリー語の表記はその意味の多くを失いました。

この習慣を少しやめていますが、変数の型付けが強力ではない JavaScript では、型の接頭辞を付けると便利です。

動的型付け言語を使用する場合、私は Apps Hungarian を使用することがあります。静的型付け言語の場合はそうではありません。私の説明を参照してください 他のスレッドで.

ハンガリー語表記はタイプセーフ言語では無意味です。例えば古い Microsoft コードでよく見られるプレフィックスは「lpsz」で、これは「ゼロで終わる文字列への長いポインタ」を意味します。1700 年代初頭以来、ショート ポインターとロング ポインターが存在するセグメント化されたアーキテクチャは使用されていません。C++ の通常の文字列表現は常にゼロで終了し、コンパイラーはタイプ セーフなので、非文字列操作を文字列に適用することはできません。弦。したがって、この情報はどれもプログラマーにとって実際には役に立ちません。単に入力するだけです。

ただし、私も同様のアイデアを使用しています。を明確にする接頭辞 使用法 変数の。主なものは次のとおりです。

  • m = メンバー
  • c = 定数
  • s = 静的
  • v = 揮発性
  • p = ポインター (および pp = ポインターへのポインターなど)
  • i = インデックスまたはイテレータ

これらは組み合わせることができるため、ポインターである静的メンバー変数は「mspName」になります。

これらはどこで役に立ちますか?

  • 使用法が重要な場合は、変数が (たとえば) volatile またはポインタであることをプログラマに常に思い出させることをお勧めします。
  • p 接頭辞を使用するまでは、ポインターの逆参照が頭を悩ませていました。これで、オブジェクト (Orange) がいつオブジェクトへのポインター (pOrange) であるのか、またはオブジェクトへのポインターへのポインター (ppOrange) があるのか​​を知るのが非常に簡単になります。オブジェクトを逆参照するには、名前に含まれる各 p の前にアスタリスクを付けます。事件は解決しました。もう deref バグはありません。
  • コンストラクターでは、パラメーター名がメンバー変数の名前と同じであることがよくあります (例:サイズ)。「msize = size;」を使用することを好みます。 「size = thesize」または「this.size = size」よりも。また、はるかに安全です。「mSize = 1」(メンバーの設定)と言うつもりで誤って「size = 1」(パラメータの設定)を使用することはありません
  • ループでは、イテレータ変数はすべて意味のある名前です。ほとんどのプログラマーは「i」または「index」を使用し、内部ループが必要な場合は、意味のない新しい名前 (「j」、「index2」) を作成する必要があります。i 接頭辞が付いた意味のある名前 (iHospital、iWard、iPatient) を使用するので、反復子が何を反復しているのかが常にわかります。
  • ループでは、異なる接頭辞を持つ同じベース名を使用することで、複数の関連する変数を混在させることができます。オレンジオレンジ = pOrange[iOrange];これは、配列のインデックス付けエラーが発生しないことも意味します (pApple[i] は問題ないように見えますが、pApple[iOrange] と書くと、エラーがすぐにわかります)。
  • 多くのプログラマは、それを知らずに私のシステムを使用するでしょう。「Index」や「Ptr」などの長い接尾辞を追加します。私見では、単一文字よりも長い形式を使用する正当な理由はありません。そのため、私は「i」と「p」を使用します。入力の手間が減り、一貫性が増し、読みやすくなります。

これは、意味のある有用な情報をコードに追加する単純なシステムであり、単純だがよくある多くのプログラミング上の間違いの可能性を排除します。

私は過去 6 か月間 IBM で働いていますが、どこにも見たことがありません (私は大嫌いなのでありがたいです)。キャメルケースか c_style のどちらかを見かけます。

thisMethodIsPrettyCool()
this_method_is_pretty_cool()

それはあなたの言語と環境によって異なります。原則として、現在の開発環境で変数の型を見つけるのが難しい場合を除き、私はこれを使用しません。

ハンガリー語表記にも 2 つの異なるタイプがあります。ジョエルの記事を参照してください。見つからないんですが(彼の名前だけでは簡単には見つけられません)、私が言っているリンクを知っている人はいますか?

編集:ウェッジの投稿には私が言いたいことの記事が載っています。

元の形式 (The Right Hungarian Notation :) ) ) 接頭辞はタイプを意味します (つまり、変数に格納される値の長さ、量) は問題ありませんが、すべての種類のアプリケーションで必要なわけではありません。

プレフィックスが型 (String、int) を意味する一般的な形式 (間違ったハンガリー表記) は、最新のプログラミング言語のほとんどでは役に立ちません。

特に strA のような意味のない名前の場合。私たち人間が、何も得られない長いプレフィックスが付いた意味のない名前を使用することが理解できません。

オートコンプリートの動作を改善するため、コンポーネント (editFirstName、lblStatus など) にはタイプベース (Systems HN) を使用します。

型情報が十分な変数には App HN を使用することがあります。つまり、fpX は、固定のポイント変数 (int 型ですが、int と混合して一致させることはできません)、検証されていないユーザー文字列の rawInput などを示します。

PHP プログラマーとしては、非常に大まかに型付けされているため、私は PHP を使用するつもりはありません。ただし、システムのサイズと変数のスコープに応じて、何かを配列またはオブジェクトとして識別することがあります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top