Ist 'shift' schlecht für die Verarbeitung von Perl-Unterprogrammparametern?
Bin ich Häufig mit shift
zu entpacken-Funktion Parameter:
sub my_sub {
my $self = shift;
my $params = shift;
....
}
Aber viele meiner Kollegen sind zu predigen, dass shift
ist tatsächlich böse. Können Sie erklären, warum sollt ich lieber
sub my_sub {
my ($self, $params) = @_;
....
}
zu shift
?
InformationsquelleAutor der Frage Nikolai Prokoschenko | 2009-08-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Einsatz von
shift
zum entpacken der Argumente ist nicht böse. Es ist eine Allgemeine Konvention und kann der Schnellste Weg, um Prozess-Argumente (je nachdem, wie viele es sind und wie Sie sind) übergeben. Hier ist ein Beispiel für ein Recht häufiges Szenario, in dem das der Fall ist: eine einfache accessor.Der Ergebnisse auf perl 5.8.8 auf meinem Rechner:
Nicht dramatisch, aber es ist so. Immer testen Sie Ihr Szenario, in dem Sie Ihre perl-version auf der Ziel-hardware, um herauszufinden, für sicher.
shift
ist auch nützlich in Fällen, wo Sie verschieben möchten, aus der invocant und rufen dann eineSUPER::
Methode übergeben, die restlichen@_
.Wenn ich hatte eine sehr lange Reihe von
my $foo = shift;
Operationen an der Spitze einer Funktion, jedoch, könnte ich überlegen, ein Massen kopieren von@_
statt. Aber im Allgemeinen, wenn Sie eine Funktion oder Methode, die dauert mehr als eine Handvoll Argumente, benannte Parameter verwenden (d.h., fangen alle@_
im%args
hash oder erwartet einen einzigen hash-Referenz-argument), ist ein viel besserer Ansatz.InformationsquelleAutor der Antwort John Siracusa
Ist es nicht böse, es ist eine Geschmack Sache. Sie werden oft sehen, wie die Stile zusammen:
Neige ich zum
shift
wenn es ein argument oder, wenn ich will, behandeln die ersten paar Argumente, die anders als der rest.InformationsquelleAutor der Antwort Chas. Owens
Dies ist, wie die anderen gesagt haben, ist eine Frage des Geschmacks.
Ich in der Regel lieber meine shift-Parameter in lexikale, weil es mir einen standard-Ort zu erklären, eine Gruppe von Variablen, werden im Unterprogramm verwendet. Die extra Ausführlichkeit gibt mir einen schönen Ort zu hängen Kommentare. Es macht es auch einfach default Werte in eine ordentliche Mode.
Wenn Sie wirklich besorgt über die Geschwindigkeit der Aufruf der Routinen, nicht entpacken, deine Argumente überhaupt-greifen Sie direkt über
@_
. Seien Sie vorsichtig, das sind Verweise auf die Anrufer-Daten, die Sie arbeiten mit. Dies ist eine gemeinsame Redewendung in POE. POE bietet eine Reihe von Konstanten, die Sie verwenden, um get-Parameter mit Namen:Nun die dummen großen Fehler, den Sie bekommen können, wenn Sie Ihren gewöhnlichen entpacken params mit shift ist:
Ich denke, dass eine konsequente code-Stil ist wichtiger als eine bestimmte Stil. Wenn alle meine Mitarbeiter verwendet, die Liste der Zuordnung der Art, ich würde es auch benutzen.
Wenn mein Mitarbeiter sagte, es sei ein großes problem mit shift zu entpacken, ich würde Fragen, für eine demonstration, warum es schlecht ist. Wenn der Fall solide ist, dann würde ich etwas lernen. Wenn der Fall Humbug ist, dann könnte ich es widerlegen und zu stoppen, die Verbreitung von anti-Kenntnisse. Dann würde ich vorschlagen, dass wir bestimmen einen standard-Methode und Folgen für die zukünftige code. Ich könnte sogar versuchen, eine Perl::Critic-Richtlinie zu prüfen, für die entschieden ist standard.
InformationsquelleAutor der Antwort daotoad
Zuweisung @_ eine Liste bringen kann einige helpul zusätzliche features.
Es macht es etwas einfacher, fügen Sie zusätzliche benannten Parametern zu einem späteren Zeitpunkt, als du den code so ändern, Einige Leute betrachten diese eine Funktion, ähnlich wie bei der Beendigung einer Liste oder einen hash mit einem nachgestellten ',' macht es etwas einfacher Anhängen Mitglieder in der Zukunft.
Wenn Sie in der Gewohnheit der Verwendung dieser Redewendung, dann die Verschiebung der Argumente mag schädlich, weil, wenn Sie den code Bearbeiten, um einen zusätzlichen argument, Sie könnten am Ende mit einem subtilen Fehler, wenn man nicht aufpasst.
z.B.
später bearbeitet werden, um
jedoch
Wenn ein anderer Kollege, der mit der ersten form dogmatisch (vielleicht denken Sie shift ist böse) bearbeitet Ihr die Datei und geistesabwesend updates dazu zu Lesen
und Sie kann eingeführt haben, einen subtilen Fehler.
Zuweisung an @_ mehr sein kann, kompakt und effizient mit vertikalen Raum, wenn Sie eine kleine Anzahl von Parametern zuweisen auf einmal. Es ermöglicht auch für Sie liefern Standard-Argumente wenn Sie die hash-Stil namens Funktion Parameter
z.B.
Ich würde noch Bedenken das es eine Frage von Stil /Geschmack. Ich denke, das wichtigste ist, um einen Stil oder das andere mit Konsistenz, gehorchen dem Prinzip der geringsten überraschung.
InformationsquelleAutor der Antwort cms
Ich glaube nicht, dass
shift
ist böse. Die Verwendung vonshift
zeigt Ihre Bereitschaft, eigentlich der name Variablen - statt mit$_[0]
.Persönlich benutze ich
shift
wenn es nur einen einzigen parameter in einer Funktion. Wenn ich mehr als einen parameter, ich werde die Liste Kontext.InformationsquelleAutor der Antwort Kevin
Perl::Critic ist dein Freund hier. Es folgt die "standards" eingerichtet, in der Damian Conway 'Buch" Perl Best Practices. Läuft es mit --verbose 11 gibt Ihnen eine Erklärung, warum die Dinge sind schlecht. Nicht Auspacken @_ als erste in Ihrer subs ist ein Schweregrad von 4 (von 5). E. g:
InformationsquelleAutor der Antwort olle
Gibt es eine Optimierung für die Listen-Zuweisung.
Die einzige Referenz, die ich finden konnte, ist diese eine.
Dies ist ein Beispiel für die betroffene Leistung regression.
InformationsquelleAutor der Antwort Brad Gilbert
Ist es nicht wirklich schlechtes, aber es verwenden, um ziehen Sie die Argumente einer subroutine ein, die durch einen vergleichsweise langsam und erfordert eine größere Anzahl von code-Zeilen.
InformationsquelleAutor der Antwort Quentin