В реалния живот ние вземаме хиляди решения на ден. Някои са прости решения като какво да ядете, какво да облечете и т.н.; някои са сложни и могат драстично да променят живота ни. Зад всяко решение винаги има опции, ние изчисляваме въздействието на всяка възможност и избираме най-подходящата за нас. Същото може да се постигне в програмирането с контролни оператори.

Контролният израз решава кой от групата изрази да бъде избран според логическия тест.

Видове контролни отчети

  • Изявление if/else
  • Изявление за превключване

Ако / Друго

Позволява на вашата програма да изпълнява различни набори от изрази, ако изразът е верен или не.

If

Изпълнява изразите, когато изразът е верен.

let x = 2
if(x > 0) {
    // Execute when statement is true
    console.log(`${x} is positive number`)
}

Друго

Изпълнява оператора, когато изразът е false. С него се пише.

let x = 2
if(x > 0) {
    // Execute when statement is true
    console.log(`${x} is positive number`);
} else {
  // Execute when statement is false
  console.log(`${x} is negative number`);
}

If / Else стълба

Когато има повече от една опция, можем да използваме стълбата if / else, като използваме else if.

if (Condition 1) {
    // Execute when condition 1 is true
} else if (Condition 2) {
  // Execute when condition 2 is true
} else if (Condition 3) {
  // Execute when condition 3 is true
}
.
. condition up to n
.
 else {
  // Execute when none of the statements are true
}

Вложени If / Else

If / else може да съдържа друг if / else. Това явление се нарича влагане if / else. Полезно е да се вземат сложни решения.

const a = 10
if(a % 2 === 0) {
    console.log(`${a} is even number`);
    if(a % 3 === 0) {
        console.log(`${a} is even number and is divisible by 3`);
    } else {
        console.log(`${a} is even number and is not divisible by 3`);
    }
} else {
    console.log(`${a} is odd number`);
}

Изявление за превключване

Инструкция за избор на множество разклонения, която последователно тества стойността на израза. В Switch стойността на оператора, т.е. случаите, се сравняват с числото или низа. Случаят по подразбиране се изпълнява, когато нито един от случаите не съвпада. Ключовата дума break се използва за излизане от случай на превключване, освен ако не искате да изпълните всички останали случаи.

let a = "Messi"
switch (a) {
   case "Ronaldo":
       console.log("a is Ronaldo");
       break;
   case "Mbappe":
       console.log("a is Mbappe");
       break;
   case "Messi":
       console.log("a is Messi");
       break;
   case "Zlatan":
       console.log("Zlatan is Zlatan");
       break;
   default:
       console.log("a is not in the list")
  }

Изявление за превключване на случай може да се използва вместо стълба if / else.

Оптимизиране и преработване на контролни изрази

Понякога контролните твърдения могат да излязат извън контрол и да доведат до голяма купчина бъркотия, която никой не разбира. Можем да използваме някои техники за оптимизация, за да го направим по-добър. Под оптимизиране имам предвид да го направя четим и да намаля изчисленията му. Някои от често срещаните техники са:

  • Ранно завръщане
  • Опростяващо състояние
  • Използване на логическа операция вместо контролен оператор
  • Използване на троичен оператор
  • Използване на справочна таблица и др.

Вложеното състояние е основният виновник за това, че условието е извън контрол.

Ранно завръщане

Можем да върнем оператора, когато условието е изпълнено, вместо да изпълняваме следващите оператори.

function isUserAdmin(user) {
    if(user.role_id === 1) {
        //Executes when role_id is 1
        return true
    } 
    // Executes when role_id does not equals to 1
    return false
}

Можем да приложим предпазна клауза, за да подобрим допълнително. Guard Clause проверява дали си струва да бъде обработено по-нататък, ако не, връща незабавно със съобщение за грешка.

function isEligibleToVote(age, isRegistered) {
   if(age < 18) {
        return "You are not eligible to vote"   
   }
   if(!isRegistered) {
        return "You are not eligible to vote"         
   }
   return "You are eligible to vote" 
}

Опростяване на условията

Вместо условия за влагане, можем просто да опростим условията.

if(Condition A) {
    if(Condition B) {
        // executes when A and B are true  
    }
}

може да се напише като

if(Condition A && Condition B) {
    // executes when A and B are true
}

Използване на логически операции

Логически оператори като && могат да се използват вместо условни операции.

&& израз: Връща true, когато и a, и b са верни, тук a и b са изрази. Това също означава, че когато a е невярно, не е необходимо да изчисляваме b. Следователно b се изчислява само когато a е вярно.

a > 2 && console.log('a is greater than 2')

вместо

if(a > 2) {
    console.log('a is greater than 2')
}

Използване на троичен оператор

Синтаксисът за троичния оператор е: условие ? вярно : невярно

Може да се използва за опростяване на условието if else.

if (a > b) {
    console.log("a is greater than b")
} else {
    console.log("b is greater than a")
}

може да се напише като

a > b ? console.log("a is greater than b") : console.log("b is greater than a")

Използване на справочна таблица

Можем да използваме хеш таблица (таблица за търсене) вместо условия.

const player = {
    1: "Ronaldo",
    2: "Mbappe",
    3: "Messi",
    4: "Zlatan"
}
// Print Messi
console.log(player(3))

Справочната таблица обикновено се използва за замяна на корпуса на превключвателя. И двете имат плюсове и минуси. Калъфът за превключване е по-лесен за поддръжка, четим и по-бърз, когато има само няколко кейса, но таблицата за справка ще бъде много по-лесна за поддръжка, когато има много кейси. По отношение на производителността няма голяма разлика. Според measurethat.net switch case е малко по-бърз, но и двата са O(1). Така че е по-добре да изберете поддръжка и четливост.

Заключение

Условните изрази могат да бъдат написани по различни начини, но ключът е да изберете най-оптималния за себе си.