Có nên sử dụng toán tử ternary bên ngoài các câu lệnh gán?


9

Chỉnh sửa Đây không phải là một câu hỏi về việc liệu toán tử ternary có hại hay không . Đó là về việc có hay không có sự đồng thuận về việc có nên sử dụng nó ngoài các tuyên bố chuyển nhượng hay không. /Biên tập

Dựa trên một boolean, tôi muốn gọi một trong hai hàm khác nhau (không có giá trị trả về). Tôi đã viết một chút của javascript:

(condition) ? doThis(arg) : doThat(arg)

Mà tôi nghĩ có vẻ sạch sẽ hơn là viết ra một tuyên bố if-other:

if(condition) {
    doThis(arg);
}
else {
    doThat(arg);
}

Các đồng nghiệp của tôi tin tưởng mạnh mẽ các báo cáo ternary chỉ nên được sử dụng trong các tuyên bố chuyển nhượng. Tôi không thể tìm thấy các hướng dẫn kiểu thảo luận về điều này, có lẽ vì các ngôn ngữ như Java và C # hoàn toàn không cho phép điều này (trình biên dịch của chúng yêu cầu các toán tử tạm thời trả về giá trị). Điều này có nên được coi là sử dụng xấu của tuyên bố ternary? Tại sao?


Hãy nhớ rằng Jason Voorhees có thể được chỉ định duy trì mã đó của bạn.
David Hammen

2
@gnat - không phải là một bản sao của câu hỏi đó, đó là về cách sử dụng chung?: trong các biểu thức, trong khi đó cụ thể là sử dụng nó để thay thế cho if-if khi không có giá trị duy nhất nào được tính.
Jules

Mặc dù tôi có hai ý nghĩ về sự phù hợp của bản sao được đề xuất, câu hỏi này vẫn chủ yếu dựa trên ý kiến, vì vậy tôi không thấy bất kỳ điểm nào trong việc mở lại nó.
Ixrec

Tại sao bạn nghĩ rằng điều này trông sạch hơn? Các quy ước phá vỡ như thế này là trái ngược với sạch sẽ.
JacquesB

Câu trả lời:


10

Nói chung, toán tử điều kiện được dự định để thực hiện một câu lệnh if có giá trị . w = x ? y : z. Do đó, nếu bạn đang sử dụng nó cho các tác dụng phụ, nó phản tác dụng. Hợp lệ, nhưng phản trực giác; và hãy nhớ rằng bạn đang viết mã cho đồng đội của mình đọc.


Điều này có vẻ đúng. Gần như mọi ví dụ sử dụng tôi tìm thấy, bao gồm Wikipedia sử dụng toán tử để thực hiện phép gán có điều kiện.
BobbyA

3

Một vài trường hợp, không phải là bài tập, nơi tôi thấy các toán tử ternary hữu ích là:

Trong các đối số chức năng: theo ý kiến ​​của tôi

f( e1, .. cond ? em : dm, .. en);

ít bị lỗi hơn

if ( cond) f( e1, .. em, .. en); else f( e1, .. dm, .. en);

Khi bạn muốn gọi hàm này hay hàm khác với các đối số giống hệt nhau: một lần nữa tôi tìm thấy

(cond ? f : g)( /* long and complex argument list */);

ít bị lỗi hơn

if ( cond) f( /* long and complex argument list */);
else g( /* long and complex argument list */);

Theo tôi thấy, điều quan trọng trong mỗi trường hợp là? hình thức có ít sự lặp lại. Sự lặp lại mở ra khả năng thay đổi một trường hợp và quên thay đổi trường hợp khác.


5
Tuy nhiên, trong những trường hợp này, bạn vẫn đang sử dụng toán tử ternary để trả về một giá trị, theo câu trả lời của syrion ở trên, là một cách sử dụng dự kiến.
BobbyA

@BulkA còn chức năng void thì sao?
vui mừng
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.