Tôi đã đọc trong một bài đánh giá mã gần đây rằng cả hai ternary operator (condition ? foo : bar)
và XOR operator ^
hiếm khi được sử dụng trong Java. Có đúng không
Nếu có, điều này là do chúng ít đọc hơn? hoặc một số lý do khác.
Tôi đã đọc trong một bài đánh giá mã gần đây rằng cả hai ternary operator (condition ? foo : bar)
và XOR operator ^
hiếm khi được sử dụng trong Java. Có đúng không
Nếu có, điều này là do chúng ít đọc hơn? hoặc một số lý do khác.
Câu trả lời:
Toán tử ternary được sử dụng tốt, đặc biệt đối với các kiểm tra / mặc định null ngắn:
System.out.println("foo is "+(foo==null) ? "not set" : foo);
Một số người coi điều này không dễ đọc như nếu / khác, nhưng đó không phải là câu hỏi.
Toán tử bit XOR chỉ được sử dụng trong xử lý bit. Nếu bạn cần một XOR bitwise, thì không có cách nào xung quanh nó.
Toán tử logic XOR thực sự rất hiếm, đến nỗi tôi đã không thấy nó trong mười năm qua ở Java trong các trường hợp hợp lệ . Điều này cũng là do thực tế là XOR boolean "không chia tỷ lệ" như ||
hay &&
. Ý tôi là
if( a && b && c && d ) .... // it's clear what the intention is
if( a || b || c || d ) .... // here also
if( a ^ b ^ c ^ d ) .... // ???
Trong trường hợp cuối cùng tôi đoán, lập trình viên có nghĩa là "chỉ có một nên đúng". Nhưng XOR là một con thú. Các lập trình viên có được con thú và không phải những gì anh ta muốn.
Đó sẽ là một câu hỏi phỏng vấn thú vị: kết quả cuối cùng là if
gì?
!=
trên booleans một vài lần và XOR logic thậm chí không bao giờ vượt qua tâm trí của tôi.
Tôi đã từng tìm thấy toán tử ternary khó phân tích, nhưng tôi đã thấy rằng có một số nơi rất hữu ích. Chúng không có xu hướng logic ứng dụng, nhưng đăng nhập.
Ví dụ:
log.info( "Object foo is " + ( foo.isEnabled() ? "" : "not " ) + "enabled" );
Đối với tôi, điều đó gọn gàng hơn cả
if ( foo.isEnabled() )
log.info( "Foo is enabled" );
else
log.info( "Foo is not enabled" );
Hoặc là
log.info( "Foo is enabled : " + foo.isEnabled() );
Tóm lại, đó là một câu hỏi về nơi nó được sử dụng và cho điều đó.
Về phần khôn ngoan, tôi vẫn đấu tranh với những thứ đó nhưng đó là vì tôi đã từng làm việc ở mức độ trừu tượng cao, như các nhà bình luận khác đã đề xuất. Nếu tôi bắt gặp một nơi nào đó trong mã mà ai đó quyết định sử dụng nó là "hiệu quả", thì sẽ lãng phí thời gian trong khi tôi nhận ra điều đó phủ nhận lợi ích.
foo.setParam( bool ? ClassA.method() : ClassB.method )
. Nó hoạt động, nhưng đó là một chút mùi, IMO.
unless ( !bool ) {
. :)
Đây là nhiều hơn một câu trả lời dựa trên ý kiến nhưng trong trường hợp của tôi:
Thật vậy, vì một số lý do, tôi thấy toán tử ternary khó đọc hơn cấu trúc if-other.
Đối với XOR, có lẽ hầu hết các chương trình Java không sử dụng cho các thao tác bitwise mức thấp như vậy. Đối với hầu hết các phần, nó dường như chỉ là một di tích được thừa hưởng từ C.