Was ist daran so schlimm?
Die Probleme mit indirekter Methode Notation sind vermeidbar, aber es ist viel einfacher, die Leute zu sagen indirekte Methode Notation zu vermeiden.
Das Hauptproblem ist, dass es sehr einfach ist, versehentlich die falsche Funktion aufzurufen.Nehmen Sie den folgenden Code ein, zum Beispiel:
package Widget;
sub new { ... }
sub foo { ... }
sub bar { ... }
sub method {
...;
my $o = new SubWidget;
...;
}
1;
In diesem Code wird new SubWidget
erwartet
SubWidget->new()
Stattdessen bedeuten, bedeutet dies eigentlich
new("SubWidget")
Das heißt, mit strengen Willen fangen die meisten dieser Instanzen dieses Fehlers. Wurden use strict;
dem obigen Schnipsel, der folgende Fehler hinzugefügt werden würde hergestellt werden:
Bareword "SubWidget" not allowed while "strict subs" in use at Widget.pm line 11.
Das heißt, es gibt Fälle, in denen mit streng den Fehler nicht fangen würde. Sie umfassen hauptsächlich die Verwendung von Parens um die Argumente des Methodenaufrufs (z. B. new SubWidget($x)
).
das heißt also
- Indirekte Object Notation Verwendung ohne parens in ungeraden Fehlermeldungen führen kann.
- Indirekte Objektnotation mit Parens kann dazu führen, dass der falsche Code aufgerufen wird.
Die erste ist erträglich, und die letztere ist vermeidbar. Aber anstatt den Leuten zu sagen: "Vermeiden Sie Parens um die Argumente von Methodenaufrufen mit Indirekter Methodennotation", sagen wir einfach "Vermeiden Sie die Verwendung der indirekten Methodennotation". Es ist einfach zu zerbrechlich.
Es gibt ein anderes Problem. Es ist nicht nur eine indirekte Objektnotation, sondern ein Problem, das in Perl unterstützt wird. Das Vorhandensein des Features verursacht mehrere Probleme. In erster Linie
Es verursacht einige Syntaxfehler, die zu sehr merkwürdigen/irreführenden Fehlermeldungen führen, da der Code ION zu verwenden scheint, wenn dies nicht der Fall war.
Es verhindert, dass nützliche Funktionen implementiert werden, da sie mit der gültigen ION-Syntax kollidieren.
Auf der positiven Seite hilft die Verwendung von no indirect;
das erste Problem.
Wie sollte diese Zeile neu geschrieben?
Der richtige Weg, um den Methodenaufruf zu schreiben, ist die folgende:
my $some_object = Some::Module->new(FIELD => 'value');
Das heißt, auch diese Syntax nicht eindeutig ist. Es wird zuerst überprüft, ob eine Funktion mit dem Namen Some::Module
existiert. Aber das ist sehr unwahrscheinlich, dass sich nur sehr wenige Menschen vor solchen Problemen schützen.Wenn Sie sich selbst schützen wollten, könnten Sie Folgendes verwenden:
my $some_object = Some::Module::->new(FIELD => 'value');
Mein Lieblingsbeispiel für indirekte Objektnotation: [Warum ist dieses Programm gültig? Ich habe versucht, einen Syntaxfehler zu erstellen] (http://stackoverflow.com/q/11695110/176646) – ThisSuitIsBlackNot
Das Hauptproblem mit ION ist es nicht so viel wie die Unterstützung für es in Perl zu verwenden. Das Vorhandensein des Features verursacht mehrere Probleme. Die zwei, an die ich mich gerade erinnern kann: 1) Es verursacht einige Syntaxfehler, die zu sehr merkwürdigen/irreführenden Fehlermeldungen führen. 2) Es verhindert, dass nützliche Funktionen implementiert werden, da sie mit der gültigen ION-Syntax kollidieren. – ikegami