If/else ...if/else vs. switch case
Дайте pros and cons за използването на последователни if/else и switch case структури. Performance? Best practices?
Дайте pros and cons за използването на последователни if/else и switch case структури. Performance? Best practices?
If/else е за булеви стойности а switch е за точни. При точните стойности може би switch-а е по бърз макар, че не съм напълно сигурен но поне се чете по лесно и е по подредено. От домашната за Conditional Statements Play Cards май се казваше задачата (където трябва да въведеш нещо в конзолата и ти казва дали е валидна карта или не) е чист пример за switch -> въвеждаш нещо и ти минава набързо през switch-а и ти дава резултата вместо да минава през 15 проверки :) Дано си ме разбрала, понякога обясненията ми куцат малко >_>
По-бързо или бавно, може би никога в кариерата ви на програмисти, няма да ви се наложи да стигнете/м до момент, в който да се налага да рефакторираме код от иф на суитч или обратно, заради перформънс. Зарадив сичко друго, но не и заради перформънс.
switch/case се ползва за точни стойности и то за по-големи блокове. За 2 сравнения не е нужно да се ползва. Честно казано дори от към четимост, if е по-четим в случаи като:
if (myVar == "my string")
{
return x;
}
return y;
А и се е наложило повече като практика, програмистите са свикнали подобни сравнения да ги четат в иф блокове, и ако се налага да четат ваш код, в който връщате стойност от метод на база някакъв стринг/обджект или нещо дори различно от булева стойност (то и myVar == "string" си е булева, де) ще го прочетат с много по-голяма лекота без да се замислят, докато като видят суитч, може би ще тръгнат по-обстойно да го четат.
Винаги взимайте това предвид, че някакви практики са се наложили в програмирането и ползвайки ги, правите четимостта доста по-лека, т.е. не карате наистина човек да чете кода ви ред по ред, дори само като види отместването на return един път на дясно и един път в началото на реда, ще се сети че е заради условия.
Също така за сравнение на повече от една стойност или променлива, става доста по-трудно и нечетимо ползването на суитч, тогава също се ползва ИФ.
if (myVar == "string")
{
return x;
}
elseif (yourVar == 1 || hisVar == "string")
{
return y;
}
elseif (herVarObject is ObjectOfSomeType)
{
return z;
}
return a;
Тук дори аз не се сещам как това би станало switch и въобще четимо ли би било. Също така ако не беше return (а например се правеше нещо друго, примерно принт в конзолата) се аплайва precedence на if/elseif оператора. Ако бяха само if-ове (без elseif) щеше да се изпълнят всичките, ако всичките бяха верни. Защото, може да се съгласите, че едновременно myVar = "string", yourVar = 1, hisVar = "string", herVar = new ObjectOfSomeType(); но в случая, в момента в който намери някое от тях за вярно, ще прекрати if/elseif/else блока.
Към това което е казал колегата бих искал да добавя още 2 неща от моя кратък опит с тези условни оператори - switch case е несравнимо по - лесно четим и по-подреден като структура - решавах преди 2 -3 дни една от задачите за изпит на Telerik академията и ми се наложи да използвам няколко пъти структура от 3 или 4 if стейтмънта вложени един в друг, а те от своя страна бяха вложени в 2 while цикъла. Отне ми много повече време да се кьоря кой стетмънт къде започва, къде свършва, дали съм го поставил така, че да обхваща всички случаи, които ми трябват, отколкото да си структурирам решение на задачата. Когато 2 дни по - късно прочетох за switch case и реших да преправя задачата с него - направо се плеснах по челото - всичко вървеше ясно и подредено.
Относно бързината - чисто интуитивно, според мен би трябвало switch case трябва да е по - бърз - все пак if statement-а трябва първо да иницилизира променливите, които участват в булевия израз, след което да ги сметне, докато switch-а чете направо променливата.
http://www.dotnetperls.com/if-switch-performance
Прегледайте всичките benchmarks. Има случаи в които едното и другото могат да бъдат по-бързи. Но реално става въпрос за такава минимална разлика, че ако това е единствената ни причина да го ползваме, значи нямаме никакви други проблеми :)
По принцип е много относително, защото лично за мене switch case е малко ограничаващ в диапозана на ползване, поне за момента конкретните задачи, които решаваме (може и да греша). Другото, което е важно да се знае е , че те са наистина доста сходни но и двете конструкции си имат сецифичните си особености, а именно:
Switch case construction
- както си споменала по - горе, switch-case е значително по - четим в сравнение с if -else конструкциите.
- в повечето езици за програмиране switch-case позволява единствено примитивни данни като ключ и константи като случаи (cases)
-при по - дълъг код според мен е нерентабилно да използваш тази конструкция пред това да вмъкнеш някой друг if or else + един два цикъла :)
If - else construction
-и тук идва моментът, че самата конструкция позволява използването на много по усложнени изрази в условието си , докато switch - case изисква константа
- можеш да използваш всички видове променливи за създаването на условие
Но пък другия момент за, който се сещам е, че ако увеличим броя на условията, които искаме нашата програма да провери, switch - case (до колкото знам ) е по- добрия вариант от друга страна поради по - бързото си действие ( поради използването на index mapping of variables...потърси в нета за повече инфо)
Надявам се, че помогнах. Отговора ми не изчерпва твоя въпрос, така че ако има някой да допълва ( или да ме поправя ако греша) Успех :)
Ами аз имам едно парче код, верно не е на C#, но е идентично. В него се реализира Фактори патърна. Имам около 30 класа/обекта, които имат пропърти подобно на ID. На факторито се подават няколко параметъра + това ид. Кодът изглежда нещо от сорта на:
switch (id)
{
case MyClass1.id:
return new MyClass1(param1, param2, param3);
case MyClass2.id:
return new MyClass2(param1, param2, param3);
}
И така до последния 30ти обект. Смятам, че с иф-ове е по-нечетимо. А и няма, т.е. има, но е хаки, как това да се случи с цикъл. Така, че тук наистина единствения вариант, който смятам за най-добър е switch. И въобще не опира до performance. :)
Здравей!
Ето моето виждане по въпроса:
SWITCH:
pros:
Подреден и лесно четим код!
Бързодействие при сравняване на константи!
... еми май само за тези се сещам :)
cons:
За case може да се използват само константи.
Не толкова голяма популярност и приемане в нашите среди. Всички са свикнали да четат If и го предпочитат.
Не толкова гъвкав - Не може да правим каквото си поискаме. Не можем да правим: Вложени сложни условни конструкции, ползване на всеки един тип който има база за сравнение и т.н.
IF:
pros:
За case може да се използват всеки тип който има база за сравнение.
Всички са свикнали с него и го предпочитат. За добро или лошо :)
Много гъвкав - може да правим каквото си поискаме. Можем да правим: Вложени много сложни условни конструкции.
cons:
По-лошо четим и подреден код!
По бавен при сравняване на константи!
Знам че мнението ми повтаря някои от на колегите дали отговор по темата но това само увеличава прецизността на отговора ;).
HINTS(Няколко съвета за бързодействие):
Винаги и при двата метода (IF или SWITCH) слагайте случаите които очаквате да са истина в повечето случаи най-отгоре(отпред) за да елиминирате следващите проверки.
При IF когато е възможно ползвайте следното структуриране:
if
else if
else if
else if
else
пред структурирането:
if
if
if
if
if
Първото структуриране е един вид "имитация" на switcha и избягва излишните проверки.
Благодаря на всички за отговорите :)
Главният ми проблем е, че голяма част от нещата ги знам на теория, но когато опре да ги приложа в решението на задача... Започвам да се чудя как точно да подходя.
Предполагам, че това ще се подобри с практиката. А и така обяснения с примери е доста по-ясно :)
Aз имам един прогблем. До преди 2-3 дни си отварях домашните със wordpad смисъл самите задачи, а сега като го изтегля и ми излизат някви като йероглифи помагайте !
Напълно съгласна съм, че switch case е по-четлив.
Наясно съм, че за булевите изрази се ползва if/else :)
По скоро може би ми е интересен случаят, в който имаме готов код, който разглежда два случая, които се описани с if/else/if и се появява необходимост от трети/четвърти... случай. В кой момент кода вече има нужда от refactoring и дали има някакви други съображения (performance, best practices, patterns, clean coding rules, etc) освен четливостта за switch