Il problema di progettazione unless in Perl

Nel linguaggio di programmazione Perl, come in molti altri linguaggi di programmazione di un disegno if:

▶ Run
#!/usr/bin/perl

my $value;

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

Il corpo if si verifica se la condizione restituisce true.

Ma oltre a progettazione if ci sono ancora e progettazione inversa unless. Il corpo unlessviene in caso se la condizione restituisce false. Ecco il codice, che funziona esattamente come il precedente, ma scritto con le unless:

▶ Run
#!/usr/bin/perl

my $value;

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

Se si guarda a questi due esempi, visto che quando si utilizza unless nel codice viene utilizzato meno disegni (non è necessario scrivere !), ma il codice risulta più lungo di 3 caratteri.

Inoltre che rappresentano più la stampa, quando si utilizza unless può verificarsi un altro problema. Immaginiamo che dobbiamo completare il nostro codice con unless. Ora si esegue un qualche tipo di azione quando in una variabile $value è undef. Si è verificato il compito di eseguire un'azione in caso di situazione di feedback — quando in $value si trova qualsiasi cosa, ma non undef. Completamente naturale la reazione a questa situazione finire elseunità:

▶ Run
#!/usr/bin/perl

my $value;

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

Il risultato operativo codice e il codice era solo per scrivere, ma si è rivelato un cattivo codice. Questo codice è difficile da riparare e capire. Invece il codice sarebbe stato necessario scrivere direttamente:

▶ Run
#!/usr/bin/perl

my $value;

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

Purtroppo, se inizialmente il codice utilizza unless, cioè una grande tentazione di non cambiare il suo if, e basta scrivere else. Ma a causa di questo, si scopre cattivo codice.

C'è la convinzione che la possibilità di scrivere unless-else è generalmente un errore nella progettazione del linguaggio. E tale il design dovrebbe dare errore, invece di lavorare.

unless, così come if può essere usato in постфиксном edizione:

▶ Run
#!/usr/bin/perl

my $value;

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

Quando si utilizza postfix registrazione unless problemi unless-else non si verifica, come in questo edizione else in generale un posto dove entrare.

Totale raccomandazione. Non usare mai la progettazione unless ( $bool ) { ... }, in quanto porta a peggiorare la leggibilità del codice. Circa l'uso unless in постфиксном edizione così severa raccomandazione no. Usare o no постфиксный unless questo caso gli accordi di squadra e una questione di gusto. L'autore preferisce mai non utilizzare unless.

Altri articoli