2010-04-07 31 views
12

Tôi có các câu lệnh dài mà tôi sẽ gọi là x, y, v.v. ở đây. cấu trúc câu điều kiện của tôi đi như thế này:cấu trúc if-else

if(x || y || z || q){ 
    if(x) 
     do someth 
    else if (y) 
     do something 

    if(z) 
     do something 
    else if(q) 
     do something 
} 
else 
    do smthing 

Có một cách ngắn hơn để viết điều này? Cảm ơn

Trả lời

1

Điều này có vẻ khá rõ ràng đối với tôi (và rõ ràng là tốt).

Điều bạn có thể làm trước tiên là đánh giá x, y, z và q và lưu trữ chúng dưới dạng biến để bạn không phải thực hiện việc đó hai lần.

+3

@Thirler Hmm, mà sẽ đánh bại mục đích ngắn mạch đánh giá. Tôi nghĩ rằng trên trung bình giả sử xác suất bằng nhau và thời gian phức tạp của x, y, z, và q này sẽ là một tăng hiệu suất. Nhưng nếu xác suất của z là 50% và mất ít chế biến trong khi xác suất q là 1% và phải mất 95% công suất xử lý? Xem cách tối ưu hóa vi mô có thể khiến bạn gặp rắc rối khi không có chỉ số phù hợp? –

+0

vâng, chúng ta cần phải sử dụng tối đa một biến để kiểm tra – Halo

+0

@Tim Bạn cần các điều kiện cực kỳ dài (hoặc mã được thực hiện hàng triệu lần) để có hiệu suất thoát nước.Tôi chắc chắn không tối ưu hóa (câu hỏi không nói về nó), tôi đề nghị để cải thiện khả năng bảo trì. Nếu hiệu suất là quan trọng, bạn sẽ cần phải đệm kết quả của phép tính một cách minh bạch (ẩn nó đằng sau một hàm lưu trữ kết quả). Lưu ý rằng ví dụ đã cho thi hành một số điều kiện hai lần. Nhưng một quy tắc tốt không phải là để tối ưu hóa ở tất cả cho đến khi bạn thấy rằng phải mất một số lượng đáng kể thời gian để thực thi. – Thirler

1

Có thể điều này dễ đọc hơn một chút. Nhưng bây giờ bạn sẽ thực hiện một kiểm tra thêm. Nếu đó không phải là mã quan trọng của sứ mệnh thì có thể bạn có thể sử dụng như sau:

if (x) 
    do something; 
else if (y) 
    do something; 

if (z) 
    do something; 
else if(q) 
    do something; 

if !(x || y || z || q) 
    do something completely different. 
+2

Câu cuối cùng của bạn không giống như câu hỏi, tôi nghĩ bạn cần 'if! (X || y || z || q)' – Thirler

+0

và sử dụng cách khác là tốt hơn tôi đoán, để đọc. Bạn biết đấy, đảm bảo rằng chúng tôi không để lại lỗ – Halo

+0

Tôi không thấy cách này 'thực hiện một kiểm tra bổ sung'. Bạn có cùng số câu lệnh if sau khi tất cả :) –

4

Tôi không thấy vấn đề lớn với cách bạn viết ngay bây giờ. Tôi khuyên bạn nên sử dụng dấu ngoặc nhọn ngay cả đối với câu lệnh if-blocks. Điều này sẽ giúp bạn tránh được những sai lầm trong trường hợp bạn phải thêm nhiều dòng mã sau đó (và có thể quên thêm các dấu ngoặc nhọn sau đó). Tôi cũng thấy nó dễ đọc hơn. Mã này sẽ trông như thế này thì:

if (x || y || z || q) { 
    if (x) { 
     do something 
    } else if (y) { 
     do something 
    } 

    if (z) { 
     do something 
    } else if (q) { 
     do something 
    } 
} else { 
    do something 
} 
+0

+1 để sử dụng dấu ngoặc nhọn. Tôi muốn Java, C++, và các ngôn ngữ khác sẽ làm những gì "Go" làm và làm cho những niềng răng bắt buộc .... nó chắc chắn sẽ làm cho mã một địa ngục của rất nhiều dễ đọc hơn. –

+0

có và tôi luôn luôn sử dụng dấu ngoặc nhọn thực sự, cái ở trên chỉ là một nguyên mẫu hoặc một cái gì đó. – Halo

0

Tôi không giới thiệu sau đây, trên thực tế, tôi nghĩ rằng những gì bạn nhận được là tốt, nhưng:

s = true; 
if (x) { 
    do something; 
    s = false; 
} else if (y) { 
    do something; 
    s = false; 
} 
if (z) { 
    do something; 
    s = false; 
} else if (q) { 
    do something; 
    s = false; 
} 

if (s) { 
    so something; 
} 
4

Một biến thể mà tránh được nhiều kiểm tra và biểu thức logic phức tạp errorprone có thể là:

boolean conditionhandled = false; 
if (x) { 
    do something 
    conditionhandled = true; 
} else if (y) { 
    do something 
    conditionhandled = true; 
} 

if (z) { 
    do something 
    conditionhandled = true; 
} else if (q) { 
    do something 
    conditionhandled = true; 
} 

if (!conditionhandled) { 
    do something 
} 
+1

cảm ơn, tôi nghĩ chúng ta cần khởi tạo conditionhandled là false – Halo

+0

Rất tiếc! Cảm ơn bạn, tôi đã sửa lỗi này. –

0

Bạn có thể đưa ra một số giả định về x, y, z, q không? e.G. chỉ một trong số họ có thể đúng. Hơn bạn có thể xem nó như là một nhà nước

enum State { 
X{ 
    void doSomething(){ 
    doItTheXWay(); 
    } 
}, 
Y{ 
    void doSomething(){ 
    doItTheYWay(); 
    } 
}, 
Z{ 
    void doSomething(){ 
    doItTheZWay(); 
    } 
}, 
Q{ 
    void doSomething(){ 
    doItTheQWay(); 
    } 
}; 
    void doSomething(){ 

    } 
} 

và trong mã của bạn, nơi bạn sử dụng câu lệnh if

bạn có thể gán một nhà nước và chỉ cần làm điều đúng

State state = getAState(); 
state.doSomething(); 

Trong trường hợp bạn không thích enums Nhà nước có thể là một giao diện và X để Q có thể được thực hiện các lớp học. Những lợi ích trong trường hợp này là trong nhiều cách sử dụng giống nhau nếu người khác xây dựng. Giả sử một số codelines sau đó bạn sẽ bắt đầu với

if(x) 
    do_the_next_thing_with_X(); 
... 

hoặc bạn chỉ có thể mở rộng enum của bạn với chức năng khác và làm cho một cuộc gọi duy nhất

state.doTheNextThing();