Các vấn đề của kế unless trong Perl

Perl ngôn ngữ, như trong nhiều ngôn ngữ đã thiết kế if:

▶ Run
#!/usr/bin/perl

my $value;

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

Cơ thể if được thực hiện nếu tình trạng trở thành sự thật.

Nhưng ngoài ra để thiết kế if thậm chí còn có một kế unless. Cơ thể unlesschạy nếu trở lại tình trạng sai. Đây là mã mà làm việc chính xác giống như các lần trước, nhưng viết bằng cách sử dụng unless:

▶ Run
#!/usr/bin/perl

my $value;

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

Nếu bạn nhìn vào hai ví dụ này, chúng ta thấy rằng khi sử dụng unless , mã sử dụng ít cấu trúc (không phải viết !), nhưng mã là còn hơn 3 vật.

Ngoài ra tôi có nhiều để in, khi bạn sử dụng unless có thể có một vấn đề. Hãy tưởng tượng rằng chúng ta cần để Bổ sung mã của chúng tôi với unless. Bây giờ anh thực hiện một số hành động khi một biến $valueundef. Làm nhiệm vụ thực hiện một hành động trường hợp của một sự đảo ngược tình huống — khi $value là bất cứ điều gì, nhưng undef. Hoàn toàn tự nhiên, phản ứng trong tình huống này, là thêm elseđơn vị:

▶ Run
#!/usr/bin/perl

my $value;

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

Nó bật ra mã làm việc và mã này là dễ dàng để viết, nhưng nó bật ra xấu mã. Mã này là khó để sửa chữa và hiểu được. Thay vào đó, các mã sẽ phải viết trực tiếp:

▶ Run
#!/usr/bin/perl

my $value;

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

Rất tiếc, nếu mã gốc sử dụng unless, sau đó là một sự cám dỗ không phải thay đổi nó để if, và chỉ cần viết else. Nhưng nó chỉ ra xấu mã.

Nó được tin rằng có khả năng để viết unless-else nói chung là một sai lầm trong ngôn ngữ thiết kế. Và như vậy thiết kế nên không, thay vì làm việc.

unless, cũng như if có thể được sử dụng trong Tố hình thức:

▶ Run
#!/usr/bin/perl

my $value;

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

Khi bạn sử dụng Tố ký hiệu unless vấn đề unless-else không xảy ra, như trong này phiên bản else thường nơi nào để nhập.

Tổng đề nghị. Không bao giờ sử dụng thiết kế unless ( $bool ) { ... }, như nó dẫn sự suy thoái của các đọc mã. Về việc sử dụng unless một Tố thể nghiêm ngặt đề nghị không. Để sử dụng hay không Tố unless nó là một vấn đề của thỏa thuận trong đội và một vấn đề vị giác. Tác giả thích không bao giờ không sử dụng unless.

Các bài viết khác