2013-03-21 18 views
5

Đây là một vấn đề rất nhỏ: Có bốn hàm boolean: a(), b(), c() và d(). Tôi muốn tiếp tục gọi họ theo thứ tự cho đến khi người đầu tiên trả về true. thay vì làm truyền thốngThay thế các chuỗi bị xích với các hoạt động ngắn mạch

if(!a()) { 
    if(!b()) { 
     if(!c()) { 
      d(); 
     } 
    } 
} 

hoặc

if(!a() && !b() && !c()) d(); 

tôi nghĩ về cách viết các biểu hiện như một đánh giá ngắn mạch.

(a() || b() || c() || d()); 

Nhưng tôi chưa bao giờ thấy thử nghiệm này được thực hiện theo cách này trong mã C/C++. Có bất kỳ vấn đề với phương pháp này mà tôi đang thiếu?

Cảm ơn.

+0

Tôi có thể thấy * năm * hàm boolean. –

+3

@chris hoặc không thay đổi ý nghĩa: d() chỉ được thực thi nếu tất cả các hàm khác là sai. – Loghorn

+3

Tôi khuyên bạn nên chống lại điều này từ một quan điểm bảo trì. Nó có thể không được ngay lập tức rõ ràng cho mọi người những gì mã không khi họ nhìn thấy các phiên bản ngắn mạch (nếu đó là một mối quan tâm cho bạn). Thực tế là bạn phải hỏi về hành vi tại SO phải là một gợi ý về những gì sẽ xảy ra khi người khác đọc mã của bạn. – Michael

Trả lời

3

Mã bạn đã viết hợp lệ. d() sẽ chỉ được đánh giá nếu các hàm boolean khác trả về false.

Tuy nhiên, đánh giá ngắn mạch là ít dễ đọc hơn, và dễ bị lỗi từ quan điểm bảo trì, bởi vì người đọc có thể không hiểu nó một cách tầm thường.

+0

tại sao nó dễ bị lỗi? – user666412

+3

Bạn đã hiểu sai. 'd()' được đánh giá nếu không có hàm KHÁC trả về true. Mà tôi đoán làm cho quan điểm của bạn về khả năng đọc. –

+0

Cảm ơn Ben. Đã vội vàng. – meyumer

2

Chúng tương đương nhau, nhưng giải pháp đánh giá ngắn mạch có thể ít dễ đọc hơn, đặc biệt nếu tên hàm dài hoặc chấp nhận tham số.