Frage

In Perl ist der Hinweis auf alles ein einfacher Skalar und hat das $ Sigil. Es ist manchmal schwer zu sagen, welche Art von Referenz es ist.

Ich persönlich Präfix -Variablennamen für Referenzen mit einem Buchstaben, der den REF -Typ angibt. Beispiele:

my $aValues = [];                # arrayref
my $hValue  = {};                # hashref
my $oValue  = bless {};          # object
my $sValue  = \(my $s = 'foo');  # scalarref
...

Ich habe sowohl Anhänger als auch Gegner einer solchen Notation gesehen. Benutzt du es? Hat es irgendwelche Nachteile?

War es hilfreich?

Lösung

Persönlich finde ich ungarische Notation schwer zu lesen. Ich benutze nur englische Konventionen:

my $values; # is an array
my $value;  # is a scalar
my $value_hash; # is a hash

Normalerweise behandle ich Objekte genauso wie Scalare, weil die Art und Weise, wie es verwendet wird, so deutlich macht, dass es sich um ein Objekt handelt. Wenn ich jedoch jemals die Notwendigkeit finde, würde ich verwenden:

my $value_obj;  # is an object

Andere Tipps

Meh. ArrayRefs und Hashrefs und dergleichen sind nicht so verwirrend, dass das Problem sehr oft für unsere Perl-Data-Typen auftaucht. (Ebenfalls: $oValue? Wie generisch kannst du sein? Was für ein Objekt ist es?)

Gib mir stattdessen eine ungarische Notation von Semantic-Units: $size_bits, $size_bytes, $size_kb, $size_blocks, $size_mb, $size_gb. Der zugrunde liegende Datentyp? Nicht so wichtig wie das Hinzufügen von 3 Bytes zu 10 Megabyte pro Sekunde und 13. Dass Die ungarische Notation in irgendeiner Form ist nützlich.

Wenn Sie statisch eingegebene Sprachen möchten, wissen Sie, wo Sie sie finden können ...

Bei der ungarischen Notation war jedoch nie beabsichtigt, technische Datentypen zu tun (obwohl sie den größten Teil der schlechten Wiederholungen verdient hat, wenn sie für technische Datentypen missverstanden und angewendet wurden). Der Ungar, der es ursprünglich erfand (Charles Simonyi), beabsichtigte es zu vermitteln semantisch Informationen, zB verwenden row und col Präfixe im Code, der sich mit Tabellen befasst, damit Sie keine Zeile und Spaltenindizes vermischen.

Der Zweck der ungarischen Notation besteht darin, semantische Anmerkungen einzubetten, die

  • kann sonst nicht in der Sprache ausgedrückt werden, insbesondere im Typsystem und
  • sind aus dem Kontext nicht erkennbar

in den Namen von Variablen. Da Perl kein statisches System hat, scheint es, dass ungarische Notation ziemlich häufig sein sollte. Nehmen Sie jedoch das kanonische Beispiel für den Wert der ungarischen Notation: Verfolgung des Ursprungs nicht vertrauenswürdiger Daten.

Eines der oft zitierten Beispiele für ungarische Notation ist das Präfix aller Stringvariablen in einer Anwendung mit beiden s oder u (zum sicher und unsicher)), je nachdem, ob die Saite von einer vertrauenswürdigen Quelle stammte (oder saniert wurde) oder einer nicht vertrauenswürdigen. Aber: Ersetzen Sie einfach unsicher mit verdorben Und Sie haben eine perfekte Beschreibung von verdorbenen in Perl. In diesem Fall, obwohl Perl kein statisches System hat, hat es a dynamisch Typsystem, mit dem Sie die Semantik von vertrauenswürdig/nicht vertrauenswürdig in der Sprache ausdrücken können, und somit ist die ungarische Notation überflüssig. (Und selbst in einer Sprache ohne eingebaute Unterstützung für die verdorbene Unterstützung gibt es normalerweise viel bessere Wege wie Subtyping (Python, Ruby, SmallTalk, ...), Anmerkungen/Attribute (Java, C#, ...), Metadaten (Clojure, ...) und statische Typisierung (Haskell, ml, ...).)

Außerdem ist Perl verdammt ausdrucksstark, und daher ist es viel einfacher, den gesamten Kontext für eine Variable in Ihrem Kopf (oder innerhalb eines Screenful of Code) zu behalten, sodass die Semantik häufig aus dem umgebenden Code erkennbar ist.

Gute Benennung hilft natürlich auch.

Denken Sie daran: Die ungarische Notation wurde für C erfunden, was nicht ausdrucksstark ist und ein statisches System hat, dessen so ziemlich nur Verwendung als Pointe eines Witzes ist.

Ich mache das nicht, weil die Verwendung einer Referenz ihr Ding klar macht. Zum Beispiel:

$a->{key};  # hash
... if @$b; # array
$c->foo;    # object

Die Auswahl von Namen für Ihre Variablen, die kommunizieren, was sie darstellen, ist ein langer Weg. Perl wurde von einem Linguisten und einer Auswahl aus der natürlichen Sprache entworfen, daher ist der Kontext der Schlüssel. Unser Gehirn ist bereits für diese Art von Verarbeitung verkabelt. Verwenden Sie es in der Art und Weise, wie Sie Ihren Code strukturieren!

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