if else կոնստրուկցիան (շատ հաճախ անվանում են նաև ճյուղավորման կամ պայմանի օպերատոր) գործնականում մեծամասամբ շատ հեշտ կարելի է փոխարինել switch case կոնստրուկցիայով: Ո՞ր դեպքերում է այդ փոփոխությունն արդարացված և կա՞ արդյոք արտադրողականության տարբերություն այդ երկու հիմնական ճյուղավորման կոնստրուկցիաների միջև:
Կոդինգի ժամանակ ծրագրավորողը շատ հաճախ է կանգնում երկընտրանքի առաջ՝ պայման արտահայտող որ՞ կոնստրուկցիան օգտագործել, որպեսզի կոդը հնարավորինս ընթեռնելի լինի, իսկ հավանական սխալների ուղղումը՝ հեշտ։ Իհարկե երկընտրանք բառը կարող է տեղին չհամարվել, քանի-որ բացի if else և switch case կոնստրուկցիաներից, կան նաև այլ լուծումներ՝ լինի դա թերնարի օպերատորը, թե օրինակ օբյեկտների օգտագործումը՝ պայմանի համապատասխանությունն արագ և հեշտ ստուգելու համար (վերջին տարբերակի մասին կարդացեք Enmanuel Durán-ի հոդվածը) ։
Ընդհանրապես ընդունված է համարել, որ էստեթիկ առումով if else կոնստրուկցիան ավելի գեղեցիկ և հեշտ ընթեռնելի է, քան switch case-ը։ Սա իհարկե սուբյեկտիվ կարծիք է, և կլինեն ծրագրավորողներ, ովքեր կպնդեն հակառակը։ Սակայն անվիճելի է, որ switch case կոնստրուկցիան ավելի շատ տողեր է զբաղեցնում և նաև նրա սինթաքսն ուսանողներին համեմատաբար ավելի խճճված է թվում։
if (found) {
// do something
} else {
// do something else
}
switch (found) {
case true:
// do something
break;
default:
// do something else
}
Վերևի կոդի երկու կտորներն էլ կատարում են բացարձակապես նույն բանը, սակայն if else կոնստրուկցիայի օգտագործմամբ կտորն ավելի կարճ է, հեշտ և ընթեռնելի։ Սակայն երբ ստուգման ենթակա պայմանների քանակը ավելանում է, սովորաբար ավելի նախընտրելի է դառնում switch case կոնստրուկցիայի օգտագործումը։
let seasonIndex = new Date().getMonth();
let season;
if (seasonIndex === 0 || seasonIndex === 1 || seasonIndex === 11) {
season = "Winter";
} else if (seasonIndex === 2 || seasonIndex === 3 || seasonIndex === 4) {
season = "Spring";
} else if (seasonIndex === 5 || seasonIndex === 6 || seasonIndex === 7) {
season = "Summer";
} else if (seasonIndex === 8 || seasonIndex === 9 || seasonIndex === 10) {
season = "Autumn";
}
Տարվա եղանակը գտնելու համար if-else-ի միջոցով գրված կոդում ստիպված ենք լինում բազմաթիվ անգամներ օգտագործել տրամաբանական (Բուլյան) || (OR) օպերատորը։ Կոդը հորիզոնական հարթության վրա ծավալվում է՝ դժվարացնելով ընթեռնելիությունն ու բարդացնելով հնարավոր սխալների ուղղումը։ Այժմ նույն առաջադրանքը փորձենք կատարել switch case կոնստրուկցիայի օգնությամբ։
let seasonIndex = new Date().getMonth();
let season;
switch (seasonIndex) {
case 0:
case 1:
case 11:
season = "Winter";
break;
case 2:
case 3:
case 4:
season = "Spring";
break;
case 5:
case 6:
case 7:
season = "Summer";
break;
case 8:
case 9:
case 10:
season = "Autumn";
break;
}
Տարբերությունն ակնհայտ է։ Կոդը չի ծավալվում հորիզոնական հարթության վրա՝ դժվարացնելով ընթեռնելիությունը, բաղկացած է կարճ արտահայտություններից, և անգամ թռուցիկ հայացքը բավարար է ըմբռնելու թե ինչպես է այն աշխատում։ Արտադրողականության առումով՝ դեպքերի ճնշող մեծամասնությունում switch case կոնստրուկցիան ավելի արագ է աշխատում, քան if-else-ը։ Այդ արտադրողականության տարբերությունը հատկապես զգալի է դառնում մեծ քանակությամբ պայմանների ստուգման պարագայում։ Եթե ստուգվող պայմանները երկուսը կամ երեքն են՝ այդ տարբերությունն աննշան է, և արտադրողականության տեսանկյունից չի կարող զգալի դեր խաղալ, հետևաբար այս դեպքում պետք է հաշվի առնել միայն էստեթիկ բաղադրիչը։ Մեծ քանակությամբ պայմանների առկայության դեպքում ցանկալի է օգտագործել switch case, արդյունքում կունենանք ավելի բարձր արտադրողականություն և հավանաբար նաև ավելի ընթեռնելի կոդ: