El problema de la construcción unless en Perl

En el lenguaje de programación Perl, como en muchos otros lenguajes de programación hay un diseño de if:

▶ Run
#!/usr/bin/perl

my $value;

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

El cuerpo if se ejecuta si la condición devuelve la verdad.

Pero además de la construcción if todavía hay y diseño reverso unless. El cuerpo unlessse en el caso de si la condición devuelve false. He aquí el código que funciona exactamente igual que el anterior, pero por ejemplo, con los unless:

▶ Run
#!/usr/bin/perl

my $value;

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

Si mira estos dos ejemplos, se puede observar que cuando se utiliza unless en el código se usa menos diseños (no tiene que escribir !), pero el código resulta más largo en 3 caracteres.

Además de que representan más de la impresión, cuando se utiliza unless puede producirse una el problema. Supongamos que necesitamos completar nuestro código con unless. Ahora se realiza algún tipo de cuando en la variable $value se encuentra undef. Ha surgido la tarea de realizar una acción en el caso de la situación inversa, cuando en $value se encuentra lo que quieras, pero no undef. Natural la reacción a esta situación, añadir elsebloque:

▶ Run
#!/usr/bin/perl

my $value;

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

Ha resultado un código de trabajo y este código es simplemente escribir, pero ha resultado mal código. Este código es difícil de reparar y comprender. En lugar de ello, el código sería necesario escribir directamente:

▶ Run
#!/usr/bin/perl

my $value;

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

Por desgracia, si inicialmente el código utiliza la unless, entonces hay una gran tentación de no cambiar su if, y simplemente escribir else. Pero debido a esto, se obtiene el código de mala.

Existe la opinión de que la posibilidad de escribir unless-else es en absoluto un error en el lenguaje de diseño. Y tal el diseño debe generar un error, en vez de trabajar.

unless, así como if puede ser utilizado en постфиксном variante:

▶ Run
#!/usr/bin/perl

my $value;

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

Cuando se utiliza постфиксной grabación unless problemas unless-else no se produce, ya que en este la variante de else en absoluto dónde encajar.

Total de recomendación. Nunca usar el diseño unless ( $bool ) { ... }, ya que esto produce a un empeoramiento de la lectura del código. Sobre el uso de unless en постфиксном la variante de esa estricta recomendación no. Usar o no postfix unless es un asunto de acuerdos en equipo y una cuestión de gusto. El autor prefiere nunca no utilizar unless.

Otros articulos