変数名の前に変数タイプの略語を付けますか?(ハンガリー記法)[終了]


37

私の現在の仕事では、コーディングのガイドラインはありません。誰もが彼の望み通りにコーディングしています。会社が小さいので、これは問題ありません。

ただし、最近、新しい記者の1人が、常にハンガリー記法を使用することを提案しました。これまで、私たちの中にはある種のハンガリー記法を使用していた人もいれば、そうでない人もいました。エンジニアリング会社なので、アルゴリズムが適切である限り、コーディングスタイルは実際には重要ではありません。

個人的には、これらの小さなタイプの略語は一種の冗長であると感じています。よく考え抜かれた名前は通常、同じメッセージを伝えます。(さらに、私たちのコードのほとんどは、とにかくコンセプトが存在する、boolまたはfloat存在しない、奇妙なDSPで実行する必要があります)。

それでは、ハンガリー記法についてどう思いますか?使いますか?どうして?



7
どのプログラミング言語を使用していますか?
ラリーコールマン

3
実際には問題ありません-あなたはコーディング形式(公式またはそれ以外)を持っているべきです、私の意見では決して問題ありません ...
マーフ

@Larry:私たちは主にCとC ++を使用していますが、アセンブラーとLuaが散らばっています。
バスティーブ

11
@Paperflyer、コーディング標準/ルールは顧客向けではなく、開発チーム向けです。同じ開発者が永遠にスタッフになる(非現実的)と思わない限り、コーディング標準を確立して従うべきだと強く信じています。これにより、システムのメンテナンス性が向上し、新しいスタッフがより速く、より一貫したものになります。とはいえ、ハンガリーの表記法は冗長であることが証明されており、過去の遺物であることに同意します。特に最近使用されているはるかに強力なIDEでは、よく考えられた名前がより重要です。
マークフリードマン

回答:


77

ほとんどの人が「ハンガリー記法」と言うとき、彼らは実際に「システムハンガリー語」について話している。

システムハンガリー語は完全に役に立たないため、避けるべきです。名前に変数のをエンコードする必要はありません。ただし、Systems Hungarianは、実際には、元の「実際の」ハンガリー語であるApps Hungarianの誤解です。

Apps Hungarianでは、変数名に「タイプ」をエンコードせず、変数の「種類」をエンコードします。そうではありませんnWidthが、pxWidthまたはemWidth(「ピクセル単位の幅」または「em単位の幅」の場合)。ではないstrNameが、sNameusName(それぞれ「安全な名」または「安全でない名前」のために-ユーザーからの便利な入力受付:危険な文字列)。

個人的には、私は通常どちらも気にしません。値の「種類」を明示的に変換することを行っていない限り(たとえば、過去に「px」と「em」という接頭辞を使用したことがありpxArea = emWidth * emHeightます。

Joelの記事「Mrong Wrong Code Look Wrong」も参照してください。


2
この件に関するSimonyiの文章をチェックしてください。彼はハンガリー語の最初の公布者であり、彼のバージョンは有用なものです。msdn.microsoft.com/en-us/library/aa260976(v=vs.60).aspx
Michael Kohne

1
本当に必要な場合は、カスタムタイプにユニットを含める方法が必要です(安全/安全でない文字列でも同じです)。ただし、それを行うとパフォーマンスの問題が発生する可能性があります(たとえば、クラスでフロートをラップしたくない場合)。F#では、この目的のために、基本的に追加の型情報をdoubleに追加する測定単位機能が導入されています。
スコットホイットロック

1
ユーザー入力を扱うコードでは、私が持つプレフィックスユーザデータにそれが便利rawすなわちrawUsername
zzzzBov

1
@Scottの別のオプションは、強く型付けされたtypedef
jkです。

1
@JBR:あなたは実際に答えを読みましたか?「アプリハンガリー」では、sあるいないためstringか何かが、「安全」のために(または私はまた、「安全な文字列を」聞きました)。

31

代名詞あなたの動詞副詞決して動詞を使わないハンガリー語の名詞表記、前置詞それ動詞集合名詞を作りますすべての副詞とても比較Bloody adjectiveHard infinitiveTo verbRead。


6
私を笑わせた…。「読む」は不定詞です。
-DrAl

D:もちろん@dral、それは、ユーモラスレジスタに文法フリークのではなかった
smirkingman

1
それはすごかった、笑わせた。:)
Corv1nus

26

まず:

エンジニアリング会社なので、アルゴリズムが適切である限り、コーディングスタイルは実際には重要ではありません。

コーディングスタイルは、会社に関係なく重要です。はい、アルゴリズム健全である必要ありますが、コードは元の開発者だけでなく全員が保守可能でなければなりません。スタイル要素を含むコーディング標準を持つことは、それを達成するための何らかの方法になります。すべてのコードのスタイルが同じであると言っているわけではありません-それは逆効果になるでしょうが、ある程度の一貫性があるはずです。

次に、ハンガリー語の表記法について説明します。

IntelliSense型の動作をサポートする最新のIDEでは、その用途がありましたが、名前に変数の型を含める必要はありません。この情報は、他の方法で利用できます。さらに悪いことに、将来変数の型を変更する必要がある場合、コードが読みにくくなる可能性があります。


21

使用しないでください。冗長であり、コードを読みにくくします。


8
「冗長」よりも悪い。いくつかの複雑な状況では、正しくなるのは困難です。具体的には、アプリで定義する各クラスには略語が必要です。20個ほどのクラスを定義した後、1文字の略語がなくなりました。今何?1文字と2文字の混合物ですか?データ構造の要素への複雑な参照はどうですか?整数から文字列へのマッピングへのリストのマッピングの配列へのポインタ?その略語はどのように役立つでしょうか?
S.Lott

13

(システム)ハンガリー記法についての多くの議論は、作業領域に依存します。私はかつて「まさか!」の側にしっかりといましたが、組み込み開発に使用されている会社で数年間働いていたので、特定のアプリケーションでそれのいくつかの利点を見ることができ、間違いなく成長しました。

システムハンガリー語

私の知る限り、Systems Hungarianは組み込み分野で多く使用される傾向があります。PCアプリケーションでは、コンパイラは(たとえば)文字列、整数、浮動小数点値の違いに関連する多くの問題を処理します。深く埋め込まれたプラットフォームでは、8ビットの符号なし整数、16ビットの符号付き整数などの違いをより頻繁に懸念します。コンパイラ(またはMISRAルールが適用されたlintでも)は、これらを常に認識しません。この場合、などの変数名u8ReadIndexを使用s16ADCValueすると便利です。

ハンガリー語のアプリ

Apps Hungarianには、PC / Webアプリケーションに関して明確な利点があります。たとえば、「安全でない」文字列と「安全な」文字列(つまり、ユーザーによって入力されたものと、内部リソースなどからエスケープまたは読み取られたもの)の視覚的な違いを提供します)。コンパイラーは、この区別を認識していません。

ポイントは何ですか?

(システムまたはアプリ)ハンガリー語の使用とは、間違ったコードを間違って見えるようにすることです。

安全でない文字列をエスケープせずに安全な文字列に直接コピーしている場合、Apps Hungarianを使用すると間違って表示されます。

符号付き整数に符号なし整数を掛けると、コンパイラーは(多くの場合、暗黙のうちに)符号付き整数を(可能性のある巨大な)符号なし整数に昇格させます。

これらの状況の両方で、(Apps / Systems)ハンガリー表記法は、変数の型への参照が少なくなるため、正式なコードレビューを迅速にする傾向があります。

全体

全体として、私の意見では、最も重要なことはコーディング標準を持っているということです。Systems Hungarianを使用するか、Apps Hungarianを使用するか、どちらを使用するかは、インデントタイプの選択などと同様に、個人またはグループの好みの問題です。


あなたが話している言語を明確にする必要があります。組み込み開発で作業しているので、Cを使用していると思いますか?ハンガリー語はCでは意味がありますが、最新の言語では意味がありません。
ジャックB

9

ハンガリー記法の目的は、他の方法では型システムでエンコードできない識別子に情報をエンコードすることです。私自身の意見では、この情報がエンコードするのに十分重要であれば、適切にチェックできる型システムでエンコードするのに十分重要だということです。そして、情報が重要でない場合、なぜそれでソースコードを乱雑にしたいのですか?

または、もっと簡潔に言うと、型情報は型システムに属します。(注:静的型システムである必要はありません。型エラーをキャッチする限り、いつキャッチするかは気にしません。)

他のいくつかの回答では、ハンガリーの表記法の許容可能な使用法として測定単位に言及しています。(NASA Mars Climate Orbiterについてはまだ誰も言及していなかったので、ハンガリー記法についての議論で常に浮かび上がってきているように思えるので、ちょっと驚いています)。

F#の簡単な例を次に示します。

[<Measure>] type m
[<Measure>] type ft

let someLength      = 48.15<m>
let someOtherLength = 16.2342<ft>

someLength + someOtherLength
// someLength + someOtherLength
// -------------^^^^^^^^^^^^^^^
// error FS0001: The unit of measure 'ft' does not match the unit of measure 'm'.

見て、馬、ハンガリー人じゃない!

私がした場合だった代わりに、ここではタイプのハンガリー語表記法を使用することは私に1ビットを助けないだろう。

let mSomeLength       = 48.15
let ftSomeOtherLength = 16.2342

mSomeLength + ftSomeOtherLength
// > val it : float = 64.3842

コンパイラはそれをそのまま通しました。私は今、本質的にタイプエラーであるものを見つけるために人間に頼っています。それは型チェッカーの目的ではありませんか?

さらに良いことに、Frinkプログラミング言語を使用します

someLength      = 48.15m
someOtherLength = 16.2342ft

someLength + someOtherLength
// 53.09818416 m (length)

// Wanna know the answer in a good old fashioned American unit?
someLength + someOtherLength -> yd
// 58.06888031496062992

// Are you an astrophysicist?
someLength + someOtherLength -> parsec
// 1.7207949554318336148e-15

// ... or a fundmentalist Christian who refuses to use units invented 
// less than 2000 years ago?
someLength + someOtherLength -> biblicalcubits
// 95.893563822870765006

要約すると、私はハンガリー記法が好きではありません。絶対に使用しないでください。

そうは言っても、ハンガリー記法を使用するのは良い考えだと思います。待って、何?

はい!この特定のケースでは、あなたは言及しました:

さらに、ほとんどのコードは、boolやfloatなどの概念が存在しない、変なDSPで実行する必要があります

しかし、それはまさにハンガリー記法の賢明なユースケースです


PS:Frinkを見ることを心からお勧めします。そのマニュアルには、これまでで最も素晴らしいおならジョークのいくつかが含まれています。また、かなりクールな言語です:-)


可能であれば、これを50回投票します。
ラリーコールマン

1
非常に興味深い議論!私は現在のプロジェクトでそれを試すかもしれません。typedef meter float...
バスティーブ

6

オブジェクト指向言語では意味がありません-すべては、それを使用しようとするときに明らかなタイプです。


6

Systems Hungarianが保証される唯一の場所は、Cなどの弱い型付け言語です。明示的なオブジェクトがないため、Cでは二重に重要です(構造体がありますが、すべての関数は構造体の外部にあります)。C ++、Java、C#のようなより強く型付けされたものでは役に立たず、実際に事態を悪化させます。コードの変更。変数名を使用しているすべての場所を変更するよりも、型を変更する方がはるかに簡単です。また、無視される傾向がある不必要な忙しい仕事でもあります。

測定単位がある場合、それを名前にエンコードすると役立つ場合がありますが、最終的には余分なノイズになる可能性があります。たとえば、コードで作業しているさまざまなものに対して標準の測定単位を宣言します。たとえば、グラデーションまたは度、メートルまたはフィート、フレームまたはミリ秒を使用していますか?コードの標準が設定されると、1つの測定単位を読み取るたびに、常にコードの標準の測定単位にすぐに変換されます。

私のアドバイス:あなたの現在の問題点から始めて、コードのその部分の合理的な標準を選んでください。コーディング標準を過剰に指定すると、逆効果になります。変数とフィールド名がそれらが表すものを詳しく説明することには多くの価値があり、ほとんどの場合、概念から型を安全に推測できます。


1
実際、優れたIDE(またはプラグイン)は通常、変数名を簡単に変更できる非常に強力なリファクタリング機能を備えています。
バスティーブ

4
理解されましたが、名前の変更に対するバージョン管理の余分なノイズは、物事を助けません。付加価値がメンテナンスのオーバーヘッドを正当化しないとだけ考えてみましょう。
ベリンロリチュ

言語に依存するだけでなく、いくつかは強い型付けのUoMまたは強い型付けのtypedef
jk

6

嫌です!

ハンガリー語表記やその他の表記を使用しないでください。プログラマーとして、変数名に「表記」を使用するべきではありません。

私たちがすべきことは、変数によく名前を付けることです:

  • 一般的な名前を避けてください。名前z付きオブジェクト、たとえば電話代を表すクラス変数の場合は、名前を付けないでください。phoneBillまたはを呼び出しPhoneBillます。
  • 具体的な名前は避けてください。追加情報なしで何かが明確な場合は、それを含めないでください。文字列の文字をループするための単なる文字列インデックス変数であり、関数MyFuncで一度だけ使用する場合、一体なぜこれを呼び出すのMyFuncTempStringCharacterIndexでしょうか?それは悲しい冗談です。それを呼び出すPosi、あなたが好きな場合でも。コンテキストでは、次のプログラマはそれが何を意味するかを簡単に理解できます。

  • 名前がどの程度一般的または具体的であるかに焦点を合わせるときは、それが属するドメインと他の可能な意味のコンテキストを考慮してください。簡単に混同されやすい2つの類似したタイプのアイテムが同じ方法で使用される狭いケースでは、その違いを示す接頭辞または接尾辞を考え出しても構いません。できるだけ短くしてください。

他の回答者が言ったように、ウィンドウに関連する測定値rwTabPositionとドキュメントに関連する測定値を区別するのは、「Apps Hungarian」を始めたこの狭いケースですrdTabPosition。ただし、ドキュメントに関連するすべてを行うアプリケーションでは、余分な作業を追加しないでください!実際、JörgW Mittagのアイデアを使用して、実際の新しいタイプを作成してみませんか?そうすれば、物事を混乱させることはできません。

ほとんどすべての分野で、最小の意味密度を持つものを追加すると、全体的な意味と理解の容易さが低下します。Ben Franklin1つの例を次に示します。また別の例:英語では、言葉を品詞で装飾することができます。もっと情報がありますよね?英語の初心者が困惑した場合、本当に助かりますよね?これを読んで、これが長期的な理解と情報の効率的な伝達にどの程度役立つと思いますか。

vrbDo advnot vrbuse nouハンガリー語cnjor adjany adjother nounotation prepAs nouprogrammersは、「名詞」を使用して動詞の名詞を使用することを推奨します。

追加の情報を、私は完全に痛みが読みと判断しました。

表記を忘れてください。常に追加する特別なプレフィックスは忘れてください。私の意見では、ここでの唯一の本当のガイドラインは次のとおりです。

変数名はできるだけ短く、必要に応じて意味のあるものにし、常に明確にします。


これは、当社の標準とほぼ同じです。唯一の違いは、大文字と小文字が一致するように、名前を付けるときにパスカルケースを使用することです。
DForck42

5

識別子の目的は、そのタイプよりも重要です。プログラムで識別子に説明的な名前を使用する場合、ハンガリー語表記を使用する必要はありません。isConnectedは、常により読みやすく、理解しやすいですboolConnected


2
私は絶対に同意します!これは、「システムハンガリー語」ではなく、「アプリハンガリー語」と呼ばれるものです。
バスティーブ

@bastibe:いいえ、これは彼らが説明的な名前と呼んでいるものです。Apps Hungarianは略語に依存しています。
ジャックB

2

私はC ++プログラマーだったときにハンガリー語を使用していましたが、それは素晴らしかったです。宣言を検索せずに、変数の型(fe BSTR、CString、LPCTSTR、またはchar *)を確認できました。当時は、次のようにして宣言を検索していました。

  1. ctrl-home
  2. ctrl-F
  3. 変数名
  4. 入る

それでかなり重要でした。しかし、2000年頃のどこかで、いくつかのことが起こりました。

  • エディターは、変数タイプをツールチップとして表示するのに十分なほどインテリジェントになりました
  • 編集者には「宣言に移動」ショートカットがあり、簡単に戻る方法がありました。
  • C ++はあまり使用されておらず、他のほとんどの言語では変数の種類が少なくなっています。たとえば、C#では、文字列クラスが1つしかないためlastName、a System.Stringであることは間違いありません。

私はハンガリー語から切り替わる最後の1人でしたが、今では古いソースコードを読んでいると、実際にイライラします。


2

私はハンガリー語の表記が嫌いです。変数名の区切りにはアンダースコアを使用する方が好きです。

さらに、次のように変数名の先頭にタイプを最初の文字として配置すると、float fvelocity; vect vDirection; 文字列** ppszWord;

オートコンプリートはそれらをすべて並べ替えますが、あなたはあなたが望むものを見つけるのに苦労します、そして人々は彼らがより良いと思うものを使う傾向があり、それはもう表記ではありません。

変数について非常に説明する必要があるときにThingsLikeThatを書くのが好きです。スペースを節約し、キャップがあるという事実がそれをより読みやすくするからです。

私が普段やっていることは、最初の文字を大文字、変数名に小文字、変数名にアンダースコアを付けてメソッドとクラスに名前を付けることです(この最後のものが便利だと思います)。

真剣に、私は人々がそれらのルールを気にかけることを好む:関連するスペースでコンマ、算術、中括弧を使用する

void f(int a, char b);
int a = b + 4 / (3 + 4);

1行あたり80文字以下、またはAT MOST 90文字以下で、関数またはlongに複数行の引数を使用しますif

if
(
    checkthat(a, b) == checkthis(b, d) &&
    checkthat(d, b) == checkthis(v, d)
)

1

ほとんどに同意する、それは古いスタイルです。

最新のIDEでは、変数の上にすばやくカーソルを合わせるとタイプが表示されます。


2
これは(IDEが役立つ)貧弱な議論だと思う-あなたがコーディングしているとき、はい、あなたはその恩恵を受けるでしょう。ただし、サポートが利用できない場合(コミット、レビュー、差分/非難など)のケースはいくつもあります。
マーフ

あなたは間違っている!!!!! ;)公正な点、私はまだハンガリー語を使用しません!
オズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.