Problem konstrukcji unless w Perl

W języku programowania Perl, jak i w wielu innych języków programowania jest konstrukcja if:

▶ Run
#!/usr/bin/perl

my $value;

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

Ciało if jest wykonywana w przypadku, gdy warunek zwraca prawdę.

Ale oprócz konstrukcji if jeszcze i zwrotna konstrukcja unless. Ciało unlessodbywa się w przypadku, gdy warunek zwraca wartość fałsz. Oto kod, który działa dokładnie tak samo jak poprzedni, ale napisany z wykorzystaniem unless:

▶ Run
#!/usr/bin/perl

my $value;

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

Jeśli spojrzeć na te dwa przykłady, to widać, że podczas korzystania z unless w kodzie jest mniej konstrukcji (nie trzeba pisać !), ale sam kod okazuje się dłuższe niż 3 znaki.

Poza tym, że trzeba już drukować przy użyciu unless może pojawić się jeszcze jedna problem. Powiedzmy, że musimy uzupełnić nasz kod z unless. Teraz on wykonuje jakieś działania gdy w zmiennej $value jest undef. Powstała zadanie wykonać przypadku odwrotnej sytuacji, gdy w $value znajduje się wszystko, ale nie undef. Całkowicie naturalna reakcja w tej sytuacji pisać elseblok:

▶ Run
#!/usr/bin/perl

my $value;

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

Okazało działający kod i kod ten był po prostu napisać, ale okazał się zły kod. Ten kod trudne do naprawy i rozumieć. Zamiast tego kodu trzeba było napisać wprost:

▶ Run
#!/usr/bin/perl

my $value;

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

Niestety, jeśli początkowo w kodzie wykorzystano unless, to istnieje duża pokusa, aby nie zmienić go na if, a wystarczy napisać else. Ale z tego powodu okazuje się zły kod.

Istnieje pogląd, że możliwość napisania unless-else to w ogóle jest błąd w konstrukcji języka. I taka konstrukcja musi wygenerować błąd, zamiast pracować.

unless, tak samo jak i if może być użyte w постфиксном wersji:

▶ Run
#!/usr/bin/perl

my $value;

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

Podczas korzystania z постфиксной wpisów unless problemy unless-else nie występuje, tak jak w tym wersji else w ogóle nie ma gdzie wpisać.

Ogółem zalecenie. Nigdy nie używać konstrukcję unless ( $bool ) { ... }, tak jak to prowadzi do pogorszenia czytelności kodu. O korzystanie z unless w постфиксном wariancie taka surowa zalecenia brak. Używać czy nie postinkrementacja unless to sprawa porozumienia w zespole i kwestia gustu. Autor woli w ogóle nigdy nie używać unless.

Inne artykuły