Câu hỏi Cách tốt nhất để định dạng câu lệnh nếu có nhiều điều kiện


Nếu bạn muốn một số mã để thực hiện dựa trên hai hoặc nhiều điều kiện đó là cách tốt nhất để định dạng rằng nếu tuyên bố?

ví dụ đầu tiên: -

if(ConditionOne && ConditionTwo && ConditionThree)
{
   Code to execute
}

Ví dụ thứ hai: -

if(ConditionOne)
{
   if(ConditionTwo )
   {
     if(ConditionThree)
     {
       Code to execute
     }
   }
}

đó là dễ hiểu nhất và đọc mang nhớ rằng mỗi điều kiện có thể là một tên chức năng dài hoặc một cái gì đó.


76
2017-10-31 10:15


gốc




Các câu trả lời:


Tôi thích Tùy chọn A

bool a, b, c;

if( a && b && c )
{
   //This is neat & readable
}

Nếu bạn có các điều kiện biến / phương pháp đặc biệt dài, bạn chỉ có thể ngắt dòng chúng

if( VeryLongConditionMethod(a) &&
    VeryLongConditionMethod(b) &&
    VeryLongConditionMethod(c))
{
   //This is still readable
}

Nếu chúng phức tạp hơn, thì tôi sẽ xem xét thực hiện các phương thức điều kiện riêng biệt bên ngoài câu lệnh if

bool aa = FirstVeryLongConditionMethod(a) && SecondVeryLongConditionMethod(a);
bool bb = FirstVeryLongConditionMethod(b) && SecondVeryLongConditionMethod(b);
bool cc = FirstVeryLongConditionMethod(c) && SecondVeryLongConditionMethod(c);

if( aa && bb && cc)
{
   //This is again neat & readable
   //although you probably need to sanity check your method names ;)
}

IMHO Lý do duy nhất cho tùy chọn 'B' sẽ là nếu bạn có riêng biệt else các hàm để chạy cho từng điều kiện.

ví dụ.

if( a )
{
    if( b )
    {
    }
    else
    {
        //Do Something Else B
    }
}
else
{
   //Do Something Else A
}

112
2017-10-31 10:20



Tôi thích nó. Mặc dù tôi không phải là một fan hâm mộ lớn của ý tưởng phương pháp, trừ khi các phương thức đã tồn tại và trả về một giá trị boolean. - Thomas Owens
+1 cho tên phương thức kiểm tra độ chính xác - Aidan Miles
Bạn không đánh giá mọi thứ mà không có lý do trong ví dụ thứ hai? - Odys


Các câu trả lời khác giải thích tại sao tùy chọn đầu tiên thường là tốt nhất. Nhưng nếu bạn có nhiều điều kiện, hãy xem xét việc tạo một hàm riêng (hoặc thuộc tính) làm điều kiện kiểm tra trong tùy chọn 1. Điều này làm cho mã dễ đọc hơn, ít nhất là khi bạn sử dụng các tên phương thức tốt.

if(MyChecksAreOk()) { Code to execute }

...

private bool MyChecksAreOk()
{ 
    return ConditionOne && ConditionTwo && ConditionThree;
}

Các điều kiện chỉ dựa vào các biến phạm vi cục bộ, bạn có thể làm cho hàm mới tĩnh và truyền vào mọi thứ bạn cần. Nếu có một sự pha trộn, vượt qua trong các công cụ địa phương.


27
2017-10-31 10:20



Tôi thấy điều này là hiệu quả nhất và dễ dàng hơn để thêm các điều kiện sau này - pbojinov
1 đề xuất tuyệt vời! - R Thiede
1 lúc đầu tôi nhướn mày nhưng đây thực sự là câu trả lời hay nhất. có boolean đó isOkToDoWhatever như một tài sản làm cho rất nhiều ý nghĩa. - grinch
chức năng là tốt cho trừu tượng của logic, sử dụng chúng! - loujaybee
Nhưng điều này chỉ di chuyển cùng một điều kiện phức tạp ở nơi khác nó cũng cần phải đọc được vì vậy chúng tôi trở lại hình vuông với cái này. Nó không chỉ là về iftuyên bố dễ đọc nhưng thay vì khả năng đọc điều kiện. - Robert Koritnik


Ví dụ đầu tiên là dễ đọc hơn.

Trên thực tế, theo ý kiến ​​của tôi bạn chỉ nên sử dụng thứ hai bất cứ khi nào bạn phải thêm một số "logic khác", nhưng đối với một điều kiện đơn giản, sử dụng hương vị đầu tiên. Nếu bạn lo lắng về điều kiện lâu dài, bạn luôn có thể sử dụng cú pháp tiếp theo:

if(ConditionOneThatIsTooLongAndProbablyWillUseAlmostOneLine
                 && ConditionTwoThatIsLongAsWell
                 && ConditionThreeThatAlsoIsLong) { 
     //Code to execute 
}

Chúc may mắn!


9
2017-10-31 10:23





Câu hỏi đã được hỏi và cho đến nay, đã được trả lời như thể quyết định nên được thực hiện hoàn toàn trên cơ sở "cú pháp".

Tôi sẽ nói rằng câu trả lời đúng về cách bạn đặt ra một số điều kiện trong một trường hợp, nên cũng phụ thuộc vào "ngữ nghĩa". Vì vậy, điều kiện nên được chia nhỏ và nhóm theo những gì mọi thứ đi cùng nhau "khái niệm".

Nếu hai thử nghiệm thực sự là hai mặt của cùng một đồng tiền ví dụ. nếu (x> 0) && (x <= 100) thì đặt chúng lại với nhau trên cùng một dòng. Nếu một điều kiện khác là khái niệm xa xa hơn ví dụ. user.hasPermission (Admin ()) sau đó đặt nó trên dòng riêng của nó

Ví dụ.

if user.hasPermission(Admin()) {
   if (x >= 0) && (x < 100) {
      // do something
   }
}

7
2017-10-31 11:07





Thứ hai là một ví dụ điển hình của Mũi tên chống mẫu Vì vậy, tôi muốn tránh nó ...

Nếu điều kiện của bạn quá dài hãy giải nén chúng thành các phương thức / thuộc tính.


4
2017-10-31 10:46





Việc đầu tiên là dễ dàng hơn, bởi vì, nếu bạn đọc nó trái sang phải bạn nhận được: "Nếu một cái gì đó VÀ cái gì đó VÀ cái gì đó THEN", đó là một câu dễ hiểu. Ví dụ thứ hai có nội dung "Nếu có điều gì đó THEN nếu có điều gì đó THEN nếu có điều gì khác", đó là vụng về.

Ngoài ra, hãy cân nhắc xem bạn có muốn sử dụng một số OR trong mệnh đề của mình không - bạn sẽ làm điều đó theo kiểu thứ hai như thế nào?


3
2017-10-31 10:16





    if (   ( single conditional expression A )
        && ( single conditional expression B )
        && ( single conditional expression C )
       )
    {
       opAllABC();
    }
    else
    {
       opNoneABC();
    }

Formatting a multiple conditional expressions in an if-else statement this way:
1) allows for enhanced readability:
    a) all binary logical operations {&&, ||} in the expression shown
       first
    b) both conditional operands of each binary operation are obvious
       because they align vertically
    c) nested logical expressions operations are made obvious using
       indentation, just like nesting statements inside clause
2) requires explicit parenthesis (not rely on operator precedence rules)
    a) this avoids a common static analysis errors
3) allows for easier debugging
    a) disable individual single conditional tests with just a //
    b) set a break point just before or after any individual test
    c) e.g. ...

    // disable any single conditional test with just a pre-pended '//'
    // set a break point before any individual test
    // syntax '(1 &&' and '(0 ||' usually never creates any real code
    if (   1
        && ( single conditional expression A )
        && ( single conditional expression B )
        && (   0
            || ( single conditional expression C )
            || ( single conditional expression D )
           )
       )
    {
       ... ;
    }

    else
    {
       ... ;
    }

3
2018-04-19 22:01





tôi tin switch...case tuyên bố là cách tốt nhất để viết mã gọn gàng trong trường hợp này, nếu ngôn ngữ lập trình hỗ trợ nó.

switch (//variable or Boolean) {
  case //Condition A:
  case //Condition B:
  case //Condition C:
    //Code to execute;
}

2
2017-12-03 07:38



Nó có thể là tốt đẹp nhưng nó loại bỏ "lợi thế" của "ngắn mạch" / đánh giá lười biếng. - TheLibrarianCz


Trong Perl bạn có thể làm điều này:

{
  ( VeryLongCondition_1 ) or last;
  ( VeryLongCondition_2 ) or last;
  ( VeryLongCondition_3 ) or last;
  ( VeryLongCondition_4 ) or last;
  ( VeryLongCondition_5 ) or last;
  ( VeryLongCondition_6 ) or last;

  # Guarded code goes here
}

Nếu bất kỳ điều kiện nào không thành công, nó sẽ tiếp tục, sau khối. Nếu bạn định nghĩa bất kỳ biến nào mà bạn muốn giữ lại sau khối, bạn sẽ cần xác định chúng trước khối.


0
2017-10-31 23:14



Điều đó có vẻ Perlish - trong "nó làm gì?" cảm giác;) Nhưng nó thực sự dễ đọc, một khi bạn quen với nó. - Piskvor