Was ist der Reiz von Systems Hungarian? [geschlossen]

18

In Welche Benennungsrichtlinien befolgen Sie? sagt der Autor:

Außerdem bevorzuge ich es, ungarische Notation von Charles Simonyi zu verwenden.

Ich habe einige Programmierer kennengelernt, die immer noch lieber Ungarisch verwenden, hauptsächlich mit dem ungarischen Petzold / Systems-Geschmack. Denken Sie nach dwLength = strlen(lpszName).

Ich habe " Falschen Code falsch aussehen lassen" gelesen und die Gründe für Apps Hungarian verstanden, bei denen domänentypische Informationen in den Variablennamen enthalten sind. Aber ich verstehe den Wert nicht, wenn ich den Compilertyp an den Namen anpasse.

Warum verwenden Programmierer diesen Notationsstil immer noch? Ist es nur Trägheit? Gibt es irgendwelche Vorteile, die die verminderte Lesbarkeit aufwiegen? Lernen die Leute nur, die Dekorateure zu ignorieren, wenn sie den Code lesen, und wenn ja, wie setzen sie ihre Wertschöpfung fort?

BEARBEITEN: Viele Antworten erklären die Geschichte oder warum sie nicht mehr relevant sind. Beides wird in dem von mir zitierten Artikel behandelt.

Ich würde wirklich gerne von jemandem da draußen hören, der es noch benutzt. Warum benutzt du es? Ist es in deinem Standard? Würden Sie es verwenden, wenn es nicht erforderlich wäre? Würden Sie es für ein neues Projekt verwenden? Was sehen Sie als die Vorteile?

Ahelly
quelle
5
Die ungarische Notation war der letzte Schrei, als ich in der IT anfing, aber es war eine vollständig codierende Umgebung. Ein einfacher Texteditor ohne Syntaxhervorhebung, Intellisense- und Codedateien, die mehrere hundert Zeilen lang sind und alle am Anfang deklarierten Variablen enthalten. Es hat das Leben einfacher gemacht, herauszufinden, womit Sie es zu tun hatten. Mit modernen Werkzeugen und Praktiken ist die Notwendigkeit jedoch nach meiner Wahl verschwunden, und es sollte wirklich in die Geschichte
eingehen
1
Ich habe das vor Jahren benutzt und mochte es nie sehr. Ich vermisse es überhaupt nicht.
MetalMikester
imo das größte Problem dabei war die Verwendung von Präfixen anstelle von Suffixen - selbst in ungarischen Apps enthält die "Warze" normalerweise weniger semantische Informationen als der Rest des Namens
jk.

Antworten:

38

Im Moment benutze ich immer noch Ungarisch aus genau drei Gründen , um es für alles andere vernünftig zu vermeiden :

  1. Um bei der Wartung mit einer vorhandenen Codebasis konsistent zu sein.
  2. Für Steuerungen, z. "txtFirstName". Wir müssen oft zwischen (sagen wir) "firstName" dem Wert und "firstName" dem Steuerelement unterscheiden. Ungarisch bietet eine bequeme Möglichkeit, dies zu tun. Natürlich könnte ich "firstNameTextBox" eingeben, aber "txtFirstName" ist genauso einfach zu verstehen und besteht aus weniger Zeichen. Darüber hinaus bedeutet die Verwendung von Ungarisch, dass Steuerelemente desselben Typs leicht zu finden sind und in der IDE häufig nach Namen gruppiert werden.
  3. Wenn zwei Variablen den gleichen Wert haben, sich jedoch nach Typ unterscheiden. Beispiel: "strValue" für den vom Benutzer tatsächlich eingegebenen Wert und "intValue" für denselben Wert, nachdem er wie eine Ganzzahl analysiert wurde.

Ich würde meine Ideen sicherlich nicht als Best Practice etablieren wollen, aber ich befolge diese Regeln, da mir die Erfahrung zeigt, dass die gelegentliche Verwendung des ungarischen Vorteilscodes zwar wartbar ist, aber wenig kostet. Das heißt, ich überprüfe ständig meine eigene Praxis, kann also etwas anderes tun, wenn sich meine Ideen entwickeln.


Aktualisieren:

Ich habe gerade einen aufschlussreichen Artikel von Eric Lippert gelesen , in dem erklärt wird, wie Ungarisch dazu beitragen kann, dass falscher Code falsch aussieht. Gut lesenswert.

Kramii setzt Monica wieder ein
quelle
Hervorragende Antwort, Firefly beantwortet die gestellte Frage.
AShelly
habe gerade die kreative Bearbeitung meines iPhones bemerkt ... gsub ('firefly', 'fully');
AShelly
5
+1 für die Verwendung von Quasi-Ungarisch zur Vereinfachung der Gruppierung von UI-Steuerelementen in der IDE. Dies ist die einzige Verwendung, die für neue Projekte noch Sinn macht, und ohne sie könnte ich einfach nicht leben. Ich weiß oft, dass ein Steuerelement ein Textfeld ist, weiß aber nicht, ob es "Vorname" oder nur "Name" heißt.
Cody Grey
2
Ich stimme dieser Antwort zu. Wenn Sie intValue und strValue verwenden, können Sie es auch als valueAsInt und valueAsStr anzeigen. Ich weiß also nicht, ob ich diese ungarische Notation berücksichtige. Es ist eher so, dass int und str Teil des Variablennamens sind.
Michel Keijzers
2
2 Ich bevorzuge vollständige Suffixe, weil Präfixe ziemlich albern werden können (was ist ein tssboder ein tsddi? Ja, sie existieren). Abkürzungen haben auch das Problem der Homogenität. Dabei kann TextBoxes zu Inkonsistenzen kommen, ob dies der Fall ist tboder txt(ich persönlich habe gesehen, dass ein "älterer" Entwickler beide in einem einzigen Fenster verwendet). Für 3 lösche ich das Ungarische, wenn die Variable ihren endgültigen beabsichtigten Typ erreicht (z. B. würde ich valueund strValuein Ihrem Beispiel verwenden).
Jonathan Dickinson
6

Ich bin kein großer Fan der ungarischen Notation, aber denke so:

  • Wir können auch feststellen, dass es schneller ist, eine Zeichenfolge zu finden, die auf eine TextBox in Ihrem Code verweist: Geben Sie "txt" in Ihr Suchfeld ein.

Kein Bild vom Gegenteil, bei dem jedes Element einen eigenen Namen hat. Es könnte für Sie langsamer sein, zu finden, wohin Sie wollen, oder?

Dasselbe gilt für ddl, wenn wir auf eine DropDownList verweisen möchten. Ist das einfacher oder nicht? :)

Die Leute verbringen nicht so viel Zeit damit, herauszufinden, wo sich dieses Element befindet.

Die Verwendung des Präfixes ist für moderne Sprachen-Compiler wie C # nicht verwendbar, aber für Menschen verwendbar (lesbar) .

Junior M
quelle
Dies ist das beste Beispiel für den praktischen Wert, den ich gehört habe. (Aber immer noch nicht genug, um mich dazu zu bringen, es zu adoptieren :)
AShelly
1
Präfixe waren nie für Compiler, immer für Menschen. Was sich geändert hat, sind nicht die Compiler, sondern die IDEs, die Typinformationen und effektivere Möglichkeiten zum Navigieren im Code bereitstellen.
Jeremy
Das Gleiche mache ich mit Variablen und (besonders) Widgets - und gebe ihnen oft kurze Präfixe, um ihren Typ zu kennzeichnen. Aber nicht bis zu dem Punkt, dass sie "voll und ganz ungarisch" werden.
GroßmeisterB
4

Apps Hungarian (Tags zur Bezeichnung der semantischen Eigenschaften von Objekten, die nicht durch das Typensystem ausgedrückt werden können) war eine vernünftige Methode, um mit einigen häufigen Fehlern umzugehen, wenn man die schwach typisierten Sprachen der frühen 1980er Jahre verwendete. Sie haben in den heutigen stark typisierten Sprachen wenig Sinn.

Ungarische Systeme (Tags, mit denen der deklarierte Typ eines Objekts redundant bezeichnet wird) haben nie einen Zweck erfüllt, außer einer Codebasis ein oberflächlich einheitliches Erscheinungsbild aufzuerlegen. Es wurde von nicht-technischen Managern und unerfahrenen Programmierern erstellt und verbreitet, die die Absicht von Apps Hungarian missverstanden haben und der Ansicht waren, dass die Codequalität durch komplexe Codierungsrichtlinien verbessert werden könnte.

Beide Stile stammen von Microsoft. In diesen Tagen lauten die Namenskonventionen von Microsoft kategorisch "Verwenden Sie keine ungarische Notation."

Mike Seymour
quelle
4

Wenn Sie sich das richtige Präfix-System einfallen lassen, können Sie die Abnutzung Ihrer Tasten verteilen und so die Ausgaben für Ersatztastaturen senken.


Ich nehme an, ich könnte das erweitern. Ich habe SH in den letzten zehn Jahren an meinem Arbeitsplatz verwendet (weil es in unserem Standard enthalten ist). Es hat noch nie geholfen, ein Problem zu lösen.

Andererseits habe ich fast genauso lange schmucklose, aber gut benannte Variablen in meinem 'Home-Code' verwendet. Ich habe SH noch nie verpasst.

An beiden Stellen habe ich Protokollcode geschrieben, der primitive Typen mit fester Größe erfordert. Dies ist der günstigste Anwendungsfall für SH. Es hat nicht geholfen, dass ich mit SH schreiben kann, und es hat mich nicht behindert, wenn ich ohne SH schreibe.

Zusammenfassend ist der einzige Unterschied, den ich feststellen kann, die Abnutzung Ihrer Tastatur.

Kaz Dragon
quelle
1
wie der Sarkasmus dort :)
JohnL
4

Ich habe tatsächlich angefangen, SH in neuem Code zu verwenden, den ich diesen Monat geschrieben habe.

Meine Aufgabe bestand darin, etwas Perl-Code in JS neu zu schreiben, damit er auf die Clientseite unserer Webanwendung verschoben werden konnte. In Perl wird SH im Allgemeinen aufgrund von Siegeln ($ string, @array,% hash) nicht benötigt.

In JavaScript stellte ich fest, dass SH von unschätzbarem Wert ist, um die Arten von Datenstrukturen zu verfolgen. Beispielsweise,

var oRowData = aoTableData[iRow];

Dies ruft ein Objekt aus einem Array von Objekten unter Verwendung eines Ganzzahlindex ab. Das Einhalten dieser Konvention ersparte mir einige Zeit beim Nachschlagen von Datentypen. Außerdem können Sie prägnante Variablennamen ( oRowvs. iRow) überladen .

tl; dr: SH kann großartig sein, wenn Sie komplexen Code in einer schwach getippten Sprache haben. Aber wenn Ihre IDE Typen verfolgen kann, ziehen Sie das vor.

Stefan Majewsky
quelle
2

Ich bin auch gespannt auf die Gründe. Wir wissen, warum sie es in der Vergangenheit verwendet haben: Fehlende IDE-Unterstützung für Typinformationen. Aber jetzt? Einfach gesagt, ich denke, es ist eine Tradition. C ++ - Code sah immer so aus. Warum also etwas ändern? Außerdem, wenn Sie auf dem vorherigen Code aufbauen, der die ungarische Notation verwendet, würde es ziemlich seltsam aussehen, wenn Sie plötzlich damit aufhören ...

Paweł Dyda
quelle
2
C ++ - Code sah nicht immer so aus - lesen Sie das Bjarne Stroustrup-Buch.
JBRWilkinson
@JBRWilkinson: Charles Simonyi hat um 1976 die ungarische Notation erstellt ( c2.com/cgi/wiki?HungarianNotation ). Diese Notation ist also älter als C ++. Viele, wenn nicht die meisten C ++ - Programmierer verwenden es seit dem ersten Tag (also seit ihrer Codierung). Ich verstehe, dass Bjarne Stroustrup eine bemerkenswerte Ausnahme ist, ebenso wie Linus Torvalds, aber es ändert nichts an den Fakten.
Paweł Dyda
2
Ich denke, Ungarisch war immer in erster Linie eine Microsoft-Sache. Ich habe nicht gesehen, dass es in Unix- und Unix-ähnlichen Umgebungen häufig verwendet wird.
David Thornley
2

Die ungarische Systemnotation war in der Tat ein bisschen verrückt, ein Missverständnis des Begriffs "Typ". Die Systementwickler haben es wörtlich als Compiler-Typ (Wort, Byte, Zeichenfolge, ...) und nicht als Apps-Domänentyp (Zeilenindex, Spaltenindex, ...) verstanden.

Aber ich vermute, dass jeder Entwickler mehrere Stilphasen durchläuft, die zu der Zeit eine großartige Idee zu sein scheinen (und das Präfixieren des Typs scheint für Anfänger eine gute Idee zu sein), bevor er in die Fallstricke gerät (den Typ wechseln, neue, aussagekräftige Präfixe erstellen, etc). Ich denke, es gibt eine Trägheit: von Entwicklern, die nicht besser werden und erkennen, warum es eine schlechte Wahl ist, von Entwicklern, die sich an Kodierungsstandards halten, die die Praxis vorschreiben, und von Anwendern <windows.h>. Es wäre für Microsoft zu kostspielig, Änderungen vorzunehmen, um die Präfixnotation zu entfernen (die vielerorts falsch ist: WPARAM?).

Skizz
quelle
1
Auch die beabsichtigte Verwendung ist nicht optimal, da ein privates Typsystem erstellt wird, das der Compiler nicht kennt und daher nicht überprüfen kann.
Larry Coleman
@ Larry: Auch wenn dies sicherlich zutrifft, gibt es eine Software, die den Quellcode analysieren und überprüfen kann, ob der Code einem Standard entspricht. Sie können möglicherweise sicherstellen, dass Präfixe in Ausdrücken übereinstimmen.
Skizz
1
Mein Ideal bei der Verwendung der statischen Typisierung ist, dass die Menge der Compilertypen eine Obermenge der Menge der Domänentypen ist. Dann kann der Compiler alles überprüfen, ohne dass Add-Ons erforderlich sind.
Larry Coleman
0

Es gibt eine Sache, die die Leute mit Ungarisch vermissen. Die ungarische Notation funktioniert mit Autocomplete sehr gut.

Angenommen, Sie haben eine Variable und der Name lautet intHeightOfMonster.

Angenommen, Sie haben den Namen der Variablen vergessen

Es könnte heightOfMonster oder MonsterHeight oder MeasurementMonsterHeight sein

Sie möchten in der Lage sein, einen Buchstaben einzugeben und sich von der automatischen Vervollständigung einige Variablennamen vorschlagen zu lassen.

Da Sie wissen, dass heightOfMonster ein Int ist, geben Sie einfach i und voila ein.

Zeit sparen.

user114310
quelle