it-swarm.com.de

Verwendung von "wenn" gegenüber "falls" für Perl-Bedingungen

Was sind einige Richtlinien für die beste Verwendung von if gegenüber unless im Perl-Code? Gibt es gute Gründe, in bestimmten Situationen den einen oder anderen zu bevorzugen?

49
JSBձոգչ

In Perl Best Practices wird empfohlen, niemals unless zu verwenden. Ich persönlich denke, das ist Wahnsinn.

Ich verwende unless, wenn es eine einfache Bedingung gibt, die ich sonst als if( ! ... ) schreiben würde. Ich finde die Version von unless besser lesbar, besonders wenn sie als Postfix verwendet wird:

do_something() unless $should_not_do_that;

Ich empfehle, unless zu vermeiden, wenn die Dinge komplizierter werden, z. B. wenn Sie elsif oder else Blöcke haben. (Zum Glück oder leider, je nach Perspektive, gibt es keine elsunless)

Jedes Mal, wenn eine Bedingung ein komplexer Ausdruck ist, der aus anderen Booleschen Elementen besteht. Zum Beispiel, 

unless( $foo and !$bar )

Ist ziemlich verdammt verwirrend und hat keinen Vorteil gegenüber dem Äquivalent if

58
friedo

Abgesehen von einem esoterischen Fall1 unless ist nur syntaktischer Zucker für if !. Es gibt Ihnen die Möglichkeit, Code zu schreiben, der klarer und aussagekräftiger ist. Es sollte verwendet werden, wenn es dieses Ziel erreicht, und es wird gemieden, wenn es es beeinträchtigt.

Ich finde unless am nützlichsten für die Flusskontrolle in Schleifen. z.B.

while (<$fh>) {
    next unless /\S/;
    # ...
}

Für einfache Negationen finde ich es klarer als eine negierte if - den führenden ! kann man beim Lesen des Codes leicht übersehen.

unless ($condition) {
    do_something();
}

if (!$condition) {
    do_something();
}

Aber schreibe nicht unless ... else, denn das ist nur erschütternd.

In Postfix-Form gibt es einen Hinweis auf den erwarteten Pfad durch den Code.

do_normal_thing() unless $some_unlikely_condition;


1) Der zuletzt bewertete Ausdruck ist anders, was das Verhalten von Subs ohne eine explizite return beeinflussen kann.

35
Michael Carman

Eine Faustregel besagt, dass 'wenn' wahrscheinlich selten verwendet werden sollte.

Es ist besonders nützlich in der Postfix-Form, z.

delete_old_widgets() unless $old_widget_count == 0

Situationen, in denen Sie niemals verwendet werden sollten, es sei denn:

  • mit einer zusammengesetzten Bedingung (und, oder, nicht)
  • mit einer anderen Klausel
12
Grant McLean

Ich habe vor kurzem eine Stunde damit verbracht, jemandem zu erklären, wie zwei verschachtelte "außer" -Klauseln funktionierten. Es war schwierig zu entschlüsseln, ohne sie in if-Anweisungen mit boolescher Logik umkehren zu müssen.

Wenn Sie versuchen, es in Englisch zu konvertieren, hilft es Ihnen, Sie zu führen.

Ein einfaches, wenn es gut funktioniert. Zum Beispiel.

"Wenn Sie nicht ruhig sind, werde ich Sie ignorieren.".

unless ($quiet) {
    ignore();
}

Obwohl ich denke, dass das genauso gut funktioniert

"Wenn Sie nicht ruhig sind, werde ich Sie ignorieren"

if (not $quiet) {
    ignore();
}

wenn es kompliziert wird, ist es, wenn Sie eine Negation haben.

"Wenn Sie nicht laut sind, werde ich Sie ignorieren"

unless ( ! $noisy) {
    ignore();
}

Weit besser als geschrieben

"Wenn Sie laut sind, werde ich Sie ignorieren"

if ($noisy) {
    ignore();
}

Verwenden Sie also kein 'außer', wenn Sie auch ein Negat haben.

Verwenden Sie auch "wenn nicht anders"

unless ($quiet) {
    ignore();
}
else {
    give_a_sweet();
}

"Wenn Sie nicht ruhig sind, werde ich Sie ignorieren, sonst werde ich Ihnen einen süßen geben"

Ändern Sie es, indem Sie die Bedingung umkehren.

if ($quiet) {
    give_a_sweet();
}
else {
    ignore();
}

'Wenn du still bist, werde ich dir einen süßen geben, sonst werde ich dich ignorieren'.

mit mehr als einer Bedingung wird es unordentlich.

unless ($quiet and not $fidgit) {
    punish();
}

"Wenn Sie nicht ruhig sind und nicht fidgit, werde ich Sie bestrafen.".

(Entschuldigung, mein Verständnis scheitert hier!)

negiere es wieder.

if (not $quiet or $fidgit) {
    punish();
}

'Wenn du nicht still bist oder fidgit, werde ich dich bestrafen'.

das Problem bei der Verwendung von "Wenn" auch für die einfachsten Fälle, oft (von Ihnen oder von außen)

Ich hoffe, das macht klar, wann Sie verwenden sollten oder nicht, es sei denn?

(sofern Sie keine andere Meinung haben?)

9
user3043717

Obwohl ich die Motivationen für diese Art von Fragen verstehe, halte ich es nicht für sinnvoll, die Verwendung von etwas wie unless in konkrete Faustregeln zu reduzieren. Dies ist, wie viele Hilfssyntax in Perl, eine einfache Bequemlichkeit für Programmierer, die ihnen helfen, sich nach ihrem eigenen Ermessen klarer zu artikulieren; Ich habe in "Programmierperl" in mehr als einer von den führenden Entwicklern so viel gesehen. Es gibt keinen höheren Zweck oder keine Rationalisierung. Ich bin mir durchaus bewusst, dass dies die Frage verfeinert, aber die einzige Einschränkung, die ich bei der Anwendung auferlegen würde, besteht darin, zu sehen, dass sie ihrem breiteren Zweck dient, den Code klarer zu machen. Wenn ja, dann ist alles gut. Das Erkennen, ob Code verständlich ist, ist an sich intuitiv und kann nicht auf eine Handvoll übermäßig allgemeiner Nutzungsbedingungen für jede Nuance der eingebauten Modifikatoren/Operatoren/Gesamtsyntax reduziert werden, und bei denen Einschränkungen und Richtlinien für große Gruppenprojekte erforderlich sind Ich glaube nicht, dass es sinnvoll wäre, die Haare so fein zu spalten.

2
cikkle

Meine Meinung wäre, niemals zu verwenden, es sei denn. Meine Gründe sind:

  • Ich denke, die Syntax macht es schwieriger, Code zu lesen. Wenn Sie eine einzige Methode zum Ausführen eines Wenns verwenden, wird die Sache einfacher und konsistenter.
  • Wenn Sie später eine else-Anweisung hinzufügen müssen, sollten Sie das if wirklich in ein if ändern. Es ist nur einfacher, wenn es bereits ein Wenn ist.
  • Wenn die Logik in der if-Anweisung komplexer wird, kann am Ende ein ungerader Code wie "es sei denn (x == 5 && y! = 7).".
  • Es gibt andere Möglichkeiten, Dinge zu negieren, z. B. x! = 5
  • Es ist eher mit anderen Sprachen vereinbar. Ich kenne keine andere Sprache, die eine Aussage ohne Angabe hat, und ich denke, dass es einen sehr guten Grund dafür gibt.

In Perl gibt es wirklich 4 Möglichkeiten, eine if -Anweisung zu schreiben, wenn, wenn nicht und dann die Prüfung am Ende der Zeile statt am Anfang platziert wird. Ich bevorzuge eine einheitliche Methode, die auch mit anderen Sprachen vereinbar ist.

Nur mein Wert von 0,02 $.

1
MikeKulls

Apropos ...

In den Best Practices von Perl wird empfohlen, niemals zu verwenden, es sei denn. Persönlich, Ich denke, das ist Wahnsinn.

Nach mehr als 20 Jahren, in denen Perl seinen Alternativen vorgezogen wurde (die meisten würden es nicht geben, wenn Perl nicht die Vorlage bereitgestellt hätte), stimme ich nicht nur dem 'Wahnsinn'-Urteil zu, ich bin überrascht (besorgt), diese' Best Practices 'zu hören 'will es loswerden.

Trotzdem bevorzuge ich Code, der aus Gründen der Klarheit geschrieben wurde, im Gegensatz zu den implizit verschleierten Alternativen, die einige Perl-Programmierer verwenden, "nur weil sie es können". 'than' ist das eindeutige Gegenteil von 'if' und daher eine sehr nützliche Alternative zum Einbetten einer Negation in eine 'if' - Bedingung, insbesondere wenn die Bedingung mehrere Operatoren enthält. Und diese Begründung gilt auch, wenn sie von else/elsif gefolgt wird. 

1
edwin

Vielleicht nur eine persönliche Meinung, aber ich benutze es gerne, wenn die if-Bedingung mit einem!

0
David Brunelle

Die Syntax if (! $ Condition) ist äquivalent zu if ($ condition) und auch, wenn Sie die NOT-Bedingung der Bedingung austauschen.

Ich persönlich bevorzuge nur IF-Anweisungen. Warum? Weil es weniger zu merken ist. Wenn Sie über 100 Codezeilen verfügen, die Hälfte davon mit if () und die andere Hälfte mit if (), müssen Sie mehr Zeit mit dem Debuggen verbringen, als wenn es nur if () -Anweisungen wären.

Sie können den Dreh raus "bekommen", es sei denn, und wenn, so dass das Gehen zwischen den beiden überhaupt keine Zeit braucht. Aber es geht nicht nur um if () oder es sei denn (). Vergiss das nicht ...

if($condition) {
    #passed-condition code
} else {
    #failed-condition code
}

...ist äquivalent zu...

unless(!$condition) {
    #passed-condition code
} else {
    #failed-condition code
}

Aber was ist mit if () {...} elsif () {...}? Wie würden Sie ein Äquivalent daraus machen, wenn nicht () {...} elsunless () {...}? Je komplizierter die Logik, desto schwieriger wird es, zwischen if () und wenn () zu wechseln. Je weniger Sie sich daran erinnern und in Erinnerung bleiben müssen, desto schneller können Sie Ihren eigenen Code debuggen.

0
HoldOffHunger