Der Titel fasst es ziemlich zusammen, aber hier ist sowieso die lange Version.
Nachdem ich einen kleinen Code mit Perl geschrieben hatte, wurde mir gesagt, ich solle die indirekte Objektnotation vermeiden, "da sie mehrere Nebenwirkungen hat". Der Kommentar verweist auf diese bestimmte Zeile:
%Vor%Da ich es immer so gemacht habe, um in die Zeit zu kommen, frage ich:
Ich wollte den Kommentator fragen, aber für mich ist das eine eigene Aufgabe wert.
Das Hauptproblem ist, dass es nicht eindeutig ist. Ist
%Vor% bedeutet, die Methode new
im Paket Some::Module
aufzurufen oder die Funktion new
im aktuellen Paket aufzurufen, mit dem Ergebnis, dass die Funktion Module
im Paket Some
aufgerufen wird die gegebenen Parameter?
d. h., es könnte geparst werden als:
%Vor% Die Alternative besteht darin, die explizite Methodenaufrufnotation Some::Module->new(...)
.
Normalerweise nimmt der Parser eine korrekte Vermutung an, aber die beste Vorgehensweise besteht darin, die Mehrdeutigkeit zu vermeiden.
Was ist daran so schlimm?
Die Probleme mit der indirekten Methodennotation sind vermeidbar, aber es ist viel einfacher, den Leuten zu sagen, dass sie die Indirekte Methodennotation vermeiden sollten.
Das Hauptproblem ist, dass es sehr einfach ist, versehentlich die falsche Funktion aufzurufen. Nehmen Sie den folgenden Code, zum Beispiel:
%Vor% In diesem Code wird erwartet, dass new SubWidget
Stattdessen bedeutet es eigentlich
%Vor% Das heißt, die Verwendung von strict wird die meisten dieser Instanzen dieses Fehlers erfassen. Wenn use strict;
zum obigen Snippet hinzugefügt würde, würde der folgende Fehler erzeugt:
Das heißt, es gibt Fälle, in denen die Verwendung von strict den Fehler nicht erfassen würde. Sie beinhalten hauptsächlich die Verwendung von Parens um die Argumente des Methodenaufrufs (z. B. new SubWidget($x)
).
Das heißt also
Ersteres ist erträglich, letzteres 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. Hauptsächlich
Auf der positiven Seite hilft no indirect;
beim ersten Problem.
Wie sollte diese Zeile neu geschrieben werden?
Die korrekte Methode zum Schreiben des Methodenaufrufs lautet wie folgt:
%Vor% Das heißt, auch diese Syntax ist mehrdeutig. Es wird zuerst überprüft, ob eine Funktion namens Some::Module
existiert. Aber das ist sehr unwahrscheinlich, dass sich nur sehr wenige Menschen vor solchen Problemen schützen. Wenn Sie sich schützen wollten, könnten Sie Folgendes verwenden:
Der Kommentator wollte nur Some::Module->new(FIELD => 'value');
als Konstruktor sehen.
Perl kann indirekte Objektsyntax für andere leere Wörter verwenden, die wie Methoden aussehen , aber heutzutage schlägt die perlobj
-Dokumentation vor, sie nicht zu benutzen.
Das allgemeine Problem dabei ist, dass auf diese Weise geschriebener Code mehrdeutig ist und Perls Parser zum Testen des Namensraums auf z. Überprüfen Sie, ob Sie method Namespace
schreiben, ob Namespace :: method existiert.
Tags und Links perl oop coding-style perl5