Masalah desain unless di Perl

Dalam bahasa pemrograman Perl, seperti dalam banyak bahasa pemrograman yang lain memiliki desain if:

▶ Run
#!/usr/bin/perl

my $value;

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

Tubuh if dilakukan jika kondisi kembali benar.

Tapi, selain desain if bahkan telah reverse desain unless. Tubuh unlessberjalan jika kondisi returns false. Berikut adalah kode yang bekerja persis sama seperti sebelumnya, tapi yang ditulis menggunakan unless:

▶ Run
#!/usr/bin/perl

my $value;

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

Jika anda melihat dua contoh ini, kita melihat bahwa ketika menggunakan unless , kode menggunakan kurang struktur (tidak harus menulis !), tetapi kode adalah lebih dari 3 karakter.

Selain itu saya memiliki lebih banyak untuk mencetak, ketika anda menggunakan unless mungkin memiliki satu masalah. Bayangkan bahwa kita perlu untuk Melengkapi kode kita dengan unless. Sekarang ia melakukan beberapa tindakan bila variabel $value adalah undef. Lakukan tugas untuk melakukan suatu tindakan dalam kasus membalikkan situasi — ketika $value adalah apa-apa tapi undef. Cukup alami reaksi dalam situasi ini adalah untuk menambah elseunit:

▶ Run
#!/usr/bin/perl

my $value;

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

Ternyata bekerja code dan kode ini adalah mudah untuk menulis, tapi ternyata kode yang buruk. Kode ini adalah sulit untuk memperbaiki dan memahami. Sebaliknya, kode akan memiliki untuk menulis secara langsung:

▶ Run
#!/usr/bin/perl

my $value;

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

Sayangnya, jika kode asli menggunakan unless, kemudian ada godaan besar untuk tidak mengubahnya untuk if, dan hanya menulis else. Tapi ternyata kode yang buruk.

Hal ini diyakini bahwa kemampuan menulis unless-else umumnya kesalahan dalam bahasa desain. Dan seperti desain harus gagal, bukan bekerja.

unless, serta if dapat digunakan dalam bentuk Postfix:

▶ Run
#!/usr/bin/perl

my $value;

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

Ketika anda menggunakan notasi Postfix unless masalah unless-else tidak terjadi, seperti dalam hal ini versi else umumnya tempat untuk masuk.

Total rekomendasi. Jangan pernah menggunakan desain unless ( $bool ) { ... }, karena mengarah kerusakan keterbacaan kode. Tentang penggunaan unless Postfix varian yang ketat ini rekomendasi no. Untuk menggunakan atau tidak Postfix unless itu adalah masalah kesepakatan dalam tim dan masalah selera. Penulis lebih suka tidak pernah jangan gunakan unless.

Artikel lainnya