web-dev-qa-db-ja.com

ハンガリー語表記を使用しないことの利点は何ですか?

私が苦労していることの1つは、ハンガリー語の表記法を使用していないことです。私はしないでください変数の定義に移動して、それがどのタイプかを確認する必要があります。プロジェクトが広範囲に及ぶ場合、 'bool'で始まる変数を調べて、/1ではなくtrue/falseを探していることがわかると便利です。値。

SQL Serverでも多くの仕事をしています。ストアドプロシージャの前に 'sp'を付け、テーブルに 'tbl'を付けます。データベースのすべての変数については言うまでもありません。

ハンガリー記法を本当に使いたくない人がいたらどこでも、彼らがそれを避けられるところまで私は見ます。私の質問は、ハンガリー語の表記法を使用してnotの利点は何ですか、そして開発者の大多数がペストのようにそれを回避するのはなぜですか?

102
user29981

その元々の意図( http://www.joelonsoftware.com/articles/Wrong.htmlhttp://fplanque.net/Blog/devblog/2005/05/11を参照)/hungarian_notation_on_steroids )は誤解されており、使用する言語が静的に型付けされていない場合に、変数の型を覚えるのに使用されています。静的に型付けされた言語では、変数の型を示すためにプレフィックスのバラストを追加する必要はありません。多くの型付けされていないスクリプト言語では役立ちますが、完全に扱いにくくなるまで悪用されることがよくあります。残念ながら、ハンガリーの表記法の本来の意図に戻る代わりに、人々はあなたがそれをあなたが避けなければならない「邪悪な」ものの一つにしただけです。

ハンガリー語の表記は、簡単に言うと、変数の前にいくつかのセマンティクスを付けることを目的としています。たとえば、画面座標(左、上、右、下)がある場合、変数の絶対的な画面位置を "abs"で、変数をウィンドウに相対的な位置で "rel"でプレフィックスします。 」そうすれば、絶対位置を必要とするメソッドに相対座標を渡したときに、どの読者にとっても明白になります。

更新(delnanによるコメントに応じて)

私見虐待されたバージョンはペストのように避けるべきです:

  • 命名が複雑になります。ハンガリー語の表記法を(ab)使用する場合、接頭辞をどの程度具体的にする必要があるかについて常に議論が行われます。例:listboxXYZまたはMyParticularFlavourListBoxXYZ
  • 変数の目的の理解を助けることなく、変数名を長くします。
  • 長い接頭辞を回避するために、これらが略語に短縮され、各略語の意味を知るための辞書が必要な場合は、演習の目的を無効にします。 uiは符号なし整数ですか?参照されないカウントされたインターフェース?ユーザーインターフェイスとは何か?そして、それらはlongを取得できます。 varの正確なタイプを伝えるはずのランダムに見える文字が15個以上のプレフィックスを見たことがありますが、実際には神秘的です。
  • それはすぐに古くなります。変数のタイプを変更する場合、人々は常に(lol)変更を反映するためにプレフィックスを更新するのを忘れるか、またはvarが使用されているすべての場所でコードの変更がトリガーされるため、意図的に更新しないでください...
  • "@g。"となるため、コードの説明が複雑になります。と述べた:ハンガリー語表記の変数名は通常、発音が難しいアルファベットのスープです。これは、名前を「言う」ことができないため、読みやすさとコードの議論を阻害します。
  • ...現時点では思い出せないほどたくさんあります。多分私は長い間乱用されたハンガリー語表記に対処する必要がないという喜びを持っていたからです...
148
Marjan Venema

ハンガリー語の表記法は、現代のプログラミング環境における命名アンチパターンであり、 Tautology の形式です。

情報を無意味に繰り返し、メリットがなく、メンテナンスのオーバーヘッドが増えます。 intlongのような別のタイプに変更するとどうなりますか?すべての変数の名前を変更するには、コードベース全体を検索して置き換える必要があります。そうしないと、意味的に間違っており、名前のタイプを複製していない場合。

これはDRYの原則に違反しています。テーブルであることを思い出させるためにデータベーステーブルの前に略語を付ける必要がある場合、テーブルを意味的に十分に説明的に命名しているわけではありません。同じことが当てはまります。これは、追加のタイピングであり、最新の開発環境では利益も利益もありません。

74
user7519

Wikipedia にはハンガリー表記の利点と欠点のリストがあり、おそらくこの質問に対する最も包括的な答えを提供できます。 注目すべき意見 も非常に興味深い読み物です。

ハンガリー語表記を使用するnotの利点は、基本的にその欠点の回避のみです。

  • コンパイラによって型チェックが行われる場合、ハンガリー語表記は冗長です。型チェックを提供する言語のコンパイラーは、変数の使用がその型と自動的に一致することを保証します。目視によるチェックは冗長であり、人為的エラーの影響を受けます。

  • 最新の統合開発環境はすべて、必要に応じて変数型を表示し、互換性のない型を使用する操作に自動的にフラグを付けるため、表記法はほとんど廃止されています。

  • ハンガリー表記は、a_crszkvc30LastNameColのようにいくつかのプロパティを表すために使用すると混乱を招きます。定数参照引数であり、一部であるvarchar(30)タイプのデータベース列LastNameの内容を保持していますテーブルの主キーの。

  • コードが変更または移植されると、不整合が生じる可能性があります。変数の型が変更された場合、変数の名前の装飾が新しい型と一致しないか、変数の名前を変更する必要があります。特によく知られている例は、標準のWPARAM型と、多くのWindowsシステム関数宣言の付随するwParam仮パラメーターです。 「w」は「Word」を表し、「Word」はプラットフォームのハードウェアアーキテクチャのネイティブのWordサイズです。それは元々、16ビットWordアーキテクチャでは16ビットタイプでしたが、32ビットWordアーキテクチャでは32ビット、64ビットWordアーキテクチャではそれ以降のバージョンのオペレーティングシステムで64ビットタイプに変更されました。元の名前(その真の基本型はUINT_PTR、つまり、ポインターを保持するのに十分な大きさの符号なし整数です)。セマンティックインピーダンス、つまりプログラマーの混乱とプラットフォーム間の不整合は、「w」がこれらの異なる環境での16ビットを表すという仮定に基づいています。

  • ほとんどの場合、変数の使用を知ることは、その型を知ることを意味します。さらに、変数の使用法が不明な場合、その型から推定することはできません。

  • プログラマは最初に型指定子全体を入力する必要があるため、ハンガリー語表記は、変数名の補完をサポートする機能豊富なコードエディタを使用する利点を大幅に減らします。

  • 不要な型とスコーププレフィックスを使用して変数の目的を難読化することにより、コードを読みにくくします。

  • 追加のタイプ情報は、説明的な名前を十分に置き換えることができません。例えば。 sDatabaseは、それが何であるかを読者に伝えません。 databaseNameの方がわかりやすい名前になる場合があります。

  • 名前が十分に説明的である場合、追加のタイプ情報は冗長になる可能性があります。例えば。 firstNameはおそらく文字列です。したがって、sFirstNameという名前を付けても、コードが煩雑になるだけです。

私はこの表記を使用しません。不要な技術的なノイズが嫌いだからです。ほとんどの場合、処理する型を知っており、ドメインモデルでクリーンな言語を使用したいのですが、主に静的で強く型付けされた言語で記述します。

51
Falcon

MS SQL Server固有の問題として:

接頭辞が「sp_」のストアドプロシージャは、作成されたストアドプロシージャではなく、まずMasterデータベースで検索されます。これにより、実行されるストアドプロシージャに遅延が発生します。

19
tsundoku

IMOハンガリー語を使用しない最大の利点は、意味のある名前を使用する必要があるという事実です。変数に適切な名前を付けている場合は、変数のタイプをすぐに把握するか、適切に設計されたシステムでかなり迅速に変数を推定できる必要があります。変数のタイプを知るためにstrまたはblnまたはすべてのobj接頭辞に依存する必要がある場合は、名前の問題を示していると思います-変数の質が悪い一般的な名前、または意味を伝えるには一般的すぎる名前。

皮肉なことに、私がハンガリーで使用した主なシナリオは、個人的な経験から「カーゴカルト」プログラミング(つまり、他のコードが使用しているので、それをそのまま使用し続ける)、またはVB.NETで言語が実際に使用されていることを回避することです大文字と小文字を区別しません(例:Person oPerson = new Personは使用できません。Person person = new Personは使用できず、Person p = new Personは曖昧すぎます)。その特定のケースでは、代わりに "the"または "my"を前に付けることも見ました(Person thePerson = new Personまたは醜い人Person myPerson = new Personのように)。

私はonlyを追加します。ハンガリー語を使用する時間はASP.NETコントロール用である傾向があり、それは本当に選択の問題です。 TextBoxCustomerNameCustomerNameTextBoxを入力するのは、単純なtxtCustomerNameと比べて非常に醜いですが、それでも「汚い」と感じます。同じデータを表示する複数のコントロールが存在する可能性があるため、コントロールにはsome種類の命名規則を使用する必要があると思います。

15
Wayne Molina

あなたがそれを言ったので、私はSQL Serverに焦点を合わせます。テーブルの前に 'tbl'を置く理由はありません。任意のtSQLコードを見て、使用方法によってテーブルを区別することができます。 UDFのように_Select from stored_procedure._またはSelect from table(with_param)を実行することは決してなく、ストアドプロシージャのように_Execute tblTableOrViewName_を実行することもありません。

テーブルはビューと混同される可能性がありますが、それがどのように使用されるかになると、違いはないので、ポイントは何ですか?ハンガリー語表記を使用すると、SSMSで(テーブルまたはビューの下で)検索する時間を節約できますが、それだけです。

変数は問題を引き起こす可能性がありますが、変数を宣言する必要があります。実際には、宣言ステートメントからどれくらい離れて変数を使用する予定ですか。非常に長い手順を書いているのでない限り、数行をスクロールすることはそれほど大きな問題ではありません。長いコードを少し分解することをお勧めします。

あなたが説明するのは苦痛ですが、ハンガリー記法の解決策は実際には問題を解決しません。あなたは誰か他の人のコードを見て、変数の型が変更されるかもしれないことを見つけることができます。今度は変数名を変更する必要があります。もう1つ忘れる必要があります。また、VarCharを使用する場合は、とにかくdeclareステートメントを調べてサイズを知る必要があります。わかりやすい名前を付けると、さらにわかりやすくなります。 @PayPeriodStartDateはそれ自体を説明しています。

13
JeffO

私の物事の見方では、ハンガリー記法は不十分な強力な型システムを回避するための陰謀です。独自の型を定義できる言語では、期待する動作をエンコードする新しい型を作成するのは比較的簡単です。ハンガリー記法に関するJoel Spolskyの発言で、変数または関数が安全ではない(us)か安全である(s)のいずれかであることを示すことにより、XSS攻撃の可能性を検出する例を示していますが、それでもプログラマーは視覚的に確認する必要があります。代わりに拡張可能な型システムがある場合は、UnsafeStringとSafeStringの2つの新しい型を作成し、必要に応じてそれらを使用できます。おまけとして、エンコードのタイプは次のようになります。

SafeString encode(UnsafeString)

unsafeStringの内部にアクセスしたり、他の変換関数を使用したりしないと、UnsafeStringからSafeStringに移動する唯一の方法になります。すべての出力関数がSafeStringのインスタンスのみを取得する場合、エスケープされていない文字列を出力することができなくなります[StringToSafeString(someUnsafeString.ToString())などの変換による不正行為を防止]。

型システムにコードのサニティチェックを許可するほうが、手動またはこの場合は目で確認するよりも優れている理由は明らかです。

もちろん、Cなどの言語では、intはintであり、intはintであり、そのためにできることは多くないということに夢中になっています。あなたはいつでも構造体でゲームをプレイすることができますが、それが改善であるかどうかは議論の余地があります。

ハンガリー記法の他の解釈については、I.E。変数のタイプを前に付けると、それは単なる愚かで、countOfPeopleのような意味のあるものではなく、変数uivxwFooに名前を付けるといった怠惰な慣行を奨励します。

6
Orclev

追加するもう1つのことは、.NETのようなフレームワーク全体にどの略語を使用するかということです。うん、btnがボタンを表し、txtがテキストボックスを表すことを覚えるのはとても簡単です。しかし、StringBuilderのようなものに対して何を考えていますか? strbldCompositeWebControlはどうですか?次のようなものを使用しますか?

CompositeWebControl comWCMyControl = new CompositeWebControl();

ハンガリー語の表記法の非効率性の1つは、ますます大きなフレームワークを使用することにより、追加の利点を追加するだけでなく、非標準の接頭辞をますます学習する必要があるため、開発者にとってさらに複雑になることを証明したことです。

6
Saeed Neamati

ハンガリー語の表記法は、静的に型付けされた言語ではほとんど完全に役に立ちません。これは基本的なIDE機能であり、変数の上にマウスを置くことによって、または他の方法で変数の型を表示します。さらに、型が何であったかを、それがどこにあったかを数行調べることで確認できます型推論がない場合に宣言されます。型推論の要点は、型のノイズがどこでも繰り返されないようにすることです。そのため、ハンガリー語の表記は、型推論を持つ言語では通常悪いことと見なされます。

動的に型付けされた言語では、それが役立つこともありますが、私には慣用的な感じがします。あなたはすでに正確なドメイン/コドメインに制限されている関数をあきらめました。すべての変数がハンガリー語の表記で名前が付けられている場合は、型システムによって与えられたものを再現しているだけです。整数または文字列にすることができる多態変数をハンガリー語表記でどのように表現しますか? 「IntStringX」? 「IntOrStringX」?私がこれまでにハンガリー語の表記を使用した唯一の場所は、アセンブリシステムのコードでした。これは、型システムがある場合に得られるものを取り戻そうとしていたためであり、これが初めてコード化したものです。

とにかく、私は人々が変数に名前を付けることをあまり気にすることができませんでしたが、コードはおそらく同じように理解できないでしょう。開発者はスタイルや変数の名前などに時間をかけすぎ、結局のところ、言語がまったく異なる規則を持つ多数のライブラリーを入手できます。変数名がなく、一意の識別子のみがあり、変数の推奨名がある(つまり、テキストベースではない)シンボリック言語を開発しています(ただし、ほとんどの変数には提案された名前がありません単に存在しないため)それらの適切な名前);信頼できないコードを監査する場合、変数名に依存することはできません。

4
Longpoke

いつものように、他の参加者からの回答を読む前に回答を投稿します。

あなたのビジョンには3つの「バグ」が見られます。

1)変数/パラメーター/属性/列のタイプを知りたい場合は、マウスをホバーするかクリックすると、最新のIDEで表示されます。どのツールを使用しているかはわかりませんが、この機能を提供しない環境で作業することを余儀なくされたのは20世紀のことでした。言語はCOBOLでしたが、おっと、Fortranでもなく、上司でもありました。なぜ私が去ったのか理解できませんでした。

2 /タイプは、開発サイクル中に変更される場合があります。 32ビット整数は、プロジェクトの開始時に検出されなかった正当な理由により、ある時点で64ビット整数になる可能性があります。したがって、intXをlongXに名前変更するか、間違った型を指す名前を付けて残すことは、悪いカルマです。

3)あなたが求めているのは、実際には冗長性です。冗長性は、デザインパターンや習慣があまりよくありません。人間でさえ冗長性が多すぎることに消極的です。人間でさえ冗長性が多すぎることに消極的です。

3
Oqaqiq

ハンガリー語を切実に必要としているのはa症状だと思います。
too many global variables...または関数too long to mantainable /の症状。

変数の定義が見えない場合は、通常、問題があります。
そして、もしあなたの関数がmemorable規約に従わない場合、再び大きな問題が発生します。

それが…多くの職場がそれを打ち出す理由のほとんどだと思います。

それはlanguagesを起源としており、必要としました
global variables bonanzaの時間。 (代替案がないため)
それは私たちによく役立ちました。

今日私たちが実際に使用しているのは Joel Spolskyone だけです。
safetyのように、変数のいくつかの特定の属性を追跡します。

「変数safeFoobarには、SQLクエリに挿入される青信号がありますか?
safeと呼ばれるため、そうです」)

他のいくつかの回答では、カーソルを合わせたときに変数の型を確認するのに役立つエディターの機能について説明しました。私の見解では、それらもコードの健全性の問題のようなものです。他の多くの機能(関数の折りたたみなど)と同じように、リファクタリングのみであり、新しいコードでは使用しないでください。

3
ZJR

ハンガリー語の表記を使用しない理由は、他のポスターで十分にカバーされていると思います。私は彼らのコメントに同意します。

データベースでは、コードでほとんど使用されないDDLオブジェクトにハンガリー語表記を使用しますが、それ以外の場合は名前空間で衝突します。これは主に、インデックスと名前付き制約のタイプ(PK、UK、FK、およびIN)を前に付けることになります。一貫したメソッドを使用してこれらのオブジェクトに名前を付ければ、メタデータをクエリすることでいくつかの検証を実行できるはずです。

2
BillThor

次のようなメソッドがあるとします(C#の場合):

int GetCustomerCount()
{
    // some code
}

コードでは、次のように呼び出します。

var intStuff = GetCustomerCount();
// lots of code that culminates in adding a customer
intStuff++;

intはあまりわかりません。何かがintであるという単なる事実は、その中に何があるのか​​を教えてくれません。代わりに、次のように呼び出すとしましょう。

var customerCount = GetCustomerCount();
// lots of code that culminates in adding a customer
customerCount++;

これで、変数の目的がわかります。それがintであることがわかっている場合、問題になりますか?

しかし、ハンガリー語の本来の目的は、次のようなことをさせることでした。

var cCustomers = GetCustomerCount();
// lots of code that culminates in adding a customer
cCustomers++;

cが何を表すのかを知っている限り、これは問題ありません。しかし、プレフィックスの標準的なテーブルが必要であり、誰もがプレフィックスを知る必要があり、新しい人はコードを理解するためにプレフィックスを学習する必要があります。一方、customerCountまたはcountOfCustomersは一見すると非常に明白です。

ハンガリー語はVBの前にOption Strict On VB6以前(およびVB .NET with Option Strict Off)VBは型を強制するため、これを行うことができます:

Dim someText As String = "5"
customerCount = customerCount + someText

これは悪いことですが、コンパイラーはそうはしません。したがって、ハンガリー語を使用している場合は、少なくとも何が起こっているかを示す何らかの指標が得られます。

Dim strSomeText As String = "5"
intCustomerCount = intCustomerCount + strSomeText  // that doesn't look right!

.NETでは、静的型付けの場合、これは必要ありません。そしてハンガリー語は、良いネーミングの代用として頻繁に使用されました。ハンガリー語を忘れて、代わりに良い名前を選んでください。

1
Kyralessa

これが回避される理由は、DRYに違反するハンガリー語のシステムが原因です(接頭辞は、コンパイラと(良い)とまったく同じタイプであり、IDEが導出できる))

アプリハンガリー語O.T.O.H.変数のseの接頭辞(つまり、scrxMouseは画面上のx座標です。これは、int、short、long、またはカスタムタイプでさえあります(typedefを使用すると、簡単に変更できます))

システムの誤解がハンガリー語をベストプラクティスとして破壊したものです

1
ratchet freak

私が今でもハンガリー語または類似のサフィックスを定期的に使用している1つの場所は、データ変換のように、同じセマンティックデータが2つの異なる形式で存在する場合です。これは、測定単位が複数ある場合や、複数の形式がある場合(例:文字列 "123"と整数123)です。

私はそれを使用しない理由をここに示した理由は、課せないハンガリー人にとっては説得力がありますが、あなた自身の慣行を決定するためにほんの少し示唆的です。

プログラムのソースコードは、それ自体がユーザーインターフェイスであり、アルゴリズムとメタデータをメンテナに表示します-ユーザーインターフェースの冗長性は美徳であり、罪ではありません。たとえば、「 The Design of Everyday Things 」の写真を見て、「Push」というラベルの付いたドアを引っ張るように見てください。また、ビールタップで、オペレーターが重要な核にハッキングしました。どういうわけか「IDEでそれらをホバーする」だけでは十分ではなかったので、reactorの制御。

「IDEでのホバー」はnotハンガリー語を使用しない理由です-理由のみsome人々はそれが役に立たないと思うかもしれません。あなたの走行距離は異なる場合があります。

変数の型が変更されたときにハンガリー語が保守に大きな負担をかけるという考えはばかげています-変数の型をどのくらいの頻度で変更しますか?その上、変数の名前を変更するのは簡単です:

IDEを使用して、すべてのオカレンスの名前を変更します。-Gander、Gooseに返信

ハンガリー語が実際にコードの一部を素早く理解し、確実に維持するのに役立つ場合は、それを使用してください。そうでない場合は、しないでください。他の人があなたがあなた自身の経験について間違っているとあなたに言ったら、私はそれらがおそらく間違っているものであることをお勧めします。

1
Ed Staub

私はそれに反対する多くの良い議論を見つけましたが、私が見なかった1つは人間工学です。

以前は、string、int、bool、floatしかなかった場合、sibfの文字で十分でした。しかし、string + shortを使用すると、問題が発生します。接頭辞に完全な名前を使用するか、文字列にstr_nameを使用しますか? (名前はほとんど常に文字列ですが、そうではありませんか?)Streetクラスには何がありますか?名前はどんどん長くなり、CamelCaseを使用しても、type-prefixがどこで終わり、variable-nameがどこで始まるかを知るのは困難です。

 BorderLayout boderLayoutInnerPanel = new BorderLayout ();
 panelInner.addLayout (borderLayoutInnerPanel);

わかりました-下線をまだ他のものに使用していない場合は下線を使用できます。または、下線を長く使用している場合はキャメルケースを使用できます。

 BorderLayout boderLayout_innerPanel = new BorderLayout ();
 panel_inner.addLayout (borderLayout_innerPanel);

 Border_layout boder_layoutInner_panel = new Border_layout ();
 panelInner.add_layout (border_layoutInner_panel);

それは巨大であり、結果としてそれを行うと、あなたは

 for (int iI = 0; iI < iMax-1; ++iI)
     for (int iJ = iI; iJ < iMax; ++iMax) 
          int iCount += foo (iI, iJ); 

ループ変数やcountのような些細な場合には、役に立たない接頭辞を使用することになります。最近、いつカウンターにショートまたはロングを使用しましたか?例外を設けると、接頭辞が必要かどうかを考えて時間を失うことがよくあります。

多くの変数がある場合、それらは通常、IDEの一部であるオブジェクトブラウザーにグループ化されます。 40%がin_の場合はi_で始まり、40%の場合は文字列でs_で始まり、アルファベット順にソートされている場合、名前の重要な部分を見つけるのは困難です。

1
user unknown