Pertanyaan Cara terbaik untuk memformat pernyataan jika dengan beberapa kondisi


Jika Anda ingin beberapa kode dieksekusi berdasarkan dua atau lebih kondisi yang merupakan cara terbaik untuk memformat pernyataan if itu?

contoh pertama: -

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

Contoh kedua: -

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

yang paling mudah dipahami dan dibaca mengingat bahwa setiap kondisi mungkin merupakan nama fungsi panjang atau sesuatu.


75
2017-10-31 10:15


asal


Jawaban:


Saya lebih suka Opsi A

bool a, b, c;

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

Jika Anda memiliki kondisi variabel / metode yang sangat panjang, Anda dapat melanggarnya

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

Jika mereka lebih rumit, maka saya akan mempertimbangkan untuk melakukan metode kondisi secara terpisah di luar pernyataan 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 Satu-satunya alasan untuk opsi 'B' adalah jika Anda memiliki terpisah else berfungsi untuk berjalan untuk setiap kondisi.

misalnya

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

112
2017-10-31 10:20



Jawaban lain menjelaskan mengapa opsi pertama biasanya yang terbaik. Tetapi jika Anda memiliki beberapa kondisi, pertimbangkan untuk membuat fungsi terpisah (atau properti) dengan memeriksa kondisi dalam opsi 1. Ini membuat kode lebih mudah dibaca, setidaknya ketika Anda menggunakan nama metode yang baik.

if(MyChecksAreOk()) { Code to execute }

...

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

Itu kondisi hanya bergantung pada variabel lingkup lokal, Anda bisa membuat fungsi baru statis dan lulus dalam semua yang Anda butuhkan. Jika ada campuran, berikan barang-barang lokal.


27
2017-10-31 10:20



Contoh pertama lebih "mudah dibaca".

Sebenarnya, menurut saya, Anda sebaiknya hanya menggunakan yang kedua setiap kali Anda harus menambahkan beberapa "logika lain", tetapi untuk Kondisional sederhana, gunakan citarasa pertama. Jika Anda khawatir tentang lama dari kondisi Anda selalu dapat menggunakan sintaks berikutnya:

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

Semoga berhasil!


9
2017-10-31 10:23



Pertanyaan itu diajukan dan sejauh ini telah dijawab seolah-olah keputusan harus dibuat murni atas dasar "sintaksis".

Saya akan mengatakan bahwa jawaban yang benar tentang bagaimana Anda menyusun sejumlah kondisi dalam sebuah if, seharusnya untuk bergantung pada "semantik" juga. Jadi kondisi harus dipecah dan dikelompokkan sesuai dengan hal-hal yang berjalan bersama "secara konseptual".

Jika dua tes benar-benar dua sisi dari mata uang yang sama mis. jika (x> 0) && (x <= 100) kemudian satukan bersama pada baris yang sama. Jika kondisi lain secara konseptual jauh lebih jauh misalnya. user.hasPermission (Admin ()) lalu menaruhnya di barisnya sendiri

Misalnya.

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

7
2017-10-31 11:07



Yang kedua adalah contoh klasik dari Panah Anti-pola Jadi saya akan menghindarinya ...

Jika kondisi Anda terlalu lama ekstrak mereka ke dalam metode / properti.


4
2017-10-31 10:46



Yang pertama lebih mudah, karena, jika Anda membacanya dari kiri ke kanan, Anda mendapatkan: "Jika sesuatu DAN somethingelse AND somethingelse THEN", yang mudah dimengerti kalimatnya. Contoh kedua berbunyi "Jika ada sesuatu KEMUDIAN, jika sesuatu SEPENUHNYA jika sesuatu yang lain KEMUDIAN", yang kikuk.

Juga, pertimbangkan jika Anda ingin menggunakan beberapa OR dalam klausa Anda - bagaimana Anda akan melakukannya dengan gaya kedua?


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



aku percaya switch...case Pernyataan adalah cara terbaik untuk menulis kode rapi dalam keadaan ini, jika bahasa pemrograman mendukungnya.

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

2
2017-12-03 07:38



Di Perl Anda bisa melakukan ini:

{
  ( 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
}

Jika salah satu kondisi gagal itu akan terus berlanjut, setelah blok. Jika Anda mendefinisikan variabel apa pun yang ingin Anda simpan setelah blok, Anda harus menentukannya sebelum blok.


0
2017-10-31 23:14