it-swarm.dev

İfadeler iç içe ise deyimleri

Bu, güzel kod . 'Dan bir bölümle ilgilidir. Bu bölümde iç içe ifs hakkında okudum.

Yazar, derinlemesine yuvalanmış if'ların böceklerin kaynağı olduğu ve daha az okunaklı olduğu hakkında konuştu. Ve yuvalanmış if'lerin case ifadeleri ve karar tabloları ile değiştirilmesi hakkında konuştu. 

Yuvalanmış ifs __case (select case) ve karar tabloları ile nasıl kaldırılabileceğini bilen var mı? 

27
Biswanath

Eh, özellikle switch/case ifadeleri hakkında soru sorduğunuz için doğrudan sorunuza bir cevap değil, ama benzer bir soru var.

Yerleşmeyi azaltmak için “if” ifadesini ters çevirin

Bu, geri dönüş değerine karar vermeden önce giderek daha fazla şeyi kontrol etmek yerine, erken dönen nöbetçi ifadeleriyle iç içe geçmiş olanları değiştirmekle ilgilidir.

Her zaman yapmaya çalıştığım bir örnek, eğer öyleyse ağır yuvalanmış yer değiştirmektir (aslında bu, çok kötü değil ama onları vahşi doğada 8 veya 9 seviyeye kadar gördüm):

if (i == 1) {
    // action 1
} else {
    if (i == 2) {
        // action 2
    } else {
        if (i == 3) {
            // action 3
        } else {
            // action 4
        }
    }
}

bununla:

switch (i) {
    case 1:
        // action 1
        break;
    case 2:
        // action 2
        break;
    case 3:
        // action 3
        break;
    default:
        // action 4
        break;
}

Ayrıca, switch ifadesini sıkıştırılmış halde tutmak için eylemleri olabildiğince küçük tutmaya çalışıyorum (bunun için işlev çağrıları en iyisidir) (bu yüzden, bunun sonunu görmek için dört sayfa ileri gitmeniz gerekmez).

Karar tablolarının, daha sonra hangi işlemlerin yapılması gerektiğini gösteren bayraklar oluşturduğuna inanıyorum. "Sonra açık" bölümü bu bayraklara dayalı eylemlerin basit bir şekilde sıralanmasıdır. Yanılıyor olabilirim (ilk ya da son kez olmayacak :-).

Bir örnek olacaktır (eylemleri çok basit olduğu için bayrak belirleme aşaması karmaşık olabilir):

switch (i) {
    case 1:
        outmsg = "no paper";
        genmsg = true;
        mailmsg = true;
        phonemsg = false;
        break;
    case 2:
        outmsg = "no ink";
        genmsg = true;
        mailmsg = true;
        phonemsg = false;
        break;
    default:
        outmsg = "unknown problem";
        genmsg = true;
        mailmsg = true;
        phonemsg = true;
        break;
}

if (genmsg)
    // Send message to screen.
if (mailmsg)
    // Send message to operators email address.
if (phonemsg)
    // Hassle operators mobile phone.
10
paxdiablo

Zincirli ifs?

Değiştirmek

if (condition1)
{
    do1
}   
else
{
    if (condition2)
    {
        do2
    }
    else (condition3)
    {
        do3;

    }
}

ile

if (condition1) {
   do1;
} else if (condition2) {
   do2;
} else if (condition3) {
   do3;
}

Bu, karmaşık koşullar için switch ifadesine çok benzer.

9
Arkadiy

Koşulu booleanlar haline getirin ve ardından her durum için boolean ifade yazın.

Eğer kod şuysa:

if (condition1)
{
    do1
}   
else
{
    if (condition2)
    {
        do2
    }
    else (condition3)
    {
        do3;

    }
}

Kişi şöyle yazabilir:

bool cond1=condition1;
bool cond2=condition2;
bool cond3=condition3;

if (cond1) {do1;}
if (!cond1 and cond2) {do2;}
if (!cond1 and cond3) {do2;}
6
khivi

Karar tabloları için lütfen bu soruya verilen cevaba bakın veya daha iyisi hala Kod Tamamlandı 2 'daki 18. bölümü okuyun.

3
Yuval F

Örneğin, doğrulama işleminin bir parçası başarısız olduğunda bir kez kırılabilir.

function validate(){
  if(b=="" || b==null){
      alert("Please enter your city");
      return false;
  }

  if(a=="" || a==null){
      alert("Please enter your address");
      return false;
  }
  return true;
}
2
Alexis Paques

Karar tabloları, koşullu mantığı kodun kendisinden ziyade bir veri yapısında saklarsınız.

Yani bunun yerine (@ Pax örneğini kullanarak):

if (i == 1) {
    // action 1
} else {
    if (i == 2) {
        // action 2
    } else {
        if (i == 3) {
            // action 3
        } else {
            // action 4
        }
    }
}

böyle bir şey yaparsın:

void action1()
{
    // action 1
}

void action2()
{
    // action 2
}

void action3()
{
    // action 3
}

void action4()
{
    // action 4
}

#define NUM_ACTIONS 4

// Create array of function pointers for each allowed value of i
void (*actions[NUM_ACTIONS])() = { NULL, action1, action2, action3 }

// And now in the body of a function somewhere...
if ((i < NUM_ACTIONS) && actions[i])
    actions[i]();
else
    action4();

i olasılıkları düşük numaralı tamsayılar değilse, i dizisinin actionsth öğesine doğrudan erişmek yerine bir arama tablosu oluşturabilirsiniz.

Bu teknik, düzinelerce olası değer üzerinde karar verdiğinizde iç içe ifs veya switch ifadelerinden çok daha kullanışlı hale gelir.

1
Paul Stephenson

Eğer ve anahtar ifadeleri tamamen OO değilse. Koşullu yordamsal mantıktırlar, ama çok iyi bir iş çıkarıyorlar! Bu ifadeleri daha fazla OO yaklaşımı için kaldırmak istiyorsanız, 'Durum' ve 'Tanımlayıcı' kalıplarını birleştirin .

0

Ayrıca Ziyaretçi kalıbı 'nı kullanmayı da düşünebilirsiniz.

0
Drejc

Mantıksal işleve eşdeğerse iç içe

if (condition1)
{
    if (function(2))
    {
        if (condition3)
        {
            // do something
        }
    }
}

Eşdeğer kod:

if (condition1 && function(2) && condition3)
{
    // do something
}

Her iki durumda da, bir ifade yanlış olarak değerlendirildiğinde, sonraki ifade değerlendirilmez. Örneğin, durum1 yanlış ise, () işlevi çağrılmaz ve koşul3 değerlendirilmez.

0
Demis Palma ツ