Das Problem der Konstruktion unless in Perl

In der Programmiersprache Perl, wie in vielen anderen Programmiersprachen ist die Konstruktion if:

▶ Run
#!/usr/bin/perl

my $value;

if (!defined $value) {
    print 'value must be defined';
}

Der Körper if wird ausgeführt wenn die Bedingung true zurückgibt.

Aber abgesehen von der Konstruktion if gibt es noch die umgekehrte Konstruktion unless. Körper unlessausgeführt wird falls die Bedingung ergibt false. Hier ist der Code, der funktioniert genauso wie die Vorherige, aber geschrieben unter Verwendung des unless:

▶ Run
#!/usr/bin/perl

my $value;

unless (defined $value) {
    print 'value must be defined';
}

Wenn man diese beiden Beispiele, so zeigt sich, dass bei der Verwendung unless im Code verwendet weniger Designs (nicht notwendig zu schreiben !), aber selbst der Code wird länger als 3 Zeichen.

Außerdem muss mehr Druck, bei der Verwendung unless kann ein weiteres auftreten Problem. Sagen wir, wir ergänzen müssen unseren Code mit unless. Jetzt führt er einige Aktionen wenn in der Variablen $value befindet sich undef. Entstanden ist die Aufgabe in eine Aktion auszuführen bei umgekehrter Situation — wenn in $value ist alles, aber nicht undef. Es ist eine Natürliche Reaktion in dieser Situation anzuhängen elseBlock:

▶ Run
#!/usr/bin/perl

my $value;

unless (defined $value) {
    print 'value must be defined';
} else {
    print 'value is defined';
}

War die funktionierende Code und diesen Code einfach zu schreiben, aber schlechter Code war. Dieser Code ist schwer zu reparieren und zu verstehen. Anstelle dieses Codes müssten gerade schreiben:

▶ Run
#!/usr/bin/perl

my $value;

if (defined $value) {
    print 'value is defined';
} else {
    print 'value must be defined';
}

Leider, wenn man im Code verwendet unless, dann gibt es eine große Versuchung, nicht zu ändern, auf if, und einfach schreiben else. Aber aus diesem Grund erweist es sich schlechter Code.

Es wird angenommen, dass die Fähigkeit zu schreiben unless-else ist das überhaupt ein Fehler im Design der Sprache. Und solche der Bau sollte einen Fehler ausgeben, anstatt zu arbeiten.

unless, ebenso wie if kann in постфиксном Variante:

▶ Run
#!/usr/bin/perl

my $value;

print 'value must be defined' unless defined $value;

Bei der Verwendung постфиксной Aufnahme unless Probleme unless-else nicht auftreten, da in diesem Variante else überhaupt nirgends eintragen.

Gesamt Empfehlung. Verwenden Sie niemals den Entwurf unless ( $bool ) { ... }, da dies führt zu einer Verschlechterung der Lesbarkeit des Codes. Über die Verwendung von unless in постфиксном Ausführungsform einer solchen strengen Empfehlungen nicht. Verwenden oder nicht Postfix unless ist es Sache der Absprache im Team und Geschmackssache. Der Autor bevorzugt im Allgemeinen nie nicht verwenden unless.

Andere Artikel