Problemet med design unless i Perl

I programmeringssproget Perl, som i mange andre programmeringssprog, der har design if:

▶ Run
#!/usr/bin/perl

my $value;

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

Kroppen if er udført, hvis betingelsen returnerer true.

Men, ud over at designe if selv har en omvendt design unless. Kroppen unlessløber hvis den betingelse giver false. Her er den kode, der fungerer nøjagtig den samme som i det foregående, men skrevet med unless:

▶ Run
#!/usr/bin/perl

my $value;

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

Hvis du ser på disse to eksempler, kan vi se, at når du bruger unless , til den kode bruger mindre strukturer (ikke behøver at skrive !), men koden er længere end 3 tegn.

Derudover har jeg mere at udskrive, når du bruger unless kan have en problemet. Forestil dig, at vi har brug for at Supplere vores kode med unless. Nu er han udfører nogle handlinger, når en variabel $value er undef. Har den opgave at udføre en handling i tilfælde af en omvendt situation — når $value er noget, men undef. Helt naturligt reaktionen i denne situation, er at tilføje elseenhed:

▶ Run
#!/usr/bin/perl

my $value;

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

Det viste sig at arbejde-kode, og denne kode er let at skrive, men det viste sig, dårlig kode. Denne kode er svært at løse og forstå. I stedet, den kode, der ville have til at skrive direkte:

▶ Run
#!/usr/bin/perl

my $value;

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

Desværre, hvis den oprindelige kode bruger unless, så der er en stor fristelse ikke at ændre det til if, og bare skrive else. Men det viser sig, dårlig kode.

Det menes, at evnen til at skrive unless-else er generelt en fejl i sprog design. Og sådan design skal mislykkes, i stedet for at arbejde.

unless, samt if kan bruges i Postfix form:

▶ Run
#!/usr/bin/perl

my $value;

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

Når du bruger Postfix notation unless problemer unless-else ikke forekommer, som i denne version else generelt ingen steder at komme ind.

Den samlede anbefaling. Aldrig bruge design unless ( $bool ) { ... }, som det fører til forringelse af læsbarheden af koden. Om brugen af unless en Postfix variant af denne strenge anbefaling nr. For at bruge eller ikke Postfix unless det er et spørgsmål om enighed i teamet og et spørgsmål om smag. Forfatteren foretrækker aldrig brug ikke unless.

Andre artikler