4 / 4 / 1
Регистрация: 09.08.2010
Сообщений: 125
|
|
1 | |
Почему участки кода со "switch-case" - это плохо и реплейсятся при рефакторинге?20.12.2014, 00:34. Показов 6730. Ответов 19
Метки нет (Все метки)
Попалась мне статейка одна на Хабре, где давались рекомендации по грамотному написанию кода. Одним из пунктов в ней был отказ от использования switch-case? Естественно автор поленился объяснить и оставил меня в недоумении. Чем плох switch-case? Почему при рефакторинге его рекомендуется менять? Почему даже решарпер switch-case рекомендует менять такую конструкцию на кучу аналогичных if'ов?
0
|
20.12.2014, 00:34 | |
Ответы с готовыми решениями:
19
Внутри участки кода. Прошу опытных сказать что это за вид языка Как переделать это в switch-case? не понимаю эту конструкцию совсем Структура кода (допускается ли частое использование if - else и switch - case) Почему switch case начал работать неправильно? Минимизации размера кода в типовой схеме с операторами switch / case |
2151 / 1288 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
|
|
20.12.2014, 01:14 | 2 |
0
|
4 / 4 / 1
Регистрация: 09.08.2010
Сообщений: 125
|
|
20.12.2014, 01:24 [ТС] | 3 |
Пожалуйста: http://habrahabr.ru/post/169139/
Уж не знаю, как он там в IL выглядит. Разбираться в нем - это душевный онанизм. Я знаю одно: switch на неком псевдокоде можно преобразовывать как в кучу IF'oв, так и в конструкцию с таблицей переходов. Кстати где-то когда-то слышал, что старые компиляторы switch преобразовывали в IF'ы, а современные заменяют на конструкцию с таблицей переходов, которая работает гораздо быстрее.
0
|
2151 / 1288 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
|
||||||||||||||||
20.12.2014, 01:36 | 5 | |||||||||||||||
SLiTHER, ан нет, оказывается в иле по разному выглядит. а ведь в я какой то книге читал обратное... мда доверяй но проверяй (это я про инфу которую получаешь из разных источников)
if Кликните здесь для просмотра всего текста
switch Кликните здесь для просмотра всего текста
метод свитч выглядит так
как видим свитч в ИЛе короче выглядит, и применяется команда switch, что за команда хз , возможно и есть та более оптимальная таблица переходов. эксперты подскажут Добавлено через 1 минуту а по поводу решарпера не правда, когда это он рекомендует менять свитч на ифы?
0
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
||||||
20.12.2014, 06:53 | 6 | |||||
Потому что так гораздо быстрее:
0
|
4 / 4 / 1
Регистрация: 09.08.2010
Сообщений: 125
|
|||||||||||
20.12.2014, 07:55 [ТС] | 7 | ||||||||||
Я предпочитаю тратить время в своей жизни по принципу "Овчинка должна стоить выделки". Мне проще потратить несколько минут, чтобы задать вопрос здесь и также быстро получить на него ответ, чем искать эту книгу, скачивать, читать нужную главу.
Она родимая и есть. У меня 9.0 стоит версия. Switch подчеркивает, слева иконку выводит и по Alt+Enter всегда предлагает заменить switch на if'ы. Не по теме: Да и вообще, ReSharper хоть и шикарная штука, но иногда все мое мировоззрение с ног на голову переворачивает. Вот меня, например, в универе учили, что если ты знаешь тип, то явно его и указывай, а ReSharper всегда предлагает явное указание типа на var менять. Учили, что всякие goto, break, continue - это ооооочень плохо и их не стоит использовать. А вот ReSharper конструкции с несколькими вложенными друг в друга if'ами всегда предлагает преобразовать в конструкцию с последовательно идущими if'ами и этими continue или break.
Добавлено через 3 минуты Как мы уже видели выше, компилятор switch преобразует в таблицу с переходами, которые так чисто на вид выполняются быстрее IF'а. Так вот и чем же тогда плох case?
0
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
|
20.12.2014, 08:23 | 8 |
А если таблица разрежена? ну не 1 2 3 а 1000 2000 3000? прийдется менять на ифы. если конечно у проца нет соответствующей инструкции. Но если даже и есть-то микропрограмма с ифами.
Добавлено через 16 минут Не по теме: Это в каком ликбезе этому учат если не секрет? На блок-схемах линии чертить сразу туда куда надо учат, а в коде соответствие этим линиям нельзя использовать? Может в ASMe JMP или вообще JMx - тоже не использовать? кстати часто не хватает break n; чтобы выйти сразу из нескольких циклов, приходится goto лепить.
0
|
2151 / 1288 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
|
|
20.12.2014, 12:22 | 9 |
зачастую он норм подсказывает, насчет вара кому как нравится, в фирмах у всех стоит решарпер и инспектор каокйто и по ним пишут, только каждый решарпер по своему настраивает.. но за ним нужно следить бывает посоветует такое что на голову не натянешь.
омг , кто вас так учил. как раз break и continue полезные команды, и без них часто нельзя выполнить задачу правильно... и это абсолютно правильно , зачем делать кучу вложенных ифоф? в общем решарпер это не панацея и не эталон правильного кода , а лишь инструмент, и вполне хороший инструмент
0
|
4 / 4 / 1
Регистрация: 09.08.2010
Сообщений: 125
|
|
21.12.2014, 00:57 [ТС] | 10 |
Такого быть не может. Будет у вас 10 кейсов, то десять записей в таблице с адресами перехода и будет.
Их величество преподаватели так говорили мне в свое время! Да и вообще, общеизвестный факт, что наличие в программе goto говорит о низком уровне программиста. Вариант с ассемблером опустим. Там j**, call - это единственный способ передачи управления. А по поводу break и continue. Опустим case - там они обязательная часть синтаксиса. Но во всех остальных случаях их использование мне всегда казалось необоснованным. Лично нас когда-то учили, что если вам нужно досрочно выйти из цикла например, то делать это надо по условию. Т.е. завести какой-нибудь флаг или переменную состояния и добавить ее в условие. Вот это точно
0
|
2151 / 1288 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
|
|
21.12.2014, 01:08 | 11 |
плохим привычкам вас преподаватели научили
ок есть условие выхода, а как выходить из цикла без break ? а continue помогает избежать большой вложенности блоков кода с ИФом например (как советовал правильно решарпер) или просто досрочно перейти к следующему итератору в общем без break и continue это как раз и есть
0
|
Master of Orion
|
|
21.12.2014, 01:18 | 12 |
Почему goto плох думаю объяснять не стоит. break и continue тоже надо применять аккуратно. Хотя конечно же заводить отдельную переменную для флага это маразм. И да, решарпер не панацея.
а по какому принципу вам должны отвечать? В книге все расписано, смысл пересказывать её словами, тратя время других людей?
0
|
4 / 4 / 1
Регистрация: 09.08.2010
Сообщений: 125
|
|
21.12.2014, 01:51 [ТС] | 13 |
Так устроен этот мир!
Одни делегируют, другие это исполняют (один из основных принципов тайм-менеджмента). А еще - выживает сильнейшая и наиболее приспособленная особь (закон эволюции).
0
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
|
21.12.2014, 04:03 | 15 |
А ваши преподаватели когда ухо чешут тоже голову вокруг головы обматывают? У нас в ликбезе преподы по поводу этих флагов так и говорили - можно ухо вот так чесать(обматывая руку вокруг головы) а можно break поставить ну или continue или goto или чего там по смыслу. Ну преобразует компилятор эти ваши флаги еще в дополнительные CMP и Jxx и что? только машкод усложнит так же как и сырец. почему тогда хорошо использовать for() do() while() там же тоже есть goto, только неявное. Может еще и if-else не использовать? Тоже неявное goto есть. а switch() - так целый рассадник неявных goto(); про return я вообще молчу - тот же goto только адрес из стека. и вызов подпрограммы тоже goto. Вопрос - что тогда остается? Планкалюль? Так там тоже циклы и ветвления были. И у Бэбиджа тоже. Машина Паскаля разве что.
Вы бы в блок-сехме эти дополнительные флаги нарисовали и помотрели бы что тот же препод скадет по этому поводу.
1
|
4 / 4 / 1
Регистрация: 09.08.2010
Сообщений: 125
|
|
21.12.2014, 04:49 [ТС] | 16 |
Ну и что плохого?
В жизни такой подход к людям мне помогает добиваться результата! На текущем этапе моей жизни результат - главное для меня. А чувствуют люди себя потом использованными или нет, мне по большому счету все равно! Вас никто не заставляет здесь отвечать и вы делаете это по собственной воле. Просто потому, что вам нравится помогать людям, или нравится умничать, или сам процесс ответов нравится, или пообщаться хотите, или, или, или... У каждого своя мотивация. А значит добровольно соглашаетесь на то, что кто-то использует ваши знания для решения своих целей. Что же вы тогда обижаетесь, если сами на это подписались? А вот к друзьям, близким и любимой женщине у меня иное отношение. Эти люди - важная часть моей жизни, поэтому их чувства я уважаю и их мнение всегда выслушаю. Да и вообще, лично я стараюсь окружать себя людьми, подобными мне. Людьми, которые четко знают что хотят от жизни. Людьми, которые умеют ставить цели и добиваться их. Людьми амбициозными, властными, тщеславными. Людьми, являющимися по натуре волками, а не овцам. Людьми, не боящимися брать на себя ответственность. Вот моей душе такие люди ближе! Именно за такими людьми народ пойдет куда угодно. Да собственно такие властные личности и управляют сейчас нашей страной. А с "рубаха-парнями" мне не по пути! Разделяете вы мое мнение или нет - это ваше право! Я вас не сужу за ваше мнение и вы меня не судите за мое! Добавлено через 15 минут Что вы до меня-то докопались? Я лишь рассказал то, за что нас когда-то ругали в универе. Но те времена давно прошли! Break, continue и return я как тогда использовал, так и сейчас использую. Вот попалась статейка на хабре, где говорят, что switch-case не айс - тоже проигнорирую и буду использовать дальше. Ну а goto как не использовал никогда, так и не буду! Лично мое мнение, что любой, я подчеркну, ЛЮБОЙ код, в котором замечен оператор goto, должен автоматически размещаться на говнокод.ру! Не существует ситуации, в которой без goto нельзя было бы обойтись! А по поводу переменных состояния и флагов вы не правы! В последнее время часто приходится что-то параллелить в проекте у нас. А если знакомы с многопоточным программированием, то знаете, что там на таких переменных и флагах все держится.
0
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
|
21.12.2014, 05:19 | 17 |
Ну между флагом завершения параллельного процесса, и ненужным флагом для выхода из цикла.
Да не докапывался я до вас. просто тоже рассказал что нам по поводу того же самого в ликбезе говорили. Прсосто удивительно, что эпедемия gotoфобии порожденная Виртом не просто расширяется, а и мутирует... уже на break и continue перекинулась как оказывается...
0
|
insite2012
|
21.12.2014, 05:19
#18
|
0
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
|
21.12.2014, 10:59 | 19 |
Кейсов то 10. Но если варианты выбора 1,2,3 к примеру - то выбор адреса из таблицы - эт запросто грубо говоря если к значению прибавить/отнять что нить чтобы получить валидный индекс в таблице адресов переходов. а если 1753,8693,14442 - т.е. ключи для выбора вообще никак не связанны с друг другом - то прийдется с каждым ключом сравнивать.
Добавлено через 16 минут PS:вспомните лабораторки по ASM и как и каким способом, вы там реализовывали case в каждом из случаев.
0
|
Master of Orion
|
|
21.12.2014, 12:25 | 20 |
такой подход фигово позволяет добиваться результата. Любое общение есть манипуляция в своих интересах, только вот она намного успешнее, когда человек об этом не знает. Рассмотрим два варианта сдачи зачета "халявному преподу". 1. "Ну, я конечно, не ходил, потому что немного проболел, мне очень жаль, можно мне все-таки как-то получить этот зачет?" 2. "Здравствуйте. Я не ходил на лекции, потому что мне сказали, что вы нахаляву ставите оценки, так что вот зачетка, ставьте и я пошел, я с друганами уже заказал билеты на 5 часов". посыл один и тот же, но угадайте, какой из них будет успешным. Или по-вашему другие люди идиоты и не делают ничего в своих целях? Этакое стадо альтруистов. Просто они используют принцип достаточности, когда нужно приложить 5% усилий для получения 95% результата, но человек даже их перекладывает на других, то таким людям трудно жить вне своей семьи, где их любят просто as is. Впрочем, это не форум психологической помощи. Так что я просто отписываюсь и всё.
2
|
21.12.2014, 12:25 | |
21.12.2014, 12:25 | |
Помогаю со студенческими работами здесь
20
Почему не может использоваться command в качестве case для switch? Почему указатели это плохо? Помощь в рефакторинге кода Подскажите, пожалуйста, почему в операторе switch-case подчёркивается красным razdelHCode... Switch-case: Не могу понять почему не весь код в методе возвращается Оптимальная конструкция switch-case-while / while-switch-case Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |