Ungarische Notation
Ungarische Notation ist ein Identifikator -Namenskonvention in Computerprogrammierung, in dem der Name von a Variable oder Funktion zeigt seine Absicht oder Art an und in einigen Dialekten seine Typ. Die ursprüngliche ungarische Notation verwendet Absicht oder Art in seiner Namenskonvention und wird manchmal Apps ungarisch bezeichnet, da sie in der Microsoft Apps Division in der Entwicklung von Wort, Excel und anderen Apps beliebt wurde. Als die Microsoft Windows -Division die Namenskonvention übernahm, verwendeten sie den tatsächlichen Datentyp für die Benennung, und diese Konvention wurde weit verbreitet über die Windows -API; Dies wird manchmal als System -ungarische Notation bezeichnet.
Simonyi: ... BCPL [hatte] einen einzelnen Typ, der ein 16-Bit-Wort war ... nicht, dass es wichtig ist.
Booch: Es sei denn, Sie setzen die ungarische Notation fort.
Simonyi: Absolut ... wir gingen auch zu den getippten Sprachen später ... aber ... wir würden uns einen Namen ansehen und ich würde Ihnen genau viel darüber erzählen ...[1]
Die ungarische Notation wurde als sprachunabhängig und fand seine erste große Verwendung mit dem BCPL Programmiersprache. Weil BCPL keine anderen Datentypen als die Maschine hat WortNichts in der Sprache selbst hilft einem Programmierer, sich an Variablentypen zu erinnern. Die ungarische Notation zielt darauf ab, dies zu beheben, indem der Programmierer explizit über den Datentyp der einzelnen Variablen verfügt.
In der ungarischen Notation beginnt ein variabler Name mit einer Gruppe von Briefen unter Niederlassung, die sind Mnemonik Für den Typ oder den Zweck dieser Variablen, gefolgt von jedem Namen, den der Programmierer gewählt hat; Dieser letzte Teil wird manchmal als der unterschieden Vorname. Das erste Zeichen des angegebenen Namens kann aktiviert werden, um ihn von den Typindikatoren zu trennen (siehe auch Kamelase). Andernfalls bezeichnet der Fall dieses Charakters den Umfang.
Geschichte
Die ursprüngliche ungarische Notation wurde von erfunden von Charles Simonyi, ein Programmierer, der bei der Arbeit gearbeitet hat Xerox Parc circa 1972–1981 und der später Chefarchitekt wurde Microsoft. Der Name der Notation ist ein Hinweis auf Simonyis Herkunftsnation und auch laut Andy Hertzfeld, weil es Programme "so aussehen, als wären sie in einer unergründlichen Fremdsprache geschrieben".[2] Namen der ungarischen Leute sind im Vergleich zu den meisten anderen europäischen Namen "umgekehrt"; Der Familienname geht dem angegebenen Namen voraus. Zum Beispiel der anglisierte Name "Charles Simonyi" in ungarisch war ursprünglich "Simonyi Károly". Auf die gleiche Weise geht der Typname dem "angegebenen Namen" in der ungarischen Notation voraus. Das ähnliche Smalltalk "Typ Last" -Namenstil (z. B. afort und lastpoint) war bei Xerox Parc während der Amtszeit von Simonyis dort häufig.
Simonyis Papier über die Notation, die auf Präfixe verwiesen wird, um den "Typ" von Informationen "anzuzeigen, die gespeichert werden.[3][4] Sein Vorschlag befasste sich größtenteils mit der Dekoration von Bezeichnungsnamen auf der Grundlage der semantischen Informationen über das, was sie speichern (mit anderen Worten, die Variablen der Variablen Zweck). Simonyis Notation wurde Apps Ungar namens Apps, da die Konvention in der verwendet wurde Anwendungen Abteilung von Microsoft. Systeme ungarisch entwickelt sich später in der Microsoft Windows Entwicklungsteam. Apps ungarisch unterscheidet sich nicht ganz von dem, was als System -Ungarn bekannt wurde, da einige der vorgeschlagenen Präfixe von Simonyi nur kleine oder keine semantischen Informationen enthalten (siehe unten für Beispiele).[4]
Systeme ungarisch gegen Apps Ungarisch
Wenn sich Systemnotation und Apps -Notation unterscheiden, liegt der Zweck der Präfixe.
In Systems ungarischer Notation codiert das Präfix den tatsächlichen Datentyp der Variablen. Zum Beispiel:
-
lacountnum
: Variable ist a lange Ganzzahl ("L"
); -
arrU8Numberlist
: Variable ist ein array von uNSIGNED 8-bit Ganzzahlen ("arru8"
); -
Breadline (BPORT, & arru8Numberlist)
: Funktion mit einem Byte-Wert-Rückgabecode. -
Strname
: Variable repräsentiert eine Zeichenfolge ("Str"
) Enthält den Namen, gibt jedoch nicht an, wie diese Zeichenfolge implementiert wird.
Apps Ungarische Notation bemüht sich, den logischen Datentyp anstelle des physischen Datentyps zu codieren. Auf diese Weise gibt es einen Hinweis darauf, was der Zweck der Variablen ist oder was es darstellt.
-
rwposition
: variable repräsentiert a die Zeile ("RW"
); -
USNAME
: Variable repräsentiert eine Unsichere Zeichenfolge ("uns"
), was "sanitiert" werden muss, bevor es verwendet wird (z. B. siehe Codeinjektion und Cross-Site-Scripting Beispiele für Angriffe, die durch die Verwendung von Rohbenutzereingaben verursacht werden können) -
szname
: Variable ist a zERO-terminiert sTring ("SZ"
); Dies war eines von Simonyis ursprünglichen vorgeschlagenen Präfixen.
Die meisten, aber nicht alle der Präfixe, die Simonyi vorgeschlagen hat, sind semantischer Natur. Für moderne Augen scheinen einige Präfixe physikalische Datentypen darzustellen, wie z. sz
für Saiten. Solche Präfixe waren jedoch immer noch semantisch, wie Simonyi die ungarische Notation für Sprachen beabsichtigte, deren Typsysteme einige Datentypen nicht unterscheiden konnten, die moderne Sprachen für selbstverständlich halten.
Im Folgenden sind Beispiele aus dem Originalpapier:[3]
-
px
ist ein Zeiger auf einen anderen Typ X; Dies enthält sehr wenig semantische Informationen. -
d
ist ein Präfix -Bedeutung -Differenz zwischen zwei Werten; zum Beispiel, Dy könnte eine Entfernung entlang der y-Achse eines Diagramms darstellen, während eine Variable gerade genannt wird y könnte eine absolute Position sein. Dies ist völlig semantischer Natur. -
sz
ist eine Null- oder Null-terminierte Zeichenfolge. In C enthält dies einige semantische Informationen, da nicht klar ist, ob eine Variable des Typs verkohlen* ist ein Zeiger auf ein einzelnes Zeichen, eine Reihe von Zeichen oder eine Zero-terminierte Zeichenfolge. -
w
markiert eine Variable, die ein Wort ist. Dies enthält im Wesentlichen überhaupt keine semantischen Informationen und würde wahrscheinlich als System ungarisch angesehen. -
b
markiert ein Byte, das im Gegensatz zu W semantische Informationen hat, da in C der einzige Byte-Datentyp der ist verkohlenAlso werden diese manchmal verwendet, um numerische Werte zu halten. Dieses Präfix könnte die Unklarheit zwischen der Frage, ob die Variable einen Wert hält, der als Charakter oder Zahl behandelt werden sollte, löhen.
Während die Notation immer anfängliche Buchstaben mit niedrigerem Fall als Mnemonik verwendet, verschreibt sie die Mnemonik nicht selbst. Es gibt mehrere weit verbreitete Konventionen (siehe Beispiele unten), aber alle Buchstaben können verwendet werden, solange sie in einem bestimmten Codekörper konsistent sind.
Es ist möglich, dass Code mit Apps ungarische Notation mit einer ungarischen System -Ungarn bei der Beschreibung von Variablen, die ausschließlich in Bezug auf ihren Typ definiert sind, einfügen.
Beziehung zu Sigils
In einigen Programmiersprachen heißt es eine ähnliche Notation, die jetzt genannt wird Sigils wird in die Sprache eingebaut und vom Compiler durchgesetzt. Zum Beispiel in einigen Formen von BASIC, Nennen Sie $
Namen a Saite und zählen%
Namen an ganze Zahl. Der Hauptunterschied zwischen ungarischer Notation und Sigils besteht darin, dass Sigils die Art der Variablen in der Sprache erklären, während ungarische Notation ein reines Namensschema ist, ohne dass sich die maschinelle Interpretation des Programmtextes auswirkt.
Beispiele
-
Bbusy
: Boolesche -
Chinitial
: verkohlen -
Depel
: Zählung von Gegenständen -
Dwightyears
: doppelt Wort (Systeme) -
fbusy
: Flagge (oder schweben) -
nsize
: ganze Zahl (Systeme) oder zählen (Apps) -
ISSIZE
: ganze Zahl (Systeme) oder Index (Apps) -
fpprice
: Schwimmpunkt -
dbpi
: doppelt (Systeme) -
Pfoo
: Zeiger -
rgstudents
: Array oder Reichweite -
SzlastName
: Zero-terminierte Zeichenfolge -
u16identifier
: nicht signiert 16-Bit ganze Zahl (Systeme) -
u32identifier
: Unsigned 32-Bit ganze Zahl (Systeme) -
STTime
: Uhrzeitstruktur -
fnfunction
: Funktionsname
Die Mnemonik für Zeiger und Arrays, die keine tatsächlichen Datentypen sind, folgen normalerweise vom Typ des Datenelements selbst:
-
PSZORNER
: Zeiger auf null terminierte Zeichenfolge -
RGFPBalances
: Anordnung von Schwimmpunkt Werte -
Aulcolors
: Array von nicht signiertem langem (Systeme)
Während ungarische Notation auf jede Programmiersprache und -umgebung angewendet werden kann, wurde sie weit verbreitet von Microsoft für die Verwendung mit der C -Sprache, insbesondere für Microsoft Windowsund seine Verwendung bleibt weitgehend auf diesen Bereich beschränkt. Insbesondere war die Verwendung der ungarischen Notation weit verbreitet evangelisiert durch Charles Petzold's "Windows programmieren", das ursprüngliche (und für viele Leser, das endgültige) Buch über Windows -API Programmierung. Daher sind viele häufig gesehene Konstrukte der ungarischen Notation spezifisch für Fenster:
- Für Programmierer, die Windows -Programmierung in C gelernt haben, sind die wahrscheinlich denkwürdigsten Beispiele die wahrscheinlich die
wparam
(Parameter der Wortgröße) undLparam
(Parameter des langjährigen Parameters) für die Fensterproc() Funktion. -
hwndfoo
: Handle mit einem Fenster -
LPSZBAR
: Langer Zeiger auf eine null terminierte Zeichenfolge
Die Notation wird manchmal erweitert C ++ Um die zu enthalten Umfang einer Variablen, optional durch einen Unterstrich getrennt.[5][6] Diese Erweiterung wird häufig auch ohne die ungarische Typspezifikation verwendet:
-
G_NWHEELS
: Mitglied eines globalen Namespace, Ganzzahl -
M_NWHEELS
: Mitglied einer Struktur/Klasse, Ganzzahl -
M_Wheels
,_Wheels
: Mitglied einer Struktur/Klasse -
S_Wheels
: statisches Mitglied einer Klasse -
C_Wheels
: statisches Mitglied einer Funktion
Im JavaScript Code verwendet JQuery, a $
Präfix wird häufig verwendet, um anzuzeigen, dass eine Variable ein JQuery -Objekt enthält (gegenüber einem einfachen DOM -Objekt oder einem anderen Wert).[7]
Vorteile
(Einige davon gelten nur für Systeme ungarisch.)
Anhänger argumentieren, dass die Vorteile der ungarischen Notation sind:[3]
- Der Symboltyp ist aus seinem Namen zu sehen. Dies ist nützlich, wenn Sie den Code außerhalb einer integrierten Entwicklungsumgebung - wie in einer Codeüberprüfung oder einem Ausdruck - oder wenn sich die Symboldeklaration ab dem Gebrauchsort wie einer Funktion in einer anderen Datei befindet.
- In einer Sprache, die verwendet Dynamisches Typing Oder das ist ungetarn, die Dekorationen, die sich auf Typen beziehen, hören auf, überflüssig zu sein. In solchen Sprachen werden Variablen in der Regel nicht als eine bestimmte Art von Daten deklariert. Daher sind der einzige Hinweis darauf, welche Operationen darauf ausgeführt werden können, die vom Programmierer angegeben werden, wie z. B. ein Variable -Benennungsschema, Dokumentation und Kommentare. Wie oben erwähnt, erweiterte die ungarische Notation in einer solchen Sprache (BCPL).
- Die Formatierung von Variablennamen kann einige Aspekte von vereinfachen Code Refactoring (während andere Aspekte fehleranfälliger werden).
- Mehrere Variablen mit ähnlicher Semantik können in einem Codeblock verwendet werden: dwwidth, iwidth, fwidth, dwidth.
- Variable Namen können sich leicht erinnern, wenn man nur ihre Typen kannte.
- Es führt zu konsistenten Variablennamen.
- Unangemessene Typ -Casting und -Operationen mit inkompatiblen Typen können beim Lesen des Codes leicht erkannt werden.
- In komplexen Programmen mit vielen globalen Objekten (VB/Delphi -Formularen) kann eine grundlegende Präfixnotation die Arbeit erleichtern, die Komponente innerhalb des Editors zu finden. Zum Beispiel auf der Suche nach der Zeichenfolge
Btn
Könnte alle Schaltflächenobjekte finden. - Ungarische Notation auf engere Weise anwenden, z. B. nur für zu bewerben Mitgliedsvariablen, hilft zu vermeiden Benennung von Kollision.
- Der gedruckte Code ist für den Leser im Falle von Datenatypen, Typkonvertierungen, Zuordnungen, Kürzungen usw. klarer
Nachteile
Die meisten Argumente gegen ungarische Notation sind dagegen Systeme Ungarische Notation, nicht Apps Ungarische Notation. Einige potenzielle Probleme sind:
- Die ungarische Notation ist überflüssig, wenn der Compiler vom Typ Überprüfung durchgeführt wird. Compiler für Sprachen, die strikte Typ-Überprüfungen liefern, wie z. PascalStellen Sie sicher, dass die Verwendung einer Variablen automatisch mit ihrem Typ übereinstimmt. Überprüfungen nach Augen sind überflüssig und unterliegen menschlichem Fehler.
- Am modernsten Integrierte Entwicklungsumgebungen Variablen Typen auf Bedarf anzeigen und automatisch Vorgänge markieren, die inkompatible Typen verwenden, wodurch die Notation weitgehend veraltet ist.
- Ungarische Notation wird verwirrend, wenn sie verwendet wird, um mehrere Eigenschaften darzustellen, wie in
a_crszkvc30Lastnamecol
: a Konstante Hinweis Streitden Inhalt von a Datenbank SäuleNachname
of type varchar(30) was Teil der Tabelle ist Primärschlüssel. - Dies kann zu Inkonsistenz führen, wenn der Code geändert oder portiert wird. Wenn der Typ einer Variablen geändert wird, steht entweder die Dekoration des Namens der Variablen nicht mit dem neuen Typ oder dem Namen der Variablen geändert werden. Ein besonders bekanntes Beispiel ist der Standard -WPARAM -Typ und der dazugehörige WPARAM formaler Parameter In vielen Windows -Systemfunktionserklärungen. Das 'W' steht für 'Wort', wo 'Wort' die native Wortgröße der Hardware -Architektur der Plattform ist. Es war ursprünglich ein 16-Bit-Typ bei 16-Bit-Wortarchitekturen, wurde jedoch in einem 32-Bit-Wortarchitekturen oder 64-Bit Der ursprüngliche Name (der wahre zugrunde liegende Typ ist uint_ptr, dh eine nicht signierte Ganzzahl, die groß genug ist, um einen Zeiger zu halten). Die semantische Impedanz und damit die Verwirrung und Inkonsistenz von Programmierern von Plattform zu Plattform sind der Annahme, dass 'W' in diesen verschiedenen Umgebungen für ein zwei Byte-16-Bit-Wort steht.
- Die meiste Zeit bedeutet das Kennen der Verwendung einer Variablen impliziert, dass sie ihren Typ kennt. Wenn die Verwendung einer Variablen nicht bekannt ist, kann sie nicht aus ihrem Typ abgeleitet werden.
- Die ungarische Notation reduziert die Vorteile der Verwendung von Code -Editoren, die die Fertigstellung von Variablennamen unterstützen, für den Programmierer muss zuerst den Typ -Spezifizierer eingeben, der mit größerer Wahrscheinlichkeit mit anderen Variablen kollidiert als bei der Verwendung anderer Benennungsschemata.
- Es macht den Code weniger lesbar, indem der Zweck der Variablen mit Typ und Scoping -Präfixen verschleiert.[8]
- Die zusätzlichen Typinformationen können nicht ausreichend beschreibende Namen ersetzen. Z.B. Sdatabase sagt dem Leser nicht, was es ist. Der Datenbankname könnte ein beschreibenderer Name sein.
- Wenn Namen ausreichend beschreibend sind, können die zusätzlichen Typinformationen überflüssig sein. Z.B. FirstName ist höchstwahrscheinlich eine Zeichenfolge. Das Benennen von SfirstName fügt dem Code nur Unordnung hinzu.
- Es ist schwieriger, sich an die Namen zu erinnern.
- Mehrere Variablen mit anders Die Semantik kann in einem Codeblock mit ähnlichen Namen verwendet werden: DWTMP, ITMP, FTMP, DTMP.
- Das Platzieren von Datentypen oder Absichtserkennungen als Präfix für das Feld oder den angegebenen Namen der Variablen untergräbt die Fähigkeit in einigen Programmierumgebungen, zu einem Feld oder einem Variablennamen alphabetisch zu springen, wenn der Benutzer beginnt, den Namen zu tippen. FileMaker, [9] Zum Beispiel ist eine solche Programmierumgebung. Es kann vorzuziehen sein, wenn eine dieser Programmierumgebungen verwendet wird, um stattdessen angegebene Namen mit solchen identifizierenden Zeichen zu surtieren.
Bemerkenswerte Meinungen
- Robert Cecil Martin (gegen ungarische Notation und alle anderen Formen der Codierung):
... Heutzutage sind HN und andere Formen der Typ -Codierung einfach Hindernisse. Sie erschweren es, den Namen oder eine Art einer Variablen, Funktion, Mitglied oder Klasse zu ändern. Sie machen es schwieriger, den Code zu lesen. Und sie schaffen die Möglichkeit, dass das Codierungssystem den Leser irreführen wird.[10]
- Linus Torvalds (gegen Systeme ungarisch):
Die Codierung der Art einer Funktion in den Namen (sogenannte ungarische Notation) wird im Gehirn beschädigt-der Compiler kennt die Typen sowieso und kann diese überprüfen und verwirrt den Programmierer nur.[11]
- Steve McConnell (für Apps ungarisch):
Obwohl die ungarische Namenskonvention nicht mehr weit verbreitet ist, ist die grundlegende Idee der Standardisierung von knappen Abkürzungen weiterhin Wert. Mit standardisierten Präfixen können Sie die Typen genau überprüfen, wenn Sie abstrakte Datentypen verwenden, die Ihr Compiler nicht unbedingt überprüfen kann.[12]
- Bjarne Stroustrup (gegen Systeme Ungarn für C ++):
Nein, ich empfehle nicht 'Ungar'. Ich betrachte 'ungarisch' (einbettet eine abgekürzte Version eines Typs in einem variablen Namen) als eine Technik, die in ungeslungenen Sprachen nützlich sein kann, aber für eine Sprache, die die generische Programmierung und objektorientierte Programmierung unterstützt Auswahl der Operationen basierend auf Art und Argumenten (der Sprache oder der Laufzeitunterstützung). In diesem Fall kompliziert und minimiert "die Art eines Objekts in Namen in Namen" und minimiert die Abstraktion.[13]
- Joel Spolsky (für Apps ungarisch):
Wenn Sie Simonyis Papier genau gelesen haben, war das, worauf er sich befand
uns
bedeutete unsichere Zeichenfolge unds
bedeutete einen sicheren Schnur. Sie sind beide TypenSaite
. Der Compiler hilft Ihnen nicht, wenn Sie dem anderen und IntelliSense zuweisen [a Intelligenter Code -Abschluss System] wird Ihnen Bupkis nicht sagen. Aber sie sind semantisch unterschiedlich. Sie müssen anders interpretiert und anders behandelt werden, und eine Art Konvertierungsfunktion muss aufgerufen werden, wenn Sie dem anderen eine zuweisen oder einen Laufzeitfehler haben. Wenn du Glück hast. Es gibt immer noch einen enormen Wert für Apps Ungarn, indem er die Kollokation im Code erhöht, was den Code leichter zu lesen, zu schreiben, zu debuggen und zu warten und vor allem das falsche Code falsch aussieht ... (Systeme Ungarisch) war ein subtiles, aber vollständiges Missverständnis von Simonyis Absicht und Praxis.[4] - MicrosoftEntwurfsrichtlinien[14] Entmutigen Sie Entwickler von der Verwendung von Systemen ungarischer Notation, wenn sie Namen für die Elemente in Bibliotheken der .NET -Klasse auswählen, obwohl dies auf früheren Microsoft -Entwicklungsplattformen wie üblich war Visual Basic 6 und früher. Diese Entwurfsrichtlinien schweigen über die Namenskonventionen für lokale Variablen innerhalb der Funktionen.
Siehe auch
- Leszynski -Namenskonvention, Ungarische Notation für die Datenbankentwicklung
- Polnische Notation
- Pascalcase
Verweise
- ^ "Orale Geschichte von Charles Simonyi" (PDF). Archive.computerHistory.org \ Accessdate = 5 August 2018.
- ^ Rosenberg, Scott (1. Januar 2007). "Alles, was Sie tun können, ich kann Meta machen". MIT Technology Review. Abgerufen 21. Juli 2022.
- ^ a b c Charles Simonyi (November 1999). "Ungarische Notation". MSDN -Bibliothek. Microsoft Corp.
- ^ a b c Spolsky, Joel (2005-05-11). "Falsches Code schau falsch aus". Joel über Software. Abgerufen 2005-12-13.
- ^ "Mozilla -Codierungsstil". Entwickler.mozilla.org. Abgerufen 17. März 2015.
- ^ "Webkit -Codierungsstil -Richtlinien". Webkit.org. Abgerufen 17. März 2015.
- ^ "Warum sollte eine JavaScript -Variable mit einem Dollarzeichen beginnen?". Paketüberfluss. Abgerufen 12. Februar 2016.
- ^ Jones, Derek M. (2009). Der neue C -Standard: Ein kultureller und wirtschaftlicher Kommentar (PDF). Addison-Wesley. p. 727. ISBN 978-0-201-70917-9.
- ^ "Machen Sie eine App für jede Aufgabe - FileMaker - eine Apple -Tochter". FileMaker.com. Abgerufen 5. August 2018.
- ^ Martin, Robert Cecil (2008). Clean Code: Ein Handbuch der agilen Software -Handwerkskunst. Redmond, WA: Prentice Hall PTR. ISBN 978-0-13-235088-4.
- ^ "Linux -Kernel -Codierungsstil". Linux Kernel Dokumentation. Abgerufen 9. März 2018.
- ^ McConnell, Steve (2004). Code vollständig (2. Aufl.). Redmond, WA: Microsoft Press. ISBN 0-7356-1967-0.
- ^ Stroustrup, Bjarne (2007). "Bjarne Strousstrups C ++ - Stil und Technik -FAQ". Abgerufen 15. Februar 2015.
- ^ "Entwurfsrichtlinien für die Entwicklung von Klassenbibliotheken: Allgemeine Namenskonventionen". Abgerufen 2008-01-03.
Externe Links
- Metaprogrammierung: eine Softwareproduktionsmethode Charles Simonyi, Dezember 1976 (Doktorarbeit)
- Hugarische Notation - ich bin jetzt an der Reihe :) - Larry Ostermans Weblog
- Ungarische Notation (Msdn)
- HTML -Version von Doug Klunder's Paper
- RVBA -Namenskonventionen
- Konventionen im Codierungsstil (Msdn)