Frage

Lohnt es sich, die Konvention zu lernen, oder beeinträchtigt sie die Lesbarkeit und Wartbarkeit?

War es hilfreich?

Lösung

Wenn man bedenkt, dass die meisten Leute, die es verwenden Ungarische Notation Wenn ich der missverstandenen Version davon folge, würde ich sagen, dass es ziemlich sinnlos ist.

Wenn Sie die ursprüngliche Definition verwenden möchten, ist dies möglicherweise sinnvoller, aber ansonsten handelt es sich hauptsächlich um syntaktischen Zucker.

Wenn Sie das lesen Wikipedia-Artikel Zu diesem Thema finden Sie zwei widersprüchliche Notationen: Systeme Ungarische Notation Und Apps Ungarische Notation.

Die ursprüngliche, gute Definition ist die Apps Ungarische Notation, aber die meisten Leute benutzen das Systeme Ungarische Notation.

Betrachten Sie als Beispiel für beides die Präfixierung von Variablen mit l für die Länge, a für die Fläche und v für das Volumen.

Mit einer solchen Notation ergibt folgender Ausdruck Sinn:

int vBox = aBottom * lVerticalSide;

aber das bedeutet nicht:

int aBottom = lSide1;

Wenn Sie die Präfixe mischen, sind sie als Teil der Gleichung zu betrachten, und Volumen = Fläche * Länge ist für eine Box in Ordnung, aber das Kopieren eines Längenwerts in eine Flächenvariable sollte einige Warnsignale auslösen.

Leider ist die andere Notation weniger nützlich, bei der den Variablennamen der Typ des Werts vorangestellt wird, etwa so:

int iLength;
int iVolume;
int iArea;

Manche Leute verwenden n für Zahl oder i für Ganzzahl, f für Float, s für String usw.

Das ursprüngliche Präfix sollte dazu dienen, Probleme in Gleichungen zu erkennen, hat sich aber irgendwie dahingehend entwickelt, den Code etwas lesbarer zu machen, da Sie nicht nach der Variablendeklaration suchen müssen.Mit den heutigen intelligenten Editoren, bei denen Sie einfach mit der Maus über eine Variable fahren können, um den vollständigen Typ und nicht nur eine Abkürzung dafür zu finden, hat diese Art der ungarischen Notation viel von ihrer Bedeutung verloren.

Aber Sie sollten sich Ihre eigene Meinung bilden.Ich kann nur sagen, dass ich beides nicht benutze.


Bearbeiten Nur um eine kurze Anmerkung hinzuzufügen, solange ich es nicht nutze Ungarische Notation, ich verwende ein Präfix und es ist der Unterstrich.Ich stelle allen privaten Feldern von Klassen ein _ voran und buchstabiere ihre Namen ansonsten wie eine Eigenschaft, Titelbuchstaben mit dem ersten Buchstaben in Großbuchstaben.

Andere Tipps

Die ungarische Namenskonvention kann bei richtiger Anwendung nützlich sein, leider wird sie jedoch häufig missbraucht.

Lesen Sie den Artikel von Joel Spolsky Falschen Code falsch aussehen lassen für eine angemessene Perspektive und Begründung.

Im Wesentlichen typbasierte ungarische Notation, bei der Variablen Informationen über ihren Typ vorangestellt werden (z. B.(ob ein Objekt ein String, ein Handle, ein Int usw. ist) ist meist nutzlos und verursacht im Allgemeinen nur einen Overhead mit sehr geringem Nutzen.Leider ist dies die ungarische Schreibweise, mit der die meisten Menschen vertraut sind.Der Zweck der vorgesehenen ungarischen Notation besteht jedoch darin, Informationen über die „Art“ der Daten hinzuzufügen, die die Variable enthält.Auf diese Weise können Sie Datenarten von anderen Datenarten trennen, die nicht miteinander vermischt werden sollten, außer möglicherweise durch einen Konvertierungsprozess.Zum Beispiel pixelbasierte Koordinaten vs.Koordinaten in anderen Einheiten oder unsichere Benutzereingaben im Vergleich zu Daten aus sicheren Quellen usw.

Betrachten Sie es so: Wenn Sie Code durchforsten, um Informationen zu einer Variablen herauszufinden, müssen Sie wahrscheinlich Ihr Benennungsschema anpassen, um diese Informationen aufzunehmen. Dies ist der Kern der ungarischen Konvention.

Beachten Sie, dass eine Alternative zur ungarischen Notation darin besteht, mehr Klassen zu verwenden, um die Absicht der Variablenverwendung anzuzeigen, anstatt sich überall auf primitive Typen zu verlassen.Anstelle variabler Präfixe für unsichere Benutzereingaben können Sie beispielsweise eine einfache String-Wrapper-Klasse für unsichere Benutzereingaben und eine separate Wrapper-Klasse für sichere Daten verwenden.Dies hat in stark typisierten Sprachen den Vorteil, dass die Partitionierung vom Compiler erzwungen wird (selbst in weniger stark typisierten Sprachen können Sie normalerweise Ihren eigenen Tripwire-Code hinzufügen), verursacht aber einen nicht unerheblichen Mehraufwand.

Ich verwende immer noch die ungarische Notation, wenn es um UI-Elemente geht, bei denen mehrere UI-Elemente mit einem bestimmten Objekt/Wert verknüpft sind, z. B.

lblFirstName für das Beschriftungsobjekt, txtFirstName für das Textfeld.Ich kann sie definitiv nicht beide „Vorname“ nennen, selbst wenn Das ist das Anliegen/die Verantwortung beider Objekte.

Wie gehen andere mit der Benennung von UI-Elementen um?

Es ist sinnlos (und ablenkend), wird aber in meinem Unternehmen relativ häufig verwendet, zumindest für Typen wie Ints, Strings, Booleans und Doubles.

Dinge wie sValue, iCount, dAmount oder fAmount, Und bFlag sind überall.

Es war einmal ein guter Grund für diese Tagung.Nun, es ist Krebs.

Ich denke, die ungarische Notation ist eine interessante Fußnote auf dem „Weg“ zu besser lesbarem Code, und wenn sie richtig gemacht wird, ist sie besser, als sie nicht zu machen.

Wenn ich das aber sage, würde ich lieber darauf verzichten und stattdessen Folgendes sagen:

int vBox = aBottom * lVerticalSide;

Schreib Dies:

int boxVolume = bottomArea * verticalHeight;

Es ist 2008.Wir haben keine 80-Zeichen-Bildschirme mit fester Breite mehr!

Auch wenn Sie Variablennamen schreiben, die viel länger sind, sollten Sie auf jeden Fall eine Umgestaltung in Objekte oder Funktionen in Betracht ziehen.

Tut mir leid, dass ich noch eine Frage stellen muss, aber gilt das Voranstellen von „I“ bei Schnittstellen als ungarische Notation?Wenn das der Fall ist, dann nutzen es ja viele Menschen in der realen Welt.Wenn nicht, ignorieren Sie dies.

Ich sehe die ungarische Notation als eine Möglichkeit, die Kapazität unseres Kurzzeitgedächtnisses zu umgehen.Laut Psychologen können wir ungefähr speichern 7 plus oder minus 2 Stücke von Informationen.Die zusätzlichen Informationen, die durch die Einfügung eines Präfixes hinzugefügt werden, helfen uns, mehr Details über die Bedeutung eines Bezeichners bereitzustellen, auch wenn kein anderer Kontext vorhanden ist.Mit anderen Worten: Wir können erraten, wozu eine Variable dient, ohne zu sehen, wie sie verwendet oder deklariert wird.Dies kann durch die Anwendung von oo-Techniken wie vermieden werden Verkapselung und das Prinzip der Einzelverantwortung.

Mir ist nicht bekannt, ob dies empirisch untersucht wurde oder nicht.Ich würde vermuten, dass der Aufwand dramatisch zunimmt, wenn wir versuchen, Klassen mit mehr als neun Instanzvariablen oder Methoden mit mehr als 9 lokalen Variablen zu verstehen.

Ist der Umfang heutzutage nicht wichtiger als der Typ, z.

  • l für lokal
  • a für Argument
  • m für Mitglied
  • g für global
  • usw

Mit modernen Techniken zum Refactoring von altem Code ist das Suchen und Ersetzen eines Symbols, weil Sie seinen Typ geändert haben, mühsam, der Compiler erkennt zwar Typänderungen, aber oft nicht die falsche Verwendung des Bereichs. Sinnvolle Namenskonventionen helfen hier.

Wenn ich ungarische Diskussionen sehe, freue ich mich, wenn Leute intensiv darüber nachdenken, wie sie ihren Code klarer gestalten und Fehler sichtbarer machen können.Genau das sollten wir alle tun!

Aber vergessen Sie nicht, dass Ihnen neben der Benennung noch einige leistungsstarke Tools zur Verfügung stehen.

Extraktionsmethode Wenn Ihre Methoden so lang werden, dass Ihre Variablendeklarationen über den oberen Bildschirmrand hinausgescrollt sind, sollten Sie erwägen, Ihre Methoden zu verkleinern.(Wenn Sie zu viele Methoden haben, ziehen Sie eine neue Klasse in Betracht.)

Starkes Tippen Wenn Sie feststellen, dass Sie es einnehmen PLZs werden in einer ganzzahligen Variablen gespeichert und a zugewiesen Schuhgröße Wenn Sie eine ganzzahlige Variable verwenden, sollten Sie erwägen, eine Klasse für Postleitzahlen und eine Klasse für die Schuhgröße zu erstellen.Dann wird Ihr Fehler zur Kompilierungszeit erkannt, anstatt dass eine sorgfältige Prüfung durch einen Menschen erforderlich ist.Wenn ich das mache, finde ich normalerweise eine Reihe von Postleitzahlen- und Schuhgrößen-spezifischen Logiken, die ich in meinen Code eingefügt habe, die ich dann in meine neuen Klassen integrieren kann.Plötzlich wird mein gesamter Code klarer, einfacher und vor bestimmten Fehlerklassen geschützt.Wow.

Um zusammenzufassen:Ja, denken Sie genau darüber nach, wie Sie Namen im Code verwenden, um Ihre Ideen klar auszudrücken, aber achten Sie auch auf die anderen leistungsstarken OO-Tools, die Sie nutzen können.

Ich verwende keine sehr strenge ungarische Notation, aber ich benutze sie sparsam für einige gängige benutzerdefinierte Objekte, um sie leichter identifizieren zu können, und ich neige außerdem dazu, GUI-Steuerungsobjekten die Art der Steuerung voranzustellen, um die es sich handelt.Zum Beispiel labelFirstName, textFirstName und buttonSubmit.

Ich verwende ungarische Benennung für UI-Elemente wie Schaltflächen, Textfelder und Beschriftungen.Der Hauptvorteil ist die Gruppierung im Visual Studio Intellisense Popup.Wenn ich auf meine Labels zugreifen möchte, beginne ich einfach mit der Eingabe von lbl....und Visual Studio schlägt alle meine Etiketten vor, schön gruppiert.

Nachdem ich jedoch immer mehr Silverlight- und WPF-Aufgaben erledigt und dabei die Datenbindung genutzt habe, benenne ich nicht einmal mehr alle meine Steuerelemente, da ich sie nicht mehr über CodeBehind referenzieren muss (da es tatsächlich keinen CodeBehind mehr gibt). ;)

Was falsch ist, ist die Vermischung von Standards.

Richtig ist, dafür zu sorgen, dass alle das Gleiche tun.

int Box = iBottom * nVerticleSide

Das ursprüngliche Präfix sollte verwendet werden, um Probleme in Gleichungen zu erkennen, hat sich jedoch irgendwie dazu verleitet, den Code etwas einfacher zu lesen, da Sie nicht nach der Variablenerklärung suchen müssen.Bei den heutigen intelligenten Herausgebern, bei denen Sie einfach über eine Variable schweben können, um den vollständigen Typ zu finden, und nicht nur eine Abkürzung dafür, hat diese Art von ungarischer Notation viel von seiner Bedeutung verloren.

Ich breche die Gewohnheit ein wenig ab, aber das Voranstellen des Typs kann in JavaScript nützlich sein, das keine starke Variablentypisierung hat.

Wenn ich eine dynamisch typisierte Sprache verwende, verwende ich gelegentlich Apps Ungarisch.Für statisch typisierte Sprachen tue ich das nicht.Siehe meine Erklärung im anderen Thread.

In typsicheren Sprachen ist die ungarische Notation sinnlos.z.B.Ein häufiges Präfix, das Sie in altem Microsoft-Code finden, ist „lpsz“, was „langer Zeiger auf eine nullterminierte Zeichenfolge“ bedeutet.Seit dem frühen 18. Jahrhundert haben wir keine segmentierten Architekturen mehr verwendet, in denen kurze und lange Zeiger existieren, die normale String-Darstellung in C++ immer nullterminiert ist und der Compiler typsicher ist, sodass wir keine Nicht-String-Operationen darauf anwenden können Zeichenfolge.Daher sind diese Informationen für einen Programmierer nicht wirklich von Nutzen – es handelt sich lediglich um mehr Tipparbeit.

Ich verwende jedoch eine ähnliche Idee:Präfixe, die das verdeutlichen Verwendung einer Variablen.Die wichtigsten sind:

  • m = Mitglied
  • c = konst
  • s = statisch
  • v = flüchtig
  • p = Zeiger (und pp=Zeiger auf Zeiger usw.)
  • i = Index oder Iterator

Diese können kombiniert werden, sodass eine statische Mitgliedsvariable, die ein Zeiger ist, „mspName“ wäre.

Wo sind diese nützlich?

  • Wenn die Verwendung wichtig ist, ist es eine gute Idee, den Programmierer ständig daran zu erinnern, dass eine Variable z. B. eine flüchtige Variable oder ein Zeiger ist
  • Die Dereferenzierung von Zeigern hat mir immer den Kopf zerbrochen, bis ich das Präfix p verwendet habe.Jetzt ist es wirklich einfach zu erkennen, wann Sie ein Objekt (Orange), einen Zeiger auf ein Objekt (pOrange) oder einen Zeiger auf einen Zeiger auf ein Objekt (ppOrange) haben.Um ein Objekt zu dereferenzieren, setzen Sie einfach für jedes p in seinem Namen ein Sternchen davor.Fall gelöst, keine Deref-Bugs mehr!
  • In Konstruktoren finde ich normalerweise, dass ein Parametername mit dem Namen einer Mitgliedsvariablen identisch ist (z. B.Größe).Ich bevorzuge es, "msize = Größe" zu verwenden; als "size = thesize" oder "this.size = size".Es ist auch viel sicherer:Ich verwende nicht versehentlich „size = 1“ (Festlegen des Parameters), obwohl ich „mSize = 1“ (Festlegen des Mitglieds) sagen wollte.
  • In Schleifen sind meine Iteratorvariablen alle aussagekräftige Namen.Die meisten Programmierer verwenden „i“ oder „index“ und müssen dann neue bedeutungslose Namen („j“, „index2“) erfinden, wenn sie eine innere Schleife wünschen.Ich verwende einen aussagekräftigen Namen mit einem i-Präfix (iHospital, iWard, iPatient), damit ich immer weiß, was ein Iterator iteriert.
  • In Schleifen können Sie mehrere verwandte Variablen mischen, indem Sie denselben Basisnamen mit unterschiedlichen Präfixen verwenden:Orange orange = pOrange[iOrange];Dies bedeutet auch, dass Sie keine Array-Indizierungsfehler machen (pApple[i] sieht in Ordnung aus, aber wenn Sie es als pApple[iOrange] schreiben, ist der Fehler sofort offensichtlich).
  • Viele Programmierer werden mein System nutzen, ohne es zu wissen:indem ich ein längeres Suffix wie „Index“ oder „Ptr“ hinzufüge – es gibt meiner Meinung nach keinen guten Grund, eine längere Form als ein einzelnes Zeichen zu verwenden, also verwende ich „i“ und „p“.Weniger Tippen, konsistenter, einfacher zu lesen.

Dabei handelt es sich um ein einfaches System, das dem Code sinnvolle und nützliche Informationen hinzufügt und die Möglichkeit vieler einfacher, aber häufiger Programmierfehler ausschließt.

Ich arbeite seit 6 Monaten für IBM und habe es nirgendwo gesehen (Gott sei Dank, weil ich es hasse). Ich sehe entweder camelCase oder c_style.

thisMethodIsPrettyCool()
this_method_is_pretty_cool()

Es hängt von Ihrer Sprache und Umgebung ab.Im Allgemeinen würde ich es nicht verwenden, es sei denn, die Entwicklungsumgebung, in der Sie sich befinden, macht es schwierig, den Typ der Variablen zu finden.

Es gibt auch zwei verschiedene Arten der ungarischen Notation.Siehe Joels Artikel.Ich kann es nicht finden (seine Namen machen es nicht gerade leicht, sie zu finden), hat jemand einen Link zu dem, den ich meine?

Bearbeiten:Wedge hat den Artikel, den ich meine, in seinem Beitrag.

Originalform (Die richtige ungarische Notation :)), wobei Präfix Typ bedeutet (d. h.(Länge, Menge) des von der Variablen gespeicherten Werts ist in Ordnung, aber nicht in allen Arten von Anwendungen erforderlich.

Die beliebte Form (die falsche ungarische Notation), bei der Präfix Typ (String, int) bedeutet, ist in den meisten modernen Programmiersprachen nutzlos.

Vor allem bei bedeutungslosen Namen wie strA.Ich kann nicht verstehen, dass wir Menschen bedeutungslose Namen mit langen Präfixen verwenden, die nichts bringen.

Ich verwende typbasiert (Systems HN) für Komponenten (z. B. editFirstName, lblStatus usw.), da die automatische Vervollständigung dadurch besser funktioniert.

Ich verwende App HN manchmal für Variablen, bei denen die Typinformationen ausreichend sind.Das heißt, fpX gibt eine Variable mit festem Zeiger an (Typ int, kann aber nicht mit einem int gemischt und abgeglichen werden), rawInput für Benutzerzeichenfolgen, die nicht validiert wurden usw

Da ich ein PHP-Programmierer bin, bei dem es sehr locker typisiert ist, lege ich keinen Wert darauf, es zu verwenden.Gelegentlich identifiziere ich jedoch etwas als Array oder als Objekt, abhängig von der Größe des Systems und dem Umfang der Variablen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top