Để ternary hay không ternary? [đóng cửa]


186

Cá nhân tôi là người ủng hộ nhà điều hành ternary: ()? :; Tôi nhận ra rằng nó có vị trí của nó, nhưng tôi đã bắt gặp nhiều lập trình viên hoàn toàn chống lại việc sử dụng nó và một số người sử dụng nó quá thường xuyên.

Cảm xúc của bạn về nó là gì? Bạn đã thấy mã nào thú vị khi sử dụng nó?


22
Một người ủng hộ một cái gì đó là một người ủng hộ điều đó.
Doug McClean

8
Sử dụng nó khi nó rõ ràng, tránh nó khi nó nhầm lẫn. Đó là một cuộc gọi phán xét. Nó có thể làm cho mã dễ đọc hơn, nhưng chỉ cho các biểu thức đơn giản. Cố gắng luôn luôn sử dụng nó cũng giống như một mối đe dọa không ngừng tránh nó.
Abel

3
Trên thực tế, đó là toán tử có điều kiện. Một câu hỏi gần giống nhau là stackoverflow.com/questions/725973/ ,.
Daniel Daranas

Thỉnh thoảng tôi đã sử dụng x = x if x else ynhưng sau đó hỏi về nó và nhận ra sự giúp đỡ của người khác rằng nó thực sự chỉ giảm xuống x = x hoặc y ( stackoverflow.com/questions/18199381/elf-references-ternary/iêu )
Scruffy

4
Những câu hỏi như thế này không nên được coi là không mang tính xây dựng.
Ungeheuer

Câu trả lời:


243

Chỉ sử dụng cho các biểu thức đơn giản :

int a = (b > 10) ? c : d;

Đừng xâu chuỗi hoặc lồng các toán tử ternary vì khó đọc và khó hiểu:

int a = b > 10 ? c < 20 ? 50 : 80 : e == 2 ? 4 : 8;

Ngoài ra, khi sử dụng toán tử ternary, hãy xem xét định dạng mã theo cách cải thiện khả năng đọc:

int a = (b > 10) ? some_value                 
                 : another_value;

80
Hoàn toàn đồng ý với một vài tuyên bố đầu tiên nhưng hoàn toàn không đồng ý với ví dụ của bạn về "khả năng đọc được cải thiện". Nếu bạn đang đi nhiều dòng tại sao không sử dụng câu lệnh if?
Joe Phillips

3
chỉ vì nếu khác là khá dài dòng cho các quyết định đơn giản: int a = 0; if (b> 10) a = some_value; khác a = other_value; Bạn thích cái nào hơn?
marcospereira

44
@ d03boy: Bởi vì if-statement chỉ là vậy, một tuyên bố và sẽ không làm khi tất cả những gì bạn muốn là một biểu thức.
falstro

2
@roe trong một số ngôn ngữ nếu là biểu thức (ví dụ: trong Scala), vì vậy val x = if(true) 0 else 1hoàn toàn hợp pháp
om-nom-nom

5
@ om-nom-nom case in point, điều đó sẽ làm cho nó thành một biểu thức if, chứ không phải là một câu lệnh if và về cơ bản giống như toán tử ?: -.
falstro

140

Nó làm cho việc gỡ lỗi hơi khó khăn hơn vì bạn không thể đặt các điểm dừng trên mỗi biểu thức phụ. Tôi hiếm khi sử dụng nó.


44
Đó là cuộc tranh luận tốt nhất chống lại người điều hành chim nhạn mà tôi từng nghe. Tôi không mua đối số "không thể đọc được" (nghe có vẻ như mọi người quá lười để làm quen với nó) nhưng điều này thực sự có chất.
EpsilonVector

80

Tôi yêu chúng, đặc biệt là các ngôn ngữ an toàn.

Tôi không thấy nó như thế nào:

int count = (condition) ? 1 : 0;

khó hơn cái này:

int count;

if (condition)
{
  count = 1;
} 
else
{
  count = 0;
}

biên tập -

Tôi cho rằng các nhà khai thác ternary làm cho mọi thứ ít phức tạp hơn và gọn gàng hơn so với giải pháp thay thế.


5
Khởi tạo ternary thậm chí còn hữu ích hơn trong D hoặc C ++ khi biến không đổi. ví dụ const int count = ...;
deft_code

Chà, bạn đang nhầm lẫn if/elsevới những cái niềng răng không cần thiết ở đó.
bobobobo

1
Ngoài ra, trong trường hợp này nếu conditionbool bạn chỉ có thể làm int count = condition;
bobobobo

1
@bobobobo điều này if/elsevới niềng răng là cách mà phần lớn các lập trình viên sẽ viết lại ternary ..
Andre Figueiredo

1
@bobobobo nếu / khác w / o niềng răng chỉ là yêu cầu rắc rối. Thật quá dễ dàng để ai đó thêm một dòng, nhưng quên rằng sau đó sẽ cần niềng răng để làm những gì họ mong đợi (thực hiện dòng bổ sung như một phần của một khối): stackoverflow.com/a/381274/377225
George Marian

43

Chained tôi ổn với - lồng nhau, không quá nhiều.

Tôi có xu hướng sử dụng chúng nhiều hơn trong C đơn giản vì chúng là một câu lệnh if có giá trị, vì vậy nó cắt giảm sự lặp lại hoặc các biến không cần thiết:

x = (y < 100) ? "dog" :
    (y < 150) ? "cat" :
    (y < 300) ? "bar" : "baz";

thay vì

     if (y < 100) { x = "dog"; } 
else if (y < 150) { x = "cat"; }
else if (y < 300) { x = "bar"; } 
else              { x = "baz"; }

Trong các bài tập như thế này, tôi thấy nó ít phải cấu trúc lại và rõ ràng hơn.

Mặt khác, khi tôi làm việc với ruby, tôi sẽ sử dụng nhiều hơn if...else...endvì đó cũng là một biểu hiện.

x =   if (y < 100) then "dog"
    elif (y < 150) then "cat"
    elif (y < 300) then "bar"
    else                "baz"
    end

(mặc dù, thừa nhận, đối với một cái gì đó đơn giản, tôi chỉ có thể sử dụng toán tử ternary).


2
Tôi thích ví dụ đầu tiên của bạn - tôi chưa từng nghĩ đến việc xâu chuỗi chúng như thế trước đây. Cám ơn vì đã chia sẻ. =)
Erik Forbes

5
+1 Tôi thực sự gần đây đã bắt đầu làm điều đó. Tôi thực sự thậm chí làm điều đó để thay thế các báo cáo chuyển đổi.
Davy8

1
Ví dụ tuyệt vời @rampion.
ylluminate

39

?:Toán tử Ternary chỉ đơn thuần là một chức năng tương đương với ifcấu trúc thủ tục . Vì vậy, miễn là bạn không sử dụng các ?:biểu thức lồng nhau , các đối số cho / chống lại biểu diễn chức năng của bất kỳ hoạt động nào được áp dụng ở đây. Nhưng các hoạt động ternary lồng nhau có thể dẫn đến mã hoàn toàn khó hiểu (bài tập cho người đọc: hãy thử viết một trình phân tích cú pháp sẽ xử lý các điều kiện ternary lồng nhau và bạn sẽ đánh giá cao sự phức tạp của chúng).

Nhưng có rất nhiều tình huống trong đó việc sử dụng ?:toán tử thận trọng có thể dẫn đến mã thực sự dễ đọc hơn so với cách khác. Ví dụ:

int compareTo(Object object) {
    if((isLessThan(object) && reverseOrder) || (isGreaterThan(object) && !reverseOrder)) {
       return 1;
    if((isLessThan(object) && !reverseOrder) || (isGreaterThan(object) && reverseOrder)) {
       return -1;
    else
      return 0;              
}

Bây giờ so sánh với điều này:

int compareTo(Object object) {
    if(isLessThan(object))
        return reverseOrder ? 1 : -1;         
    else(isGreaterThan(object))
        return reverseOrder ? -1 : 1;
    else        
       return 0;              
}

Vì mã nhỏ gọn hơn nên nó ít nhiễu cú pháp hơn và bằng cách sử dụng toán tử ternary một cách thận trọng (điều đó chỉ liên quan đến thuộc tính ReverseOrder ), kết quả cuối cùng không đặc biệt khó hiểu.


tôi vẫn sẽ ủng hộ việc sử dụng các giải thưởng cho mọi công trình if / then / other không phải là ternary tho, vì vậy ví dụ thứ hai của bạn thiếu một vài imho.
Kris

Vâng, nó là chức năng. Nó giống như một hàm nhỏ có một đối số boolean duy nhất và trả về bất kỳ kiểu nào bạn muốn! Thực sự là một nhà điều hành gọn gàng.
bobobobo

24

Đó là một câu hỏi về phong cách, thực sự; các quy tắc tiềm thức tôi có xu hướng tuân theo là:

  • Chỉ đánh giá 1 biểu thức - vì vậy foo = (bar > baz) ? true : false, nhưng KHÔNGfoo = (bar > baz && lotto && someArray.Contains(someValue)) ? true : false
  • Nếu tôi đang sử dụng nó để hiển thị logic, ví dụ: <%= (foo) ? "Yes" : "No" %>
  • Chỉ thực sự sử dụng nó để phân công; không bao giờ chảy logic (vì vậy không bao giờ (foo) ? FooIsTrue(foo) : FooIsALie(foo)) Luồng logic trong ternary tự nó là một lời nói dối, bỏ qua điểm cuối cùng đó.

Tôi thích nó bởi vì nó ngắn gọn và thanh lịch cho các hoạt động chuyển nhượng đơn giản.


hướng dẫn tốt và ví dụ tốt đẹp!
nickf

Tôi nghĩ rằng hầu hết các langau sẽ không cho phép bạn sử dụng nó cho logic luồng, vì vậy bạn không thể làm (foo)? True (foo): Sai (foo); trừ khi đó là một nhiệm vụ.
Henry B

Rất tiếc, vâng, bạn đúng, xấu của tôi.
Keith Williams

21
Hai ví dụ đầu tiên của bạn thực sự tồi tệ. Kết quả so sánh đã là các giá trị boolean, vì vậy các toán tử ternary của bạn là vô dụng và chỉ làm phức tạp mã.
Trillian

1
@Trillian +1 Có, đáng lẽ phải đi với một nhiệm vụ khác. foo = (bar > baz);đơn giản hơn nhiều
Eric

18

Giống như rất nhiều câu hỏi về ý kiến, câu trả lời là không thể tránh khỏi: nó phụ thuộc

Đối với một cái gì đó như:

return x ? "Yes" : "No";

Tôi nghĩ rằng đó là nhiều hơn súc tích (và nhanh hơn cho tôi để phân tích) hơn:

if (x) {
    return "Yes";
} else {
    return "No";
}

Bây giờ nếu biểu thức điều kiện của bạn là phức tạp, thì hoạt động ternary không phải là một lựa chọn tốt. Cái gì đó như:

x && y && z >= 10 && s.Length == 0 || !foo

không phải là một ứng cử viên tốt cho các nhà điều hành ternary.

Bên cạnh đó, nếu bạn là lập trình viên C, GCC thực sự có một tiện ích mở rộng cho phép bạn loại trừ phần if-true của ternary, như thế này:

/* 'y' is a char * */
const char *x = y ? : "Not set";

Mà sẽ đặt xthành ygiả sử ylà không NULL. Đồ tốt.


Đã sửa lỗi cú pháp và ngữ pháp nhẹ, Sean :-) Thiếu y từ bit mã cuối cùng và "gán x cho y" có nghĩa là "y = x", vì vậy tôi chgd thành "đặt x thành y".
paxdiablo

@Pax: Cảm ơn! Tôi đã khôi phục thay đổi cú pháp vì tôi đã cố gắng chỉ ra rằng với các tiện ích mở rộng GCC, bạn không cần phần if-true của ternary.
Sean Bright

Xin lỗi, đã không thấy đoạn đó. Không biết rằng tôi đồng ý với loại công cụ đó mặc dù nó cho phép mọi người viết mã không được biên dịch bằng trình biên dịch chuẩn ISO. Tuy nhiên, khi GCC là người đứng cuối cùng, điều đó sẽ không thành vấn đề :-)
paxdiablo

Đó là voodoo, chắc chắn ... Và ai không sử dụng GCC? : D
Sean Bright

14

Trong tâm trí của tôi, nó chỉ có ý nghĩa khi sử dụng toán tử ternary trong trường hợp cần một biểu thức.

Trong các trường hợp khác, có vẻ như toán tử ternary giảm độ rõ.


vấn đề là 99% ngôn ngữ, một biểu thức có thể được thay thế bằng một hàm ... và ppl tránh toán tử ternary thậm chí sẽ thích giải pháp đó.
PierreBdR

11

Bằng cách đo độ phức tạp chu kỳ , việc sử dụng các ifcâu lệnh hoặc toán tử ternary là tương đương. Vì vậy, bằng biện pháp đó, câu trả lời là không , độ phức tạp sẽ hoàn toàn giống như trước đây.

Bằng các biện pháp khác như khả năng đọc, khả năng duy trì và DRY (Không lặp lại chính mình), một trong hai lựa chọn có thể chứng minh tốt hơn các biện pháp khác.


10

Tôi sử dụng nó khá thường xuyên ở những nơi mà tôi bị hạn chế làm việc trong một hàm tạo - ví dụ, các cấu trúc .NET 3.5 LINQ to XML mới - để xác định các giá trị mặc định khi tham số tùy chọn là null.

Ví dụ giả định:

var e = new XElement("Something",
    param == null ? new XElement("Value", "Default")
                  : new XElement("Value", param.ToString())
);

hoặc (cảm ơn asterite)

var e = new XElement("Something",
    new XElement("Value",
        param == null ? "Default"
                      : param.ToString()
    )
);

Bất kể bạn có sử dụng toán tử ternary hay không, đảm bảo mã của bạn có thể đọc được là điều quan trọng. Bất kỳ cấu trúc có thể được thực hiện không thể đọc được.


Hoặc ... var e = new XEuity ("Something", new XEuity ("value", param == null? "Mặc định": param.toString ()));
asterite

2
Tôi thích rằng bạn đang định dạng nó để dễ đọc, rất nhiều không.
bruceatk

Mã nguồn nào có thể đọc được nếu con người không đọc được? =)
Erik Forbes

9

Tôi sử dụng toán tử ternary bất cứ khi nào tôi có thể, trừ khi nó làm cho mã rất khó đọc, nhưng sau đó thường chỉ là một dấu hiệu cho thấy mã của tôi có thể sử dụng một chút tái cấu trúc.

Nó luôn đánh đố tôi làm thế nào một số người nghĩ rằng toán tử ternary là một tính năng "ẩn" hoặc có phần bí ẩn. Đó là một trong những điều đầu tiên tôi học được khi bắt đầu lập trình bằng C và tôi không nghĩ nó giảm khả năng đọc. Đó là một phần tự nhiên của ngôn ngữ.


1
Tôi hoàn toàn đồng ý. Không có gì ẩn hoặc khó khăn về nó.
mmattax

2
Nó có thể gây ra các vấn đề dễ đọc, đặc biệt là khi lồng nhau.
David Thornley

Tôi nghĩ rằng " cực kỳ khó đọc" là một chút quá dễ dàng, nhưng nói chung tôi đồng ý với bạn. Không có gì khó khăn hay thần bí về nó.
EpsilonVector

8

(Hack trong ngày)

#define IF(x) x ?
#define ELSE :

Sau đó, bạn có thể thực hiện if-then-other dưới dạng biểu thức:

int b = IF(condition1)    res1
        ELSE IF(condition2)  res2
        ELSE IF(conditions3) res3
        ELSE res4;

7

Tôi đồng ý với jmulder: nó không nên được sử dụng thay cho a if, nhưng nó có vị trí của biểu thức trả về hoặc bên trong một biểu thức:

echo "Result: " + n + " meter" + (n != 1 ? "s" : "");
return a == null ? "null" : a;

Cái trước chỉ là một ví dụ, nên sử dụng i18n hỗ trợ số nhiều tốt hơn!


Ternary đầu tiên là không chính xác - bạn đã có một: ở đâu? nên đi: (n! = 1 ? "s": "")
Erik Forbes

Vâng, cảm ơn vì đã chỉ ra điều đó! Đã sửa.
PhiLho

6

Nếu bạn đang sử dụng toán tử ternary cho một bài tập có điều kiện đơn giản, tôi nghĩ nó ổn. Tôi đã thấy nó (ab) được sử dụng để kiểm soát luồng chương trình mà thậm chí không thực hiện chuyển nhượng và tôi nghĩ rằng nên tránh điều đó. Sử dụng một câu lệnh if trong những trường hợp này.


5

Tôi nghĩ rằng toán tử ternary nên được sử dụng khi cần thiết. Đây rõ ràng là một lựa chọn rất chủ quan, nhưng tôi thấy rằng một biểu thức đơn giản (đặc biệt là biểu thức trả về) rõ ràng hơn nhiều so với một bài kiểm tra đầy đủ. Ví dụ trong C / C ++:

return (a>0)?a:0;

So với:

if(a>0) return a;
else return 0;

Bạn cũng có trường hợp giải pháp nằm giữa toán tử ternary và tạo hàm. Ví dụ trong Python:

l = [ i if i > 0 else 0 for i in lst ]

Thay thế là:

def cap(value):
    if value > 0:
        return value
    return 0
l = [ cap(i) for i in lst ]

Điều cần thiết là đủ trong Python (như một ví dụ), một thành ngữ như vậy có thể được nhìn thấy thường xuyên:

l = [ ((i>0 and [i]) or [0])[0] for i in lst ]

dòng này sử dụng các thuộc tính của các toán tử logic trong Python: chúng lười biếng và trả về giá trị cuối cùng được tính nếu nó bằng trạng thái cuối cùng.


3
Dòng cuối cùng đó làm tổn thương não tôi ...
Erik Forbes

5

Tôi thích chúng Tôi không biết tại sao, nhưng tôi cảm thấy rất tuyệt khi tôi sử dụng biểu thức ternary.


5

Tôi đã nhìn thấy những con thú như vậy (nó thực sự tồi tệ hơn nhiều vì nó làValidDate và cũng được kiểm tra tháng và ngày, nhưng tôi không thể bận tâm cố gắng nhớ toàn bộ):

isLeapYear =
    ((yyyy % 400) == 0)
    ? 1
    : ((yyyy % 100) == 0)
        ? 0
        : ((yyyy % 4) == 0)
            ? 1
            : 0;

trong đó, rõ ràng, một loạt các câu lệnh if sẽ tốt hơn (mặc dù phiên bản này vẫn tốt hơn phiên bản macro tôi từng thấy).

Tôi không quan tâm đến những điều nhỏ nhặt như:

reportedAge = (isFemale && (Age >= 21)) ? 21 + (Age - 21) / 3 : Age;

hoặc thậm chí những điều hơi khó khăn như:

printf ("Deleted %d file%s\n", n, (n == 1) ? "" : "s");

Làm thế nào bạn có thể nói một loạt các cách ly nếu các câu lệnh sẽ dễ đọc hơn? Tôi đọc "con thú" của bạn tốt . reportedAgelà ví dụ cần một số hình dung - có lẽ bởi vì đó là một trường hợp cụ thể hơn là tìm raisThisYearALeapYear
Axeman

4

Chà, cú pháp cho nó thật kinh khủng. Tôi thấy ifs chức năng rất hữu ích, và thường làm cho mã dễ đọc hơn.

Tôi sẽ đề nghị tạo một macro để làm cho nó dễ đọc hơn, nhưng tôi chắc chắn rằng ai đó có thể đưa ra một trường hợp cạnh khủng khiếp (như luôn có CPP).


nhiều triển khai và biến thể BASIC có chức năng IF thay thế cho toán tử ternary. Tôi đã thấy một số cơ sở mã với định nghĩa là macro trong C.
Sparr

Vâng, tôi đã nghĩ về ngôn ngữ lập trình chức năng, nhưng có.
Marcin

"Tạo một macro để làm cho nó dễ đọc hơn", bạn khá là người thích đùa!
niXar

4

Tôi thích sử dụng toán tử trong mã gỡ lỗi để in các giá trị lỗi vì vậy tôi không phải tìm kiếm chúng mọi lúc. Thông thường tôi làm điều này cho các bản in gỡ lỗi sẽ không còn tồn tại sau khi tôi hoàn thành phát triển.

int result = do_something();
if( result != 0 )
{
  debug_printf("Error while doing something, code %x (%s)\n", result,
                result == 7 ? "ERROR_YES" :
                result == 8 ? "ERROR_NO" :
                result == 9 ? "ERROR_FILE_NOT_FOUND" :
                "Unknown");
}


4

Tôi gần như không bao giờ sử dụng toán tử ternary bởi vì bất cứ khi nào tôi sử dụng nó, nó luôn khiến tôi phải suy nghĩ nhiều hơn sau này khi tôi cố gắng duy trì nó.

Tôi muốn tránh tính dài dòng, nhưng khi nó làm cho mã dễ nhận hơn rất nhiều, tôi sẽ tìm kiếm tính dài dòng.

Xem xét:

String name = firstName;

if (middleName != null) {
    name += " " + middleName;
}

name += " " + lastName;

Bây giờ, đó là một chút dài dòng, nhưng tôi thấy nó dễ đọc hơn nhiều so với:

String name = firstName + (middleName == null ? "" : " " + middleName)
    + " " + lastName;

hoặc là:

String name = firstName;
name += (middleName == null ? "" : " " + middleName);
name += " " + lastName;

Nó chỉ có vẻ nén quá nhiều thông tin vào quá ít không gian, mà không làm rõ những gì đang diễn ra. Mỗi khi tôi thấy toán tử ternary được sử dụng, tôi luôn tìm thấy một sự thay thế có vẻ dễ đọc hơn nhiều ... thì một lần nữa, đó là một ý kiến ​​cực kỳ chủ quan, vì vậy nếu bạn và đồng nghiệp của bạn thấy rất dễ đọc, hãy tìm nó.


1
Đó không hẳn là điều tương tự. Trong ví dụ thứ hai, bạn nén cả ba câu lệnh thành một dòng. Đó là những gì làm giảm khả năng đọc, không phải là toán tử ternary.
ilitrite

Đủ công bằng, tôi đã cập nhật để kết hợp nhận xét của bạn, nhưng nó vẫn cảm thấy lộn xộn với tôi ... nhưng một lần nữa, nó mang tính chủ quan ... Tôi không nói rằng ternary là không thể đọc được, tôi nói rằng nó không thể đọc được với tôi (99 % thời gian)
Mike Stone

3

Chỉ khi:

$ var = (đơn giản> kiểm tra? đơn giản_result_1: đơn giản_result_2);

HÔN.


3

Tôi thường sử dụng trong những thứ như thế này:

before:

if(isheader)
    drawtext(x,y,WHITE,string);
else
    drawtext(x,y,BLUE,string);

after:

    drawtext(x,y,isheader==true?WHITE:BLUE,string);

Tất nhiên, trong hầu hết các ngôn ngữ, bạn cũng sẽ không cần phần "== true" của ternary đó.
Michael Haren

Tôi nhận ra rằng, mặc dù tôi có xu hướng đưa nó vào chỉ để làm cho mã dễ đọc hơn vì trình biên dịch sẽ tối ưu hóa nó thành điều tương tự như không có == dù sao đi nữa
KPexEA

trong không ngôn ngữ mà bạn có thể có thể cần "== true"
niXar

Tôi đã có thời gian khó khăn để quyết định có nên upvote hay không. Ví dụ này rất hay nhưng == TRUE là thứ tôi không thể nhìn thấy trong mã của người khác.
Peter Perháč

3

Như những người khác đã chỉ ra rằng họ là tốt đẹp cho các điều kiện đơn giản ngắn. Tôi đặc biệt thích chúng cho các giá trị mặc định (giống như | |hoặc cách sử dụng trong javascript và python), vd

int repCount = pRepCountIn ? *pRepCountIn : defaultRepCount;

Một cách sử dụng phổ biến khác là khởi tạo một tham chiếu trong C ++. Vì các tham chiếu phải được khai báo và khởi tạo trong cùng một câu lệnh, bạn không thể sử dụng câu lệnh if.

SomeType& ref = pInput ? *pInput : somethingElse;

2
Thật ngạc nhiên khi đây là lần đầu tiên đề cập đến các tài liệu tham khảo khởi tạo, đây là một trong số ít nơi "nếu" không thể được sử dụng thay vì?:. (Tôi đoán bởi vì đây không phải là một câu hỏi cụ thể về C ++ ...) Chúng cũng hữu ích trong các danh sách khởi tạo của nhà xây dựng, vì lý do tương tự.
j_random_hacker

2

Tôi đối xử với các nhà khai thác ternary rất nhiều như GOTO. Chúng có vị trí của chúng, nhưng chúng là thứ mà bạn thường nên tránh để làm cho mã dễ hiểu hơn.


2

Gần đây tôi đã thấy một biến thể của các toán tử ternary (tốt, sắp xếp) làm cho biến thể "()?:" Tiêu chuẩn dường như là một tuyệt phẩm của sự rõ ràng:

var Result = [CaseIfFalse, CaseIfTrue][(boolean expression)]

hoặc, để đưa ra một ví dụ hữu hình hơn:

var Name = ['Jane', 'John'][Gender == 'm'];

Xin lưu ý bạn, đây là Javascript, vì vậy những thứ như thế có thể không thể thực hiện được bằng các ngôn ngữ khác (rất may).


1
wow, thật kinh khủng! tưởng tượng lồng một vài trong số đó với nhau! Điều hữu ích mơ hồ duy nhất tôi có thể thấy đó là nếu bạn có một hàm trả về mảng 2 phần tử: var Name = getNames () [Giới tính == 'm']; ... nhưng điều đó thậm chí còn ÍT!
nickf

2

Đối với trường hợp đơn giản, tôi thích sử dụng nó. Trên thực tế, việc đọc / mã dễ dàng hơn nhiều như là các tham số cho các hàm hoặc những thứ tương tự. Ngoài ra để tránh dòng mới tôi muốn giữ với tất cả nếu / khác.

Không có nó sẽ là một KHÔNG lớn trong cuốn sách của tôi.

Vì vậy, tiếp tục, trong một trường hợp nếu / khác tôi sẽ sử dụng toán tử ternary. Đối với các trường hợp khác, thường xuyên if / other if / other (hoặc switch)


2

Tôi thích trường hợp đặc biệt của Groovy của toán tử ternary, được gọi là toán tử Elvis:?:

expr ?: default

Mã này ước tính expr nếu nó không null và mặc định nếu có. Về mặt kỹ thuật, nó không thực sự là một nhà điều hành ternary, nhưng nó chắc chắn có liên quan đến nó và tiết kiệm rất nhiều thời gian / đánh máy.


Vâng, tôi cũng thích cái đó - đó là ??trong C #, toán tử hợp nhất null: stackoverflow.com/questions/278703/
trộm

2

Đối với các tác vụ đơn giản như gán một giá trị khác nhau tùy theo điều kiện, chúng rất tuyệt. Tôi sẽ không sử dụng chúng khi có các biểu thức dài hơn tùy thuộc vào điều kiện tho.


2

Rất nhiều câu trả lời đã nói, nó phụ thuộc . Tôi thấy rằng nếu không thể nhìn thấy so sánh ternary trong một lần quét nhanh mã, thì nó không nên được sử dụng.

Là một vấn đề phụ, tôi cũng có thể lưu ý rằng chính sự tồn tại của nó thực sự là một chút bất thường do trong C, kiểm tra so sánh là một tuyên bố. Trong Biểu tượng, ifcấu trúc (giống như hầu hết Biểu tượng) thực sự là một biểu thức. Vì vậy, bạn có thể làm những việc như:

x[if y > 5 then 5 else y] := "Y" 

... mà tôi thấy dễ đọc hơn nhiều so với toán tử so sánh. :-)

Gần đây có một cuộc thảo luận về khả năng thêm ?:toán tử vào Icon, nhưng một số người đã chỉ ra một cách chính xác rằng hoàn toàn không cần thiết vì cách thức ifhoạt động.

Điều đó có nghĩa là nếu bạn có thể làm điều đó bằng C (hoặc bất kỳ ngôn ngữ nào khác có toán tử ternery), thì trên thực tế, bạn sẽ không cần toán tử ternery.


2

Nếu bạn và đồng nghiệp của bạn hiểu những gì họ làm và họ không được tạo trong các nhóm lớn, tôi nghĩ họ làm cho mã ít phức tạp hơn và dễ đọc hơn vì đơn giản là có ít mã hơn.

Lần duy nhất tôi nghĩ các nhà khai thác ternary làm cho mã khó hiểu hơn là khi bạn có nhiều hơn 3 hoặc 4 trong một dòng. Hầu hết mọi người không nhớ rằng họ là quyền ưu tiên dựa trên quyền và khi bạn có một chồng họ, điều đó làm cho việc đọc mã trở thành một cơn ác 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.