Ist die ungarische Systemnotation immer noch eine nützliche Praxis? [geschlossen]

23

Ich habe das Forum durchsucht, aber ich konnte keine Antworten finden, warum es vermieden werden sollte, nur warum es keine Wunderwaffe ist. Ich denke also nicht, dass diese Frage ein Duplikat ist.

Gibt es einen GÜLTIGEN Grund, warum ich Systemungarisch verlernen sollte, an das ich gewöhnt bin?

Bisher sehe ich die folgenden Vorteile bei der Verwendung:

  • Konsistente Benennung von Variablen
  • Sie sehen Typ ohne Suche (Intellisense ist die Hälfte der Zeit tot / indiziert, daher ist dies immer noch ein gültiger Grund)
  • Die Semantik kann immer noch in den zweiten Teil des Namens gepackt werden

Und folgende Nachteile:

  • Es nervt manche Leute (keine Ahnung warum)
  • Wenn der Typ geändert wird, stimmt der Typ möglicherweise nicht mit der Benennung der Variablen überein.

Warum also:

vector<string> vecCityNames;
wstring strCity = L"abc";
//more code here
vecCityNames.push_back(strCity);

ist schlimmer als:

vector<string> cityNames;
wstring city = L"abc";
//more code here
cityNames.push_back(city);//Are we pushing back int on a queue? Float on a stack? Something else?
Coder
quelle
4
Wenn Intellisense tot ist, ist Ihr Code ungültig. Wenn es ungültig ist, warum wird angenommen, dass der Variablenname korrekt ist?
Luftpolsterfolie
6
@Bubblewrap: Die meisten Intellisense-Implementierungen bleiben gelegentlich 3 Sekunden lang stecken, selbst bei gültigem Code. Und manchmal funktionieren sie überhaupt nicht, obwohl Code kompiliert und verlinkt wird. Wir sprechen über Projekte mit angemessener Größe.
Coder
9
sollte nicht vectCityNamessein , vectStringCityNamesso viel für Ihre konsequente Argumentation, und diese „Frage“ ist eher ein rant als alles andere, haben Sie Ihre Meinung, die aus dieser geschlossen werden sollte.
8
Was halten Sie für einen "gültigen" Grund?
Adam Lear
15
Ich glaube nicht, dass Ihr zweites Beispiel so verwirrend ist, wie es Ihr Kommentar angibt. Die Bedeutung von cityNames.push_back(city)ist ziemlich klar. Es ist eine Liste von Städtenamen und Sie fügen einen hinzu.
Chris Burt-Brown

Antworten:

62

Früher habe ich es benutzt (vor vielen Jahren) und ich weiß es nicht mehr. Der Hauptgrund ist, dass es in den OO-Sprachen mit starker Typisierung (C ++, Java) überflüssig ist, die ich zufällig die meiste Zeit meiner Karriere genutzt habe. Wenn ich meine Typen in diesen Sprachen gut definiere, kann und wird der Compiler die Typensicherheit für mich erzwingen. Alle Namenspräfixe sind also nur Unordnung, wodurch die Namen länger werden und somit schwerer zu lesen und zu suchen sind.

In jedem gut geschriebenen OO-Programm sind die meisten Ihrer Variablen (Verweise auf) benutzerdefinierte Typen. Wenn Sie diesen denselben allgemeinen Tag voranstellen (wie ofür "object"), profitieren Sie nur von den Nachteilen. Wenn Sie ihnen jedoch typspezifische Tags voranstellen, geraten Sie in ein Labyrinth, in dem Sie versuchen, verschiedene Abkürzungen für tausend verschiedene Typen mit häufig ähnlichen Namen * zu finden und daran zu denken, sie alle zu ändern, wenn sich ein Typ oder sein Name ändert (was bedeutet) nicht selten in einem gut gepflegten Programm).

Dies gilt natürlich nicht für Nicht-OO-Sprachen und möglicherweise auch nicht für schwach und / oder dynamisch typisierte Sprachen (ich habe keine Erfahrung mit diesen Sprachen, abgesehen von C). Weder für suboptimale Editoren / IDEs ohne ein verwendbares IntelliSense (oder sein lokales Äquivalent). Und das sind nur meine 2 Cent. Wenn also die ungarische Notation für Ihr Team und Ihr Projekt funktioniert, entscheiden Sie sich dafür. Es ist wichtig , dass Sie sich vor Projektbeginn darauf einigen (und auch auf einen einheitlichen Codierungsstil im Allgemeinen) und ihn jederzeit konsistent halten.

* Nur eine kurze Liste aus unserem aktuellen Projekt: wir haben Charge, ChargeBreakdown, ChargeCalculator, ChargeDAO, ChargeDTO, ChargeLineHelper, ChargeMaps, ChargePairund ChargeType, unter anderem. Darüber hinaus haben wir auch Contracts, Countries, Checkouts, Checkins ... und das ist nur der Buchstabe C, in einem Projekt , das wahrscheinlich nicht einmal „vernünftige Größe“ der OP genannt würde.


Disclaimer: Ich bin eigentlich ein Ungar, also glaube ich, dass ich mit Autorität zu diesem Thema sprechen kann ;-)

Péter Török
quelle
"Starke Typisierung" - Wenn C ++ ein wirklich starkes Typensystem hätte, müssten Sie Typen nicht als Hack in den Variablennamen einbetten.
Michael Burge
19
@ MichaelBurge: Das ist der Punkt. Das musst du nicht. Weil es so ist.
DeadMG
8
+1 für den Punkt über benutzerdefinierte Typen. Verwenden Sie benannte iPosoder fAmountmöglicherweise tolerierbare Variablen. Versuchen Sie jedoch, auf einer Codebasis zu arbeiten, bei der jeder Objektvariablen ein redundantes Präfix mit sechs Buchstaben zugewiesen wird, das Sie lediglich darüber informiert, dass es sich um einen "Zeiger auf eine Struktur" handelt.
2
Ich würde eine Ausnahme für GUIs machen, bei denen Sie zusätzlich zum Wert ein Handle für jedes Steuerelement speichern müssen, sodass Text und hText nicht einen anderen Namen für das Eingabefeld haben müssen. Besonders wichtig bei Systemen, bei denen der Handle nur ein int ist, kein spezieller Typ.
Martin Beckett
1
Ich würde davon ausgehen, dass ein wichtiger Punkt, an dem Java die Verwendung der ungarischen Notation hätte empfehlen sollen, darin besteht, zwischen Verweisen auf Instanzen zu unterscheiden, die möglicherweise mutiert sind, aber nicht geteilt werden (z. B. die char[]von a gehaltenen StringBuilder), und Verweisen auf Instanzen, die möglicherweise nicht mutiert sind, aber nicht geteilt werden kann mit Dingen geteilt werden, die sie nicht mutieren (z. B. die char[]von String, die von mehreren StringInstanzen geteilt werden können). Beide Felder sind vom selben Typ char[], enthalten aber sehr unterschiedliche Dinge. Viele Fehler im Zusammenhang mit der Veränderlichkeit stammen von ...
supercat
35

Warum ist std::vector<string> vecCityNames;schlecht?

Das Problem mit der ungarischen Notation, wie es normalerweise verwendet wird, ist, dass, wenn die Profilerstellung zeigt, dass Städtenamen lieber in a gehalten werden sollten std::deque, alle Variablennamen, die sich auf ein Objekt dieses Typs beziehen, plötzlich einen irreführenden Namen haben.

Benennen Sie dann alle Variablen um? Haben Sie jemals versucht, dies in einem großen Projekt zu tun? Mit Murphys Hilfe (und der Typ ist dort unglaublich hilfsbereit) hat sicherlich irgendjemand irgendwo Variablen verwendet, die so etwas wie heißen. deqCityNamesIhre Änderungen machen den Build kaputt und Sie sitzen stundenlang da und fummeln an Code, den ein halbes Jahrzehnt lang niemand zu betrachten gewagt hat aus Angst, von einem giftigen Tier gebissen zu werden.

Soweit ich jedoch weiß, bezeichnet das Präfix, wie Charles Simonyi Ungarisch formulierte, die semantische Verwendung der Variablen und nicht deren syntaktischen Typ . Das heißt, das richtige Präfix für Ihre Liste von Städtenamen, egal in welchem ​​Typ es implementiert ist, wäre wahrscheinlich listCityNames(oder lstCityNames, wenn listes für Sie nicht kryptisch genug ist).

Ich halte dieses Präfix jedoch für überflüssig, da der Plural ("Namen") bereits besagt, dass es sich um eine Ansammlung von Städten handelt. Fazit: Wenn Sie Ihre Identifikatoren sorgfältig auswählen, wird die ungarische Notation selten benötigt. OTOH, so wie es allgemein verwendet wird, fügt es auf lange Sicht tatsächlich dem Code Schaden zu.

sbi
quelle
6
@Coder: Der Typ wird im gesamten Projekt verwendet, und alle Variablen dieses Typs haben das Präfix. Sie müssen nicht eine globale Variable, sondern Hunderte von lokalen Variablen umbenennen.
sbi
7
Fügen Sie einen Link zu Joel Spolskys Blog-Post hinzu, in dem er erklärt, warum die Verwendung eines Variablentyps zur Erstellung der ungarischen Benachrichtigung ein Missverständnis dessen ist, worum es geht. Ihre ist gut, aber einige Leute suchen vielleicht nach etwas Bestimmtem, und Sie könnten das verwenden, um Ihren Fall zu untermauern. joelonsoftware.com/articles/Wrong.html
Shane Wealti
2
@Coder: Leider typedefist ein Tool stark unterbewertet
sbi
4
@Shane: Ich habe meine eigene Meinung dazu niedergeschrieben. Sollte das zu Joel passen, ist das in Ordnung für mich, denn ich schätze seine Meinung, obwohl ich mit einigen davon nicht einverstanden bin. Ich sehe jedoch keinen Grund, andere "Behörden" anzurufen, um meine eigene Meinung zu untermauern, wenn diese auf mehr als einem Jahrzehnt hart erarbeiteter Erfahrung beruht. Es ist schön, dass Sie diesen Link gepostet haben, aber es ist immer gut, die Meinungen anderer zu sehen, mit denen man sich vergleichen kann.
sbi
4
Vor langer Zeit war ich der CVS-Typ für den Shop, und einer der Top-Entwickler änderte die Initialen (Geschlechtsumwandlungsoperation usw., und sein und ihr Vorname hatte nicht die gleichen Initialen). Immer wenn sie eine Datei (oder eine ähnliche) berührte, änderte sie alle seine Initialen in die neue Form. Ich fand das äußerst ärgerlich, da wir alle möglichen geringfügigen Änderungen an den historischen Merkmalen vorgenommen haben und es schwierig war, herauszufinden, was tatsächlich geändert wurde und warum. Ändern Sie vecCityNameszu deqCityNamesin ein paar hundert Dateien und Sie tun das gleiche.
David Thornley
15

Aus irgendeinem Grund scheinen die hier gegebenen Antworten die ungarische Notation zu begründen, ohne sie direkt zu formulieren. Die ungarische Notation ist nützlich, um Typinformationen (im typentheoretischen Sinne ) hinzuzufügen, wenn dies in der Sprache selbst schwierig ist . Es ist in der Regel nicht so schwierig, C ++ oder Javas Typensystem so zu verwenden, dass die ungarische Notation (wie gewöhnlich beschrieben) völlig überflüssig ist, und dies hat wahrscheinlich zu dem Gegenschlag geführt - es fügt Programmiererarbeit hinzu Diese Annotationen in all unseren variablen Naes beizubehalten, bietet jedoch nur einen geringen bis keinen zusätzlichen Wert (und kann sogar Schaden anrichten, da der Code überladener aussieht).

Wenn man andererseits die Verwendung der ungarischen Notation einschränkt, um Informationen zu tippen (wiederum im typentheoretischen Sinne ), ist dies nicht der Fallnatürlich von der Sprache eingekapselt, dann kann es sehr nützlich sein. Beispielsweise übergeben C und C ++ Array-Referenzen als Zeigertypen, aber Array-Referenzen und Zeiger müssen unterschiedliche Operationen ausführen: Arrays können über das erste Element hinaus indiziert werden, Zeiger hingegen nicht. Dies sind nützliche Informationen, die dem Typsystem verloren gehen, sobald ein Array als Argument an eine Funktion übergeben wird. Aus diesem Grund haben wir in unserer Gruppe Annotationen für Variablennamen in C- und C ++ - Code übernommen, um zu unterscheiden, ob eine Zeigervariable tatsächlich ein Zeiger auf ein einzelnes Element oder ein Zeiger auf ein Array ist. Die Annahme dieser Konvention war teilweise verantwortlich für eine große Reduzierung des Auftretens von Speicherbeschädigungsproblemen in unserer Codebasis.

Aidan Cully
quelle
Der Grund für das Scheitern von Ungarisch war, dass es (vom WinAPI-Team) missbraucht wurde, um den syntaktischen Typ einer Variablen und nicht ihre semantische Bedeutung zu codieren . (Denken Sie dwgegen cb.) Es ist nicht so, dass seine ursprüngliche Form in OO-Sprachen weniger hilfreich wäre: Ein Index ist immer noch ein Index, auch wenn er in einem Klassentyp und nicht in einem eingebauten Typ gespeichert ist.
sbi
1
+1 für den Hinweis, dass das wahre Argument hier die Typentheorie ist. Die ungarische Notation ist eine Technik zum Erweitern des Typensystems mit zusätzlichen Informationen und sollte als solche verglichen und mit anderen Techniken zum Erweitern des Typensystems (z. B. Schablonen, Typedef usw.) verglichen werden, anstatt über seine ästhetischen Vorzüge (oder deren Fehlen).
Daniel Pryden
1
Die Frage bezieht sich speziell auf "Ungarische Systeme", sinnlose Vervielfältigung des deklarierten Typs ohne zusätzliche semantische Information. Es kann vorkommen, dass das ursprüngliche Konzept der "ungarischen Notation" semantischer Tags verwendet wird, um Informationen zu liefern, die über die in der Sprachsyntax festgelegte hinausgehen (in einigen Sprachen, einschließlich C, jedoch nicht in C ++, wo Sie dies mit benutzerdefinierten Typen zuverlässiger tun können) ), aber darum geht es nicht.
Mike Seymour
10

Es nervt manche Leute (keine Ahnung warum)

Der Grund, warum es mich ärgert, ist, dass es ein kleiner Geschwindigkeitsschub bei jeder einzelnen Kennung ist, der mein visuelles Scannen des Codes verlangsamt. Es ist mAs, wenn Sie ZUM LESEN DES DEUTSCHEN TEXTES MÖCHTEN.

dfan
quelle
9

Hass ist ein zu starkes Wort, IMO. Sie können Ihren Code so schreiben, wie Sie möchten. Ich bevorzuge es einfach, in meinem eigenen Code keine ungarische Notation zu verwenden, und wenn ich die Wahl habe, möchte ich es auch lieber nicht lesen oder damit im Code anderer Leute arbeiten müssen.

Sie haben gefragt, warum manche Leute die ungarische Notation als störend empfinden. Ich kann nicht für andere sprechen, aber die Gründe, die mich ärgern, sind:

  1. Es ist hässlich. Ungarisch nimmt völlig vernünftige Namen und stellt das voran, was einem Code entspricht. Wenn Sie diesen Code erst einmal verinnerlicht haben, ist das sicher sinnvoll, aber für Anfänger sieht es so aus, als hätte jemand den C ++ - Namensverwalter für meinen Quellcode aktiviert.

  2. Es ist überflüssig. Die Deklaration einer Variablen legt ihren Typ fest. Ich habe nicht das Bedürfnis, diese Information im Variablennamen zu wiederholen. Dies ist nicht in jeder Sprache der Fall: In Perl definieren beispielsweise Zeichen wie @ oder $ vor dem Variablennamen im Wesentlichen den Typ der Variablen, sodass Sie keine andere Wahl haben, als sie zu verwenden.

  3. Es löst ein Problem, das ich nicht habe. Methoden und Funktionen sollten nicht so lang sein, dass Sie nach der Deklaration einer lokalen Variablen oder eines Parameters suchen müssen, und sie sollten nicht so viele Variablen umfassen, dass Sie Probleme haben, den Überblick darüber zu behalten, was was ist. Auch hier hilft es, lokale Variablen in der Nähe des Codes zu deklarieren, der sie verwendet. C-Compiler der Vergangenheit erforderten, dass alle lokalen Variablen zu Beginn der Funktion deklariert wurden. Diese Einschränkung wurde jedoch vor langer Zeit aufgehoben.

  4. Es ist unvollständig. Die ungarische Notation wurde für eine Sprache (BCPL) erfunden, die kein Typensystem hatte, und wurde später in einer Sprache (C) mit einer relativ begrenzten Anzahl von einheimischen Typen häufig verwendet. IMO funktioniert es nicht gut mit Sprachen wie C ++ oder Java, die über umfangreiche Typsysteme verfügen. Warum sollte ich ein Präfix verwenden, um den Typ einer Variablen anzugeben, die ein nativer Typ ist, wie char [], aber keine Klasse? Wenn ich Präfixe wie vecfür Klassen erfinde , wird eine große Hierarchie von Präfixen parallel zu meiner Klassenhierarchie erstellt. Wenn Ihnen das gefällt, können Sie es gerne tun. wenn ich nur daran denke, bekomme ich Kopfschmerzen.

  5. Es ist zweideutig , zumindest so wie ich es verstehe. Was ist der Unterschied zwischen szFoound pszFoo? Die erste ist eine nullterminierte Zeichenfolge, und die zweite ist ein Zeiger auf eine nullterminierte Zeichenfolge. Aber in C oder C ++ ist, soweit ich weiß, jede Zeichenkettenvariable effektiv ein Zeiger. Sind sie also gleich oder nicht? Welches soll ich verwenden? Die eigentliche Antwort spielt wirklich keine Rolle - der Punkt ist, dass ich die Antwort nicht anhand der Notation erkennen kann, die mir helfen soll, diese Art von Fragen zu vermeiden. Die Deklaration der Variablen muss dagegen eindeutig sein, da sie vom Compiler verwendet wird.

Das sind die Dinge, die mich an der ungarischen Notation ärgern . Auch als Gruppe glaube ich nicht vollständig zu erklären, warum Ungarisch weitgehend aufgegeben wurde. Hier sind die drei Hauptgründe, warum die meisten Programmierer kein Ungarisch verwenden:

  1. Es gibt keinen zwingenden Grund, es zu benutzen. Siehe Punkt 3 und 4 oben. Ich könnte wahrscheinlich mit den Ärgernissen leben, wenn Ungarisch einen großen Vorteil gegenüber dem Verzicht auf Ungarisch bietet, aber ich sehe keinen, und anscheinend tun es die meisten anderen auch nicht. Vielleicht war das Beste an Ungarisch, dass es eine weit verbreitete Konvention war, und wenn Sie sich an den Standardsatz halten, können Sie davon ausgehen, dass andere Programmierer mit ähnlichen Fähigkeiten die Notation verstehen.

  2. Erhöhter Einfluss von Unternehmen, die nicht von Microsoft stammen. Es ist wahrscheinlich fair zu sagen, dass die meisten Programmierer, die die ungarische Notation verwendeten, dies taten, weil Microsoft auf diese Weise Code schrieb und es oft einfacher ist, mit dem Fluss umzugehen. Unternehmen wie Google und Apple haben heute viel, viel größere Einflussbereiche als früher, und mehr Programmierer als je zuvor greifen auf die Stile dieser und anderer Unternehmen zurück, die Ungarisch größtenteils meiden. (Es ist nur fair, darauf hinzuweisen, dass Sie immer noch einige Überbleibsel sehen, z. B. verwenden sowohl Google als auch Apple häufig ein "k" -Präfix für konstante Namen.)

  3. Microsoft selbst hat Ungarisch aufgegeben. Wenn Sie den Abschnitt Allgemeine Namenskonventionen von Microsoft in den Codierungsrichtlinien lesen, werden Sie feststellen, dass in Fettdruck Folgendes steht: Verwenden Sie keine ungarische Notation.

Ein triftiger Grund, die ungarische Notation nicht mehr zu verwenden, ist daher:

Die Popularität der ungarischen Notation ist so weit zurückgegangen, dass die Konvention nicht mehr hilfreich ist. Heutzutage verwenden weit weniger Programmierer Ungarisch oder verstehen es sogar, und die Konvention ist daher viel weniger effektiv darin, die Informationen zu vermitteln, die sie vermitteln sollen. Wenn Sie es für nützlich halten, Code in Ihre eigenen persönlichen Projekte zu schreiben, gibt es wenig Grund, damit aufzuhören. Wenn Sie jedoch Code als Teil eines Teams schreiben, das kein Ungarisch verwendet, kann dies zu einer Mauer zwischen Ihnen und dem Rest des Teams werden, anstatt zu einer erfolgreichen Kommunikationsstrategie.

Caleb
quelle
"Was ist der Unterschied zwischen szFoound pszFoo"? Eine davon ist char*, die andere char**, nahm mich 0,25 Sekunden den Unterschied zu erkennen. Versuchen Sie, dies mit Intellisense zu übertreffen.
Coder
2
@Coder pnFoowäre wahrscheinlich int*nicht int**, also muss man wissen, dass das szauch einen Zeiger bedeutet. Ich bin sicher, es ist kein großes Problem für die begrenzte Anzahl von Typen, die ungarische Präfixe festgelegt haben, aber in jedem großen Projekt gibt es eine definierte Typenzahl in Tausenden. Ich weiß nichts über Intellisense, aber die IDEs haben sich in den letzten 25 Jahren stetig verbessert, und ich gehe davon aus, dass sich dieser Trend fortsetzt.
Caleb
8

Bisher sehe ich die folgenden Vorteile bei der Verwendung:

  • Konsistente Benennung von Variablen

Wenn ich alle meine Variablen nach den Zeichen von The Simpsons benenne, ist das auch konsistent, aber ist es ein Vorteil?

  • Sie sehen Typ ohne Suche (Intellisense ist die Hälfte der Zeit tot / indiziert, daher ist dies immer noch ein gültiger Grund)

Dies ist der einzig gültige Grund, der auf der Schwäche eines bestimmten Werkzeugs beruht ...

  • Die Semantik kann immer noch in den zweiten Teil des Namens gepackt werden

Das ist kein Vorteil; Sie behaupten lediglich das Fehlen eines ( massiven ) Nachteils.

Michael Borgwardt
quelle
6

Die IDE teilt mir trivialerweise mit, um welchen Typ es sich bei einer Variablen handelt, wenn ich mit der Maus darüber fahre. Warum also die Mühe machen, diese Informationen zu duplizieren? Grundsätzlich ist die ungarische Systemnotation eine Verletzung von DRY mit all den damit verbundenen Fallstricken. Wenn diese Informationen in einer modernen Umgebung einfach zugänglich sind, gibt es keinen Grund, diesen Preis zu zahlen.

Konsistenz ist an sich kein Vorteil. Sie nicht mit dem Typ zu benennen, ist ebenfalls konsistent. Sie würden nur Inkonsistenzen haben, wenn nur einige Variablen ihren Typ im Namen hätten. Und Semantik in den zweiten Teil zu packen ist einfach "Nun, es ist nicht so schlimm.", Jeder andere darf den ganzen Namen für Semantik verwenden. Sie haben keine wirklichen Vorteile aufgelistet.

DeadMG
quelle
4
"Die IDE sagt mir trivialerweise, was für ein Variablentyp es ist, wenn ich mit der Maus darüber fahre.", In Hallo Welt, ja. Bei größeren Projekten finde ich diese Funktion extrem unzuverlässig / langsam. Strg + Leertaste, Strg + Leertaste, Strg + Leertaste, Strg + Leertaste, Strg + Leertaste, no go ...
Coder
3
Holen Sie sich eine neue IDE. Oder eine SSD, die Wunder wirkt. Oder schließen Sie einfach weniger unnötige Überschriften ein.
DeadMG
1
Auch wenn die IDE bei der Anzeige des Variablentyps zu langsam ist oder dies einfach nicht kann, sollten Methoden / Funktionen kurz gehalten werden, damit die Deklaration einer Variablen nie sehr weit von ihrer Verwendung entfernt ist.
Kevin Panko
6

Ein weiterer Punkt bei traditionellen Formen der ungarischen Notation ist, dass es sich normalerweise um Präfixe handelt. hier gibt es imho 2 probleme:

1) Ein menschlicher Leser möchte im Allgemeinen zuerst die wichtigsten Informationen, in den meisten Formen des Ungarischen sind die verschlüsselten Informationen vermutlich weniger wichtig als der Name selbst.

2) Präfixe bewirken eine lexikalische Sortierung. Wenn Sie zum Beispiel ein Präfix verwenden, um Schnittstellen oder Klassen zu kennzeichnen, und Ihre IDE eine sortierte Liste davon bereitstellt, werden verwandte Klassen / Schnittstellen in dieser Liste getrennt.

jk.
quelle
2

Es ist klar, dass dies auf Meinungen zurückzuführen ist, sodass es schwierig sein wird, hier mit Fakten zu arbeiten. Persönlich finde ich, dass das Argument für die ungarische Notation in stark typisierten, objektorientierten Sprachen etwas dünn ist. Nach meiner Erfahrung können OO-Anwendungen die Komplexität meistern, indem sie die Klassen kohärent und prägnant halten. Dasselbe gilt für Funktionen. Dies bedeutet, dass Sie, wenn alle anderen Dinge gleich sind, am Ende Folgendes haben:

  • Weitere Klassen / Typen
  • Kürzere Methoden

Wenn Sie nun die ungarische Notation verwenden möchten, müssen Sie entscheiden, ob Sie sie allgemein anwenden oder nur für bestimmte privilegierte Typen und Klassen (wie z. B. Kernbibliotheksklassen) verwenden möchten. Letzteres ergibt für mich keinen Sinn, und Ersteres führt zu dem "Labyrinth des Versuchs, verschiedene Abkürzungen für tausend verschiedene Typen zu finden", auf das sich Péter Török bezog. Dies bedeutet, dass die Pflege der Abkürzungslisten einen erheblichen Aufwand bedeutet und in der Regel "konsistente Variablennamen" nicht mehr angezeigt werden.

Der zweite Punkt zu kürzeren Methoden bedeutet, dass Sie in den meisten Fällen nicht Hunderte von Codezeilen durchgehen müssen, um den Typ einer Variablen zu überprüfen. Wenn Sie Variablen etwas sorgfältiger benennen, werden einige Ihrer anderen Fragen beseitigt - z . B. cityNamevs. cityIch würde hoffen, dass cityNamedas kein Schwimmer ist :)

Was den Grund angeht, warum es die Leute nervt - auch dies ist wahrscheinlich darauf zurückzuführen, dass man sich daran gewöhnt hat oder nicht. Aber als jemand, der nicht daran gewöhnt ist, kann ich Ihnen sagen, dass die Verwendung der ungarischen Notation den Codefluss für meine Augen unterbricht und es schwieriger macht, schnell zu lesen. Zusammenfassend sage ich nicht, dass es keinen Wert hat (obwohl ich einige seiner Nachteile in Bezug auf Refactoring usw. nicht besprochen habe), ich sage, dass sich der Aufwand für stark typisierte OO-Sprachen nicht lohnt.

Daniel B
quelle
1

Ich weiß es nicht im Kontext von C ++, aber in der Java / C # -Welt hätte ich lieber aussagekräftige Namen, die entweder eine Domänensprache oder einen Kontext vermitteln, als mir zu sagen, dass strFirstNamees sich um einen String handelt. Es sollte offensichtlich sein, dass es sich um eine Zeichenfolge handelt, oder der Name muss überarbeitet werden, um eine bessere Absicht zu vermitteln. Wenn du ein Präfix benötigen, um zu wissen, mit welcher Art von Namen Sie arbeiten, ist Ihre Benennung meiner Meinung nach inkonsistent, nicht aussagekräftig genug oder ausgesprochen falsch. In modernen Sprachen bevorzuge ich immer längere Namen, die keine Mehrdeutigkeit hinterlassen als vage oder mehrdeutige Namen.

Das einzige Mal, dass ich Ungarisch verwende, ist für ASP.NET-Steuerelemente, und das heißt, IA) muss nicht wirklich lange wie CustomerFirstNameTextBoxversus eingeben txtCustomerFirstName, und B) Intellisense sortiert alle Steuerelementtypen. Ich fühle mich "dreckig", obwohl ich noch keinen besseren Weg gefunden habe.

Wayne Molina
quelle
0

Meh - es geht wirklich um persönliche Vorlieben, egal wie sehr man versucht, seine Entscheidungen zu rationalisieren. Ich persönlich halte mich an die Regel "When in Rome ..." und verwende Ungarisch in Code, der häufig die Windows-API aufruft. Für plattformunabhängigen Code neige ich dazu, dem C ++ Standard Library-Stil zu folgen.

Nemanja Trifunovic
quelle
0

Die Antwort liegt in dieser Frage: Bitte sagen Sie mir, wie ich die folgenden Variablen benennen soll:

char * nullTerminatedString;
wchar * nullTerminatedWideString;
string stlString;
wstring stlWideString;
CString mfcString;
BSTR comString;
_bstr_t atlString;

Fügen Sie zu diesen konstanten Zeichenfolgen Zeiger auf diese und konstante Zeiger auf diese hinzu.

Jaywalker
quelle
3
szFoo, wczFoo, strFoo, (w)strFoo, strFoo, bstrFoo,bstrFoo
Coder
0

Die von Ihnen beschriebene Form der ungarischen Notation gefällt mir überhaupt nicht. Der Grund? Es ist in 90% der Fälle sinnlos.

Zum Beispiel ein bisschen (äquivalentes C ++. Tatsächlich in Delphi geschrieben) Code aus einem Legacy-Projekt, das ich ertragen muss:

pRecords[0]->FooMember=10;

... pRecord ist eine Variable vom Typ TRecordList. TRecordList *pRecords[10];

Es ist eine Klasse, die aus einer orioerty namens FooMember besteht, die auf fFooMember ... oder mFooMember verweist, je nachdem, ob es sich um ein "Feld" oder ein "Mitglied" handelt (Hinweis: Sie sind dasselbe).

Probleme? fFooMemberkönnte so etwas wie FooMember_ sein, weil wir immer über die öffentliche Eigenschaft FooMember darauf zugreifen. pRecords? Es ist ziemlich offensichtlich, dass es ein Hinweis auf die Tatsache ist, dass Sie es überall dereferenzieren. TRecordList? Wann können Sie möglicherweise einen Typnamen und ein Objekt dieses Typs verwechseln? Der Compiler wird Sie anschreien und Typen werden fast an keiner Stelle verwendet, an der sich Objekte befinden (außer bei statischen Eigenschaften / Methoden).

Jetzt gibt es einen Ort, an dem ich die ungarische Notation verwende. Hierbei handelt es sich um eine Vielzahl von UI-Variablen, die denselben Namen wie andere UI-Variablen oder reguläre Variablen haben.

Zum Beispiel, wenn ich ein Formular für Ihren Vornamen darauf hatte.

Ich hätte eine Klasse namens FirstNameForm. Darin lblFirstName und txtFirstName für die Bezeichnung bzw. das Textfeld. Und eine öffentliche FirstName-Eigenschaft zum Abrufen und Festlegen des Namens im Textfeld.

Dies könnte auch mit FirstNameLabel und FirstNameTextBox gelöst werden, aber ich finde, es wird lange zu tippen. Vor allem bei sowas wie GenderDropDownList und so.

Im Grunde genommen ist die ungarische Notation auf systematischer Ebene bestenfalls ärgerlich und im schlimmsten Fall schädlich (da die anderen Antworten Probleme mit Refactoring und Konsistenz aufzeigen).

Earlz
quelle