2013-05-02 7 views
5

Tôi có một chức năng đó là như sauSimplifing một lồng NẾU tuyên bố

string Foo(bool A, bool B) 
{ 
    if(A) 
    { 
     if(B) 
     { 
      return "W"; 
     } 
     else 
     { 
      return "X"; 
     } 
    } 
    else 
    { 
     if(B) 
     { 
      return "Y"; 
     } 
     else 
     { 
      return "Z"; 
     } 
    } 
} 

Đó đôi làm tổ chỉ cảm thấy không đúng với tôi. Có cách nào tốt hơn để triển khai mẫu này không?


Cảm ơn tất cả mọi người đã trợ giúp, tôi sẽ kết thúc với lộ trình ba chiều. Nó giúp tắt chức năng này:

if (female) 
{ 
    if (nutered) 
    { 
     destRow["TargetSex"] = "FS"; 
    } 
    else 
    { 
     destRow["TargetSex"] = "F"; 
    } 
} 
else 
{ 
    if (nutered) 
    { 
     destRow["TargetSex"] = "MN"; 
    } 
    else 
    { 
     destRow["TargetSex"] = "M"; 
    } 
} 

trong này

destRow["TargetSex"] = female ? (nutered ? "FS" : "F") 
           : (nutered ? "MN" : "M"); 
+0

Luôn có 'if (A && B) {} nếu khác (B) {} khác {} ' –

+0

@DavidStarkey Có 4 trạng thái kết quả có thể, bạn chỉ trả lại 3. –

+0

Sau đó, nếu (A && B) {} khác nếu (! A && B) {} nếu không (B) {} else {}' –

Trả lời

10
if (A) 
{ 
    return B ? "W" : "X"; 
} 
return B ? "Y" : "Z"; 

Hoặc thậm chí ngắn gọn hơn:

return A ? (B ? "W" : "X") 
     : (B ? "Y" : "Z"); 

Nếu bạn đi với điều kiện độc quyền unnested:

if (A && B) return "W"; 
if (A && !B) return "X"; 
return B ? "Y" : "Z"; 
+2

Thậm chí có thể thực hiện 'trả lại A không? (B? "W": "X"): (B? "Y": "Z") '. – SimpleVar

+0

@Yorye Điều đó mất một chút dễ đọc đối với tôi (cá nhân), và có thể làm quá sức. – doppelgreener

+2

Giải pháp "thậm chí còn kỳ quái hơn" là giải pháp tôi thích nhất. –

0

Bạn có bốn trạng thái có thể. Bản trình bày ngắn hơn (mặc dù không nhất thiết phải dễ bảo trì hơn) sẽ là

if (A && B) { 
    return "W"; 
} else if (A && !B) { 
    return "X"; 
} else if (!A && B) { 
    return "Y"; 
else return "Z"; 
3

Hợp lý, không. Bạn có 4 điều kiện riêng biệt cho hai biến.

Bạn có thể làm cho nhiều mã súc tích, mặc dù:

string Foo(bool A, bool B) 
{ 
    return A ? 
     B ? "W" : "X" 
     : 
     B ? "Y" : "Z"; 

} 

Hoặc nếu bạn đang cảm thấy đặc biệt ác, đặt nó trên cùng một dòng không có dấu ngoặc !:

return A?B?"W":"X":B?"Y":"Z"; 
+0

Tôi đang tìm kiếm sự phù hợp tốt hơn, tôi biết không có đơn giản hóa logic. –

+1

Hai thứ đó được gắn cho các tùy chọn xấu nhất mà tôi có thể nghĩ đến! Bạn có mặc dây sọc với áo khoác kẻ sọc của bạn không? 1 cho can đảm để đăng hai. –

+0

@PieterGeerkens công bằng, anh ấy là người đầu tiên đăng một giải pháp ba tầng, các món bít tết được đăng sau này của anh ấy dưới dạng bản chỉnh sửa. –

0

tôi chỉ cần ném điều này vào cho vui:

string Foo(bool A, bool B) 
    { 
     var labels = new[]{"W", "X", "Y", "Z"}; 
     return labels[(A ? 0 : 2) + (B ? 0 : 1)]; 
    } 
+0

Thông minh, Khi tôi đã cố gắng nghĩ ra những cách tốt hơn để làm điều đó, tôi đã thực sự nghĩ về một ý tưởng tương tự nhưng sử dụng một câu lệnh switch thay vì một mảng :). –