Версия, подходяща за принтиране
Кликни тук, за да видиш темата в оригиналният и вид
BG Development Форуми > PHP/Perl/Python/ASP > Има ли смисъл от switch и къде има потребност?


Публикувано от: Gluhiqdev 13-04-2019, 12:36
Здравейте,

отскоро изучавам усилено PHP и стигнах до оператора switch(); но не виждам къде бих могъл да го употребявам? Има ли смисъл да се задълбочавам в този оператор или просто да го пропусна.

Задавам този въпрос защото реално същият резултат мога да го постигна и с if, elseif.

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

Публикувано от: ROSката 13-04-2019, 14:53
има смисъл от него в определени ситуации. просто не е толкова удобен , според мен! хубаво е да решиш няколко задачи и да го знаеш icon_smile.gif.

Публикувано от: CPPlus 13-04-2019, 19:47
I am definitely a fan of it due to its readability - every time when there are more than two cases and especially if there is a block that is to be executed in response to more than one case: switch is the way to go for me.
PS: No cyrillic at work, bear with it icon_lol.gif

Публикувано от: Gluhiqdev 13-04-2019, 22:40
@ROSката благодаря ти за адекватният отговор! Днес цял ден изучавах възможностите на switch() и има доста полезни приложения примерно в анкети и т.н. Кода изглежда по-подреден и по-чист но за добро или лошо не винаги ще се налага да го използвам.

@CPPlus thanks for your support! I living in Bulgaria and here official language is Bulgarian.


Публикувано от: PxL 13-04-2019, 23:07
Смисъла да го ползваш е, да те приемат сериозно като "програмист" и да дадеш възможност на оптимизатора да оптимизира спагетите ти.

Публикувано от: gat3way 14-04-2019, 00:11
Това дали ще ги оптимизира по-добре със switch-а е малко спорна работа, дори вероятно ако целта е това и особено ако не е някакъв тривиален случай, по-скоро бих го разписал с if-ове напук на всичко което обясняват по този повод. switch-овете са по-прегледни за четене от хора и това като цяло им е основният плюс. Всъщност сещам се само за едно изключение, вече не помня в детайли какво точно беше, но се свеждаше до нещо от сорта на това да се търси множество от сходни кратки подстрингове в стринг, с тази разлика че стринга в паметта е разположен в chunk-ове с фиксирана дължина и незадължително разположени последователно в паметта, та подниза можеше да се окаже част от него в един chunk, част от него в друг, това беше и относително performance-critical. Та колегата (голям пич апропо) беше врътнал някаква странна и извратена схема със switch-ове само и само за да спести една проверка и нещо в повече и беше някакъв гениален замисъл, никога нямаше да ми хрумне. Познай дали това отиде в production обаче, всички дето го гледаха го гледаха с погнуса и имаше "абе това е много хубаво ама...".

Публикувано от: PxL 14-04-2019, 07:59
Освен, че е по-четимо в повечето случаи ще се усети и ще ти ги направи с lookup таблица, при if-а не смятам, че изобщо ще го отчете като вариант това.

Публикувано от: thrawn 14-04-2019, 08:08
CODE
var today = switch(day) {
   case SAT, SUN -> "Weekend day";
   case MON, TUS, WED, THU, FRI -> "Working day";
   default -> throw new IllegalArgumentException("Invalid day: " + day.name());
};


Java

Публикувано от: gat3way 14-04-2019, 10:16
При if-а почти сигурно няма да го докара до lookup таблица. При switch-а напротив на общоприетото има доста голяма вероятност също да не го направи, поради много причини - първата (очевидната) е ако проверяваш срещу стойности, които не са последователни, ами "пръснати" достатъчно добре, то става разхищение да се имплементира с таблица и в крайна сметка пак ще го сведе до проверки и бранчване. Втората е по-малко очевидна и тя е свързана със спекулативното изпълнение и branch prediction-а в днешно време - процесорът ако види нещо от сорта на cmp...je ще му се задействат черните магии, докато ако види нещо от сорта на mov...jmp вече е съмнително.

Публикувано от: SuN 14-04-2019, 10:37
QUOTE (PxL @ 14-04-2019, 07:59)
Освен, че е по-четимо в повечето случаи ще се усети и ще ти ги направи с lookup таблица, при if-а не смятам, че изобщо ще го отчете като вариант това.

За пхп ли говорите още? Много частен случай са оптимизациите. Гледал съм асемблера на програма написана не по-стандарта на езика и компилатора беше изгенерирал един иф по-малко (разредени бяха стойностите, така че не се ползваше таблица) като прескачаше една стойност и програмата зацикляше.

Ако се бяха ползвали ифове нямаше компилатора да омаже асемблера. icon_smile.gif

Публикувано от: Gamma Goblin 14-04-2019, 12:18
https://www.codeproject.com/Articles/100473/Something-You-May-Not-Know-About-the-Switch-Statem

Публикувано от: PxL 14-04-2019, 15:59
QUOTE (CPPlus @ 13-04-2019, 20:47)
I am definitely a fan of it due to its readability - every time when there are more than two cases and especially if there is a block that is to be executed in response to more than one case: switch is the way to go for me.
PS: No cyrillic at work, bear with it icon_lol.gif

Тоа па. Я се изправи малко бе, голям хакер, а си се огънал като некъв крив ... =)

Публикувано от: AK-85 14-04-2019, 20:38
QUOTE (gat3way @ 14-04-2019, 09:16)
... докато ако види нещо от сорта на mov...jmp вече е съмнително.

Не съм сигурен дали те разбирам правилно, но вторият вариант на "Spectre" съществува, точно защото черните магии се задействат за индиректни "скокчета". Общо-взето можеш да си убеден, че ако процесорът види branch-ове (независимо какви), ще ги предсказва по един или друг начин. Какво се появява преди JMP може да окаже влияние на fusion-а, но това е независима оптимизация, която засяга друга част от процесорния front end.

Публикувано от: gat3way 14-04-2019, 21:36
Че ако адресът на който скача трябва да се зареди от паметта преди това, усеща ли се наистина? Ма нищо чудно в крайна сметка, що не.

Публикувано от: PxL 14-04-2019, 21:38
До автора: Учи си ги switch-овете, важни са си. Ние си спорим по други неща.

Публикувано от: AK-85 14-04-2019, 21:58
QUOTE (gat3way @ 14-04-2019, 20:36)
Че ако адресът на който скача трябва да се зареди от паметта преди това, усеща ли се наистина?

Затова има branch target buffer-и или подобни структури (примерно return stack buffer-и). Като се има предвид колко разпространени са формите на полиморфизъм в езиците за програмиране от високо ниво, мислиш ли, че процесорните дизайнери няма да измъдрят нещо, за да го ускорят?

Публикувано от: purjola 15-04-2019, 04:53
PHP понякога е равно на C като скорост, когато се ползва GOTO ... before goin' to hell

Публикувано от: Gluhiqdev 15-04-2019, 17:02
QUOTE (PxL @ 14-04-2019, 21:38)
До автора: Учи си ги switch-овете, важни са си. Ние си спорим по други неща.

Благодаря за съвета! От два дни чета и разучавам възможностите на switch(); отделно свалих 2 CMS-а за да разгледам начина по който го употребяват оператора.

Обръщам голямо внимание на всичко и смятам да се придържам към най-добрите практики защото целта ми е програмирането да ми стане професия.

Публикувано от: Gamma Goblin 15-04-2019, 18:12
CODE
защото целта ми е програмирането да ми стане професия.


Ако искаш да се занимаваш професионално с програмиране, бягай от ПХПто.

Публикувано от: Gluhiqdev 15-04-2019, 19:43
QUOTE (Gamma Goblin @ 15-04-2019, 18:12)
CODE
защото целта ми е програмирането да ми стане професия.


Ако искаш да се занимаваш професионално с програмиране, бягай от ПХПто.

Какво би ми препоръчал?

Публикувано от: purjola 15-04-2019, 20:18
Той би ти препоръчал да пишеш на Ръст, най-добрия език ...

user posted image

Публикувано от: Gamma Goblin 15-04-2019, 20:49
rust е за 4та поредна година най-обичания език според stack overflow бе https://www.reddit.com/r/programming/comments/bbc7fv/rust_is_the_most_loved_language_four_years_in_a/

Публикувано от: SuN 15-04-2019, 21:03
QUOTE (Gluhiqdev @ 15-04-2019, 19:43)
QUOTE (Gamma Goblin @ 15-04-2019, 18:12)
CODE
защото целта ми е програмирането да ми стане професия.


Ако искаш да се занимаваш професионално с програмиране, бягай от ПХПто.

Какво би ми препоръчал?

Не го слушай. Всъщност не взимай съвети от интернет. Отговорността си остава изцяло твоя. ПХП е добър избор.

П.П. Стак оверфлоу също така се бори да увеличи броя на програмистите гейове.

Публикувано от: Gluhiqdev 15-04-2019, 21:26
QUOTE (SuN @ 15-04-2019, 21:03)
Не го слушай. Всъщност не взимай съвети от интернет. Отговорността си остава изцяло твоя. ПХП е добър избор.

П.П. Стак оверфлоу също така се бори да увеличи броя на програмистите гейове.

Започнах с PHP защото много ме влече разработката на уеб сайтове отделно има голямо търсене за начинаещи PHP програмисти.

Но към този момент уча PHP, MySQL, AJAX като след като се науча да пиша свободно процедурен код ще започна да уча обектно ориентирано програмиране.


Публикувано от: purjola 16-04-2019, 13:11
QUOTE (Gamma Goblin @ 15-04-2019, 21:49)
rust е за 4та поредна година най-обичания език според stack overflow бе https://www.reddit.com/r/programming/comments/bbc7fv/rust_is_the_most_loved_language_four_years_in_a/

То и Гана ги обича неизмити ... бееее

Публикувано от: reason 16-04-2019, 13:18
QUOTE (Gamma Goblin @ 15-04-2019, 20:49)
rust е за 4та поредна година най-обичания език според stack overflow бе https://www.reddit.com/r/programming/comments/bbc7fv/rust_is_the_most_loved_language_four_years_in_a/

Rust е добро предложение за хора които НЕ искат да се занимават с уеб въпреки че и там може да се използва ама мисленето не трябва да ти е като за уеб дев. icon_lol.gif , иначе приятен език за писане и добра алтернатива на Це-тата

Публикувано от: ifnull 17-04-2019, 08:59
Който не разбира що е то полиморфизъм и има ли почва у нас бичи switch до побъркване.

Публикувано от: SuN 17-04-2019, 10:36
QUOTE (ifnull @ 17-04-2019, 08:59)
Който не разбира що е то полиморфизъм и има ли почва у нас бичи switch до побъркване.

Нали се сещаш, че полиморфизма е решение в дървените езици само? Другите нямат такъв проблем.

Публикувано от: ifnull 17-04-2019, 11:01
Не се сещам кой точно език визираш?

Публикувано от: Gamma Goblin 17-04-2019, 12:27
QUOTE (ifnull @ 17-04-2019, 08:59)
Който не разбира що е то полиморфизъм и има ли почва у нас бичи switch до побъркване.

Ами в ръст нямаш полиморфни енъми като в жавата и там ако сикаш различно поведение правиш match което е като switch.

Публикувано от: samominavam 17-04-2019, 12:41
суича го ползвам когато съм наясно какво мога да очаквам, освен това в него не може да се слагат други кондитион и става само ако очакваш нещо точчно и ясно.
примерно събитието може да е триене, упдате, селект - точно и ясно няма нужда от други кондитион.

Публикувано от: Gluhiqdev 17-04-2019, 14:52
QUOTE (samominavam @ 17-04-2019, 12:41)
суича го ползвам когато съм наясно какво мога да очаквам, освен това в него не може да се слагат други кондитион и става само ако очакваш нещо точчно и ясно.
примерно събитието може да е триене, упдате, селект - точно и ясно няма нужда от други кондитион.

Примерно ако искам да редактирам / изтрия / добавя потребител в базата с данни мога спокойно да използвам Switch(); или се бъркам ? Защото същата гимнастика мога да я реализирам и с IF

Публикувано от: thrawn 17-04-2019, 16:57
Баси глупавия въпрос, и ощ се дискутира...

Разликата между if и switch е в това, че при if критерия не е фиксиран, но за сметка на това обработва само един(два) възможни резултата. При switch критерия е фиксиран, но може да обработият много различни резултата. Друг плюс на switch е, че позволява директен преход в следващия блок.

Публикувано от: Gluhiqdev 17-04-2019, 17:06
QUOTE (thrawn @ 17-04-2019, 16:57)
Баси глупавия въпрос, и ощ се дискутира...

Разликата между if и switch е в това, че при if критерия не е фиксиран, но за сметка на това обработва само един(два) възможни резултата. При switch критерия е фиксиран, но може да обработият много различни резултата. Друг плюс на switch е, че позволява директен преход в следващия блок.

Темата се запълни с много полезна информация както за мен така и за други начинаещи които тепърва прохождат. Обръщам голямо внимание на добрите практики и правилно структуриран код за да не стават така наречените "спагети".

BGDev със сигурност ще се превърне в мое любимо място защото тук наистина има много опитни и приветливи хора които наистина се опитват да помогнат а не по "default" да се присмеят на по низшите от тях.

Благодаря Ви!

Публикувано от: thrawn 17-04-2019, 17:19
Спагети код не се получава от употребата на различни оператори а в следствие на лош дизайн. Всеки пише спагети код. Просто с времето се събира опит, който ти помага да си пишеш кода така, че да е лесен за поддръжка и разбиране. И винаги, след време виждаш неща в перфектния си код, които могат да се подобрят.

Предполагам разбра, че операторът if е само във формат if / else. Форматът if / else if /else реално представлява два вложени if -a. Та не може да сравняваш няколко вложени логически оператора с един (switch).

Та не мисли има ли смисъл да учиш всички оператори, щом ги има значи трябва да се знаят. Ако бяха излишни, нямаше да ги има (все пак, програмистите са много мързеливи хора).

Публикувано от: Gamma Goblin 17-04-2019, 19:32
QUOTE (thrawn @ 17-04-2019, 16:57)
Баси глупавия въпрос, и ощ се дискутира...

Разликата между if и switch е в това, че при if критерия не е фиксиран, но за сметка на това обработва само един(два) възможни резултата. При switch критерия е фиксиран, но може да обработият много различни резултата. Друг плюс на switch е, че позволява директен преход в следващия блок.

Разликата е в 2 ортогонални направления:

* до какъв машинен код се компилира (jump table, if/else with binary search in worst case)
* дев експириънс - примерно в ръста, ако match expression-a не покрива всички възможни комбинации имаш компилационна грека, което те предпазва от случайно въвеждане ан бъг в програмата.


Разбира се за ПХП всичко това няма смисъл icon_smile.gif

Публикувано от: SuN 17-04-2019, 21:54
Продължавате да пишете за неща, от които не разбирате. Ще влезе някой знаещ и ще ви завре обратно в джаварския форум. ПХП-то от 7-ма версия си се компилира. icon_smile.gif Изглежда само са го подготвили за JIT. "https://en.wikipedia.org/wiki/Php#PHP_7"

Публикувано от: PxL 17-04-2019, 23:21
QUOTE (Gluhiqdev @ 17-04-2019, 18:06)
BGDev със сигурност ще се превърне в мое любимо място защото тук наистина има много опитни и приветливи хора които наистина се опитват да помогнат а не по "default" да се присмеят на по низшите от тях.

Благодаря Ви!

Ако успееш да се абстрахираш от спама, истински програмисти тук все още се навъртат. И понякога дават мнение от опит, от което може да вземеш ползи.

Публикувано от: thrawn 18-04-2019, 06:25
Кое до какво се компилира няма особено значение. Компилатора се грижи да даде оптимален код от това което си написал. А ако толкова държиш в компилираната версия нещата да се случват по точно определен начин, просто пишеш конкретния фрагмент на асемблер (така или иначе, различните компилатори ще генерират различен код).

Публикувано от: Gamma Goblin 18-04-2019, 06:31
 При положение че съществуват само 2 компилатора, и че едни същи хора contribute-ват и в двата едва ли разликата ще е много голяма icon_smile.gif

QUOTE
Кое до какво се компилира няма особено значение.

Разбира се че има, даже за джавата има значение: https://github.com/brettwooldridge/HikariCP/wiki/Down-the-Rabbit-Hole

Публикувано от: thrawn 18-04-2019, 06:39
И какво е значението? Не в генериран код, в скорост и ефективност.
Микро оптимизациите едва ли дават нещо реално. Само правят кода адски нечетлив с обяснението, че тая мацаница ще се компилира до нещо конкретно.
Ми като искаш нещо конкретно, го напиши точно него.

Иначе, дори да приемем, че компилаторите са два, то версиите им са различни да не говорим за нивата на оптимизация.

Публикувано от: gat3way 18-04-2019, 09:04
Това не е вярно, в много случаи има много голямо значение как точно си пишеш кода, защото компилаторът не може да прави същите презюмпции които си ги прави програматора и освен ако не му се подскаже, няма да тръгне да оптимизира някои неща - примерно защото не е безопасно (а то е, но той няма как в compile-time да го знае това със сигурност). Поради същата причина съществуват и разни "подсказки", например https://en.wikipedia.org/wiki/Restrict без които човек може да си живее съвсем спокойно така или иначе.

Разбира се, говорим за частни случаи, които специално при веб бекенда практически не съществуват - там няма cpu-bound проблеми, всичкото е io-bound.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)