Toán tử ternary (điều kiện? Foo: bar) và toán tử XOR (^)


8

Tôi đã đọc trong một bài đánh giá mã gần đây rằng cả hai ternary operator (condition ? foo : bar)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.


5
Toán tử XOR khá hiếm trong lập trình cấp cao nói chung.

Các chức năng được cung cấp bởi cả hai thường được triển khai dưới dạng các câu lệnh IF-ELSE.

Câu trả lời:


8

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à ifgì?


7
Tôi nghĩ rằng chúng ta không thấy XOR hợp lý vì mọi người tìm thấy '! =' Dễ đọc hơn.
Nettogrof

1
Nó sẽ là một câu hỏi đố tuyệt vời, nhưng nó sẽ vô dụng trong một cuộc phỏng vấn. Biết một cái gì đó mà không ai đã thấy trong 10 năm và có thể sẽ không bao giờ sử dụng sẽ không cho tôi biết nếu bạn có thể viết mã tốt, dễ đọc và tung ra sản phẩm. :)
jmort253

1
@ jmort253: Nếu đã thấy loại mã này nhiều lần. Nhưng đó là mã không hợp lệ trong từng trường hợp. Vì vậy, một câu hỏi phỏng vấn như thế này sẽ cho tôi biết liệu người thay thế có biết cách phát hiện mã có mùi hay không.
AH

@AH - Ok, điều đó có ý nghĩa. Bạn chắc chắn muốn những người có thể phát hiện ra logic run rẩy. :)
jmort253

Ngoài ra, tôi đồng ý với @Nettogrof - Tôi đã sử dụng !=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.
Izkata

7

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.


3
Tôi sẽ nói rằng tôi sử dụng toán tử ternary rất nhiều, và tôi thấy nó khá dễ đọc. Đó chỉ là vấn đề làm quen với việc nhìn thấy nó, và như bạn đã nói, biết khi nào nên sử dụng nó. IMHO, nếu nó không vừa trên một dòng, thì hãy sử dụng if-other.
jmort253

Tôi nghĩ khi nào là rất quan trọng. Tại thời điểm xem xét, tôi đã gõ lại mã dọc theo dòng foo.setParam( bool ? ClassA.method() : ClassB.method ). Nó hoạt động, nhưng đó là một chút mùi, IMO.
chooban

Không chắc tôi đồng ý. Mặc dù nếu bạn và tôi làm việc cùng nhau, tôi sẽ cố gắng hết sức để chơi đẹp và bảo thủ trong việc sử dụng điều đó. :)
jmort253

Tất cả đều thuộc về bối cảnh. Ví dụ tôi đã nghĩ đến (tất nhiên, tôi không phải đưa / không thể đăng bài) là nơi logic kinh doanh về nơi lấy dữ liệu từ bị che khuất. Một ví dụ về một nơi nào đó có thêm một vài dòng mã và một nhận xét sẽ giúp nhà phát triển tiếp theo trong khu vực. Chỉ cần đừng bắt tôi sử dụng mã perl không thể đọc được unless ( !bool ) {. :)
chooban

3

Đâ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:

  1. 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.

  2. Đố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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.