На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> break - плохой стиль программирования
    Привет

    сегодня читал одну книжку, так там написанно, что break это плохой вариант выхода из циклов?





      По Страуструпу - совершенно нормальный вариант. Вот goto - да, эт нехорошо.
        Чем goto не нравится. Делает jamp addr и всё, а бряк то только из текущего цикла выходит...
          Ну, не рекомендуют goto пользоваться практически все. Типа, приводит к каким-то трудноотлавливаемым проблемам и вообще плохой стиль программирования. А вообще - фиг его знает.
            Goto-наследие фортрана IV с васюком. В совремнных диалектах этих языков практически не используется, в С - тем более. Глюки были возможны в сегментированновых моделях памяти, для плоских моделей их быть не должно в приципе, по крайней мере внутри страницы 2Г. Насчёт плохого тона-не уверен, довольно часто один goto позволяет отказаться от кучи if-else....
              да не любят некоторые такого.
              по мне break впоолне нормальный:)) да и goto тоже. как иначе ты выйдешь из внутреннего цикла. так придется усложнять условия циклов и переменные лишние вводить..
              просто не надо эти злоупотреблять:))

              ЗЫ как они еще return в середине проги не обьявили плохим стилем...?:)
                Вот-вот.
                А плохой тон goto, потому что если их много накручено то программа нечитаемая становится. А так - иногда лучше действительно поюзать. Вон, на асме люди юзают же джампы - и ничего, не жалуются :) А прикинь заставить всех вместо джампов юзать только loop :)
                  2DemoS -
                  а может лучше
                  try {
                  trow ()

                  }
                  catch ()
                  {
                  }
                  Чем goto городить ? По  крайней мере в тех случаях, что ты имееш ввиду - преждевременный выход ?
                    конечно в некоторых случаях лучше.
                    но не всегда. это дя исключений.
                    а вот тебе простой пример:
                    надо найти в файле в четных строках символ "в" и заменить его на V, замену првоести до первоговхождения символа "Х"
                    два цикла
                    while(!feof(f))
                    {
                      //читаем строку
                      fread(buf,80,1,f);
                      fwrite(buf,80,1,fdest);
                      fread(buf,80,1,f);//читаем строку два раза чтобы пропустить нечетную.
                      for(i=0;i<80;i++)  
                      {
                         if(buf[i]=='в')buf[i]='v';
                         if(buf[i]='X') goto _end;
                      }
                    }
                    _end: //закрываем файлы.

                    тут эксепшины как то не очень хочется использовать, тк нет исключительных ситуаций, а без goto нужно было бы вводитье еще один флаг, чтобы внешний и внутренний цикл при выставлении этого флага в 0 переставал  работать. при этомнужно переделать внутренний в while. и когда нашли Х нужно выставлять этот флаг в 0.

                    что менее читаемо чем один goto.
                    согласен, пример притянут за уши и оптимизацией от goto можно уйти, но так получается не всегда  и реально встречаются задачи, где надо или плодить разный условие (особеннов в циклах) или один раз вставить goto.

                    ЗЫ это моя 251 мессага:))) крута:))) теперь уже буду сеньор:)
                      да жиру они все бесятся, я когда на васике писал, и на сях везде вставлял goto вместо while :)
                        Ну, ежели в самом микрософте не чураются goto, то уж нам-то тем более не зазорно заюзать  ;D
                        Это из МСДН-а:

                        ExpandedWrap disabled
                          case WM_MOUSEWHEEL:
                              /*
                               * Don't handle zoom and datazoom.
                               */
                              if (wParam & (MK_SHIFT | MK_CONTROL))
                              {
                                  goto PassToDefaultWindowProc; // :)
                              }
                        Сообщение отредактировано: negram -
                          goto - это не стильно. вот и всё.  ;)
                            Все эти измышления структурных программёров 70-80х годов - коффно!
                            Якобы нужна читабельность программ(murph). Итак все читается! Мгут быть некоторые неудобства при внесении корректировки в исходный текст проги, но не более. Если бы можно было обойтись без этих операторов, то их давно бы убрали из языков. Но этого не произошло за последние 30-20 лет. Значит, они реально необходимы. Поэтому не страдай. Стиль стилем, но и пидoры у нас, обычно, тоже стильные чуваки! ;D
                            То есть, тупо придерживаясь стиля можно, в конце концов, сотворить прогу в которой все будет через жoпy.
                              goto рулит!! ;D ;D
                              ExpandedWrap disabled
                                while(!feof(f))
                                {
                                   //читаем строку
                                   fread(buf,80,1,f);
                                   fwrite(buf,80,1,fdest);
                                   fread(buf,80,1,f);//читаем строку два раза чтобы пропустить нечетную.
                                   for(i=0;i<80;i++)  
                                   {
                                      if(buf[i]=='в')buf[i]='v';
                                      if(buf[i]='X') goto _end;
                                   }
                                }
                                _end: //закрываем файлы.

                              тут вообще можно без for и while обойтись;D
                              ExpandedWrap disabled
                                _while:
                                if(feof(f)) goto _end;
                                //читаем строку
                                fread(buf,80,1,f);
                                fwrite(buf,80,1,fdest);
                                fread(buf,80,1,f);//читаем строку два раза чтобы пропустить нечетную.
                                i=0;
                                _for:
                                if(i >= 80) goto _while;
                                if(buf[i]=='в')buf[i]='v';
                                if(buf[i++]='X') goto _end;
                                goto _for;
                                _end: //закрываем файлы.
                              ;D
                              Сообщение отредактировано: negram -
                                2m:
                                пример сишный, в нем почему бы и нет.
                                в плюсах с goto возникают проблемы, когда он обходит инициализацию автоматических переменных. об этом же и Старуструп говорит.
                                  Цитата Demo_S, 16.05.02, 16:57:05
                                  да не любят некоторые такого.
                                  по мне break впоолне нормальный:)) да и goto тоже. как иначе ты выйдешь из внутреннего цикла. так придется усложнять условия циклов и переменные лишние вводить..
                                  просто не надо эти злоупотреблять:))

                                  ЗЫ как они еще return в середине проги не обьявили плохим стилем...?:)



                                  Так вот получается return хреново по середине процедуры, я тут прогу на си правлю, так в одной функции мне память надо выделить в начале, а при завершении освободить, а тут return около восьми штук, ну и што мне прикажете делать? Возле каждного return free писать? Зараза, слов нету.
                                    Мое скромное мнение состоит в том, что goto, в принципе, приемлим в С, но в С++ - это не просто "не стильно", это отвратительно, если среди 40 строк кода, принадлежащего циклу вдруг стоит goto за пределы - это "ужас, летящий на крыльях ночи" для изменения кода. Скажем, я просматириваю чужой код, я вижу цикл, в условиях цикла описано то, что гарантирует выполнение цикла (например, i<max), я ничего не подозреваю, пропускаю цикл (поглядывая, а нет ли break-ов) и продолжаю рассматривать прогу, потом выясняется, что внутри цикла было два goto и один return, что получилось, что я каждый раз вынужден просматирвать КАЖДУЮ строчку кода на предмет всяческих засад со стороны ленивых программеров. Результат: несравнимо большие потери времени, чем на внедрение читабельных флагов. Писать goto (а за одно и несколько return'ов) можно в лабораторных работах, курсовиках и даже в дипломах, но за goto в промышленной разработкe софта - просто выгоняют с работы, пожалуй кроме RТ, и то - не известно. Если был потерян день на поиск бага из-за нечитабельности программы - это прямая вина программиста. Время на неоптимизированную разработку без goto и с дополнительными переменными + отладка сложных ситуаций всегда меньше, чем время на разработку проги-лапшы с goto + отладка сложных ситуаций, потому, что с появлением goto все ситуации становятся сложными. Хорошая прога - это не та прога, которая красиво и быстро работает, а та, в которую можно быстро и эффективно внести изменения не повлияв на красоту и быстродействие, имеется ввиду не кнопки и окошки, а изящество кода.
                                    2m: примерно в это же самое тебе прога и скомпилируется.
                                    2the_moon: я 200\% тебя поддерживаю. Лучше 20 вложенных if-ов (это хотя бы читается), чем 20 return'ов, перед которыми вдруг стало необходимым вписывать освобождение памяти, а если надо еще закрывать файлы/отправлять сообщения/опрашивать потоки/... Такие дикие внедрения одинакового кода рискуют стать больше, чем вся математика в функции.
                                    2Drunkard: есть ANSI стандарт, который трудно поправить, нарушив back-compatibility.
                                    Эк меня развезло  ;) Просто недавно потерял кучу времени, пытаясь отловить чужую ошибку в проге-лапше, через три часа плюнул, и еще за 25 минут переписал начисто.
                                    Сообщение отредактировано: bin -
                                      В догонку:
                                      break - отличный стиль программирования, если все break идут один за другим в одной область цикла, но еще одна переменная + continue - лучше, потому, что место, где прерывается цикл, становиться единственным.
                                      break - просто офигительный стиль программирования, если пользоваться оператором case  ;)

                                      Все вышесказанное является моим собственным мнением и не должно быть воспринято как наезд на других. У каждого свой опыт, свои стили разработки программ/проектов и свои отрасли применения написанного софта. На свой опыт и надо полагаться.
                                      Это - мой  ;)
                                      Сообщение отредактировано: bin -
                                        Ну пока я выкрутился макросом, типа FINALIZE_WORK_END_RETURN
                                          А мне так break очень даже нравится :) Я вот тут слышал что while заменяют if'ами. Предлагаю наоборот:) :) Немного смущает что брэйком нельзя из if выходить. Но мне-то он нравится, вот я и предлагаю в простых случаях следующий код:
                                          ExpandedWrap disabled
                                            if (a>5) {
                                             if (b>3) goto _SupperPupperLabel;
                                             c=x+a;
                                             ...
                                             if (c<8) goto _SupperPupperLabel;
                                             ...
                                            }
                                            _SupperPupperLabel:
                                            ...

                                          заменять на более элегантное:
                                          ExpandedWrap disabled
                                            while (a>5) {
                                             if (b>3) break;
                                             c=x+a;
                                             ...
                                             if (c<8) break;
                                             ...
                                             break;
                                            }

                                          Кстати, и goto не путает, и прграмма читабельнее, так ведь? ;)
                                          :) :):)
                                          Сообщение отредактировано: negram -
                                            Цитата bin, 24.05.02, 11:35:05
                                            большие потери времени, чем на внедрение читабельных флагов. Писать goto (а за одно и несколько return'ов) можно в лабораторных работах, курсовиках и даже в дипломах, но

                                            Ну, насчет goto - согласен, но вот несколько return'ов, имхо, ничего страшного. Зачастую это гораздо читабельнее, нежели куча вложенных if'ов...
                                              На мой взгляд, это пустой базар что лучше - goto или многочисленные goto-заменители!
                                              Я встречал и бессмысленное использование goto так же часто, как до смешного извращенческий выход из цикла.
                                              Думаю, это вопрос из серии : Win или Lin, Visual или Borland ...
                                              Каждый сам для себя решает такие вопросы, руководствуясь только личными предпочтениями.
                                                И еще (в догонку) - каждый волен сам решать, какую стратегию выбрать для разработки алгоритма и программы. Да, конечно - красивый код - это хорошо. Но еще лучше, когда он не только красивый, но еще и эффективный. И при выборе - 20 if'ов или один goto или break в ряде случаев лично я выберу goto. Только поставлю перед ним комментарий с развернутым обоснованием, что он здесь делает. А производительность, зачастую, приходится поднимать на порядки... Кстати, вермешели из if'ов и case'ов на несколько экранов тоже не очень-то воспринимаются.
                                                  А в

                                                  switch (...) {
                                                    case:
                                                    ...
                                                  }

                                                  вообще без break не обойтись. Или я не прав ? Не прервешь после нужного case, так начнет все, что в остальных case'ах, срабатывать. :) Так что брейк весчь очень нужная.

                                                  А гоуту я терпеть не могу, однажды разбирался в _своей же_ проге, написанной очень давно, так весь день матерился. Именно из-за них, родимых, и матерился. После того goto не юзаю... :)
                                                    2JoeUser:
                                                    я бы сказал, что тут читабельнее было бы:
                                                    if (cond1) exp2;
                                                    else if (cond2) exp2;
                                                    else if (cond3) exp3;
                                                    else exp4;

                                                    2reporter: в switch'ах без break не обойтись, ну разве что goto, но я никогда не пробывал  ;D


                                                      bin: Этак можно дойти до того, что все циклы исключительно через while писать - читабельность будет офигенная - в глазах не пестрит от обилия ключевых слов и т. д. и т. п. Ко всему надо подходить разумно - к читабельности кода тоже. Многострочный switch лично я никогда не замень на if хотябы по той простой причине, что переходы по switch оптимизируются компилятором. А читать их не менее удобно - каждый вариант отделен от другого.
                                                        2Flex_Ferrum:
                                                        А там не сверяется с константой, поэтому switch неприменим, привожу полностью:
                                                        Цитата

                                                        А мне так break очень даже нравится  Я вот тут слышал что while заменяют if'ами. Предлагаю наоборот  Немного смущает что брэйком нельзя из if выходить. Но мне-то он нравится, вот я и предлагаю в простых случаях следующий код:

                                                        if (a>5) {
                                                        if (b>3) goto _SupperPupperLabel;
                                                        c=x+a;
                                                        ...
                                                        if (c<8) goto _SupperPupperLabel;
                                                        ...
                                                        }
                                                        _SupperPupperLabel:
                                                        ...



                                                        заменять на более элегантное:

                                                        while (a>5) {
                                                        if (b>3) break;
                                                        c=x+a;
                                                        ...
                                                        if (c<8) break;
                                                        ...
                                                        break;
                                                        }



                                                        Кстати, и goto не путает, и прграмма читабельнее, так ведь?  


                                                        Просто "if() goto" мне кажеться хуже, чем "if() else if ". А в остальном согласен. ;)
                                                        Сообщение отредактировано: purpe -
                                                          Цитата bin, 26.05.02, 12:35:40
                                                          2JoeUser:
                                                          я бы сказал, что тут читабельнее было бы:
                                                          if (cond1) exp2;
                                                          else if (cond2) exp2;
                                                          else if (cond3) exp3;
                                                          else exp4;

                                                          2reporter: в switch'ах без break не обойтись, ну разве что goto, но я никогда не пробывал  ;D

                                                          Неправда Ваша! ;) Я ж спецом между if выражение всунул "c=x+a", дабы if-ы в цепочку нельзя было бы выстроить (не используя блоки конечно же). Так что while или goto?
                                                          :) :) :)

                                                            Ну, братцы, вы и наворочали! Некоторые, типа Drunkard, вообще покусились на структурное программирование, видимо опыта программирования маловато или всё больше по мелочи, да на однодневную прогу.
                                                            По существу. Против goto в своё время выступил Винер, отец структурного программирования, которое актуально и ныне. Структурное программирование было создано для математического доказательства правельной работы программного продукта. Было показано, что все программы можно создать испльзуя три конструкции, какие вы знаете. Любые другие конструкции усложняли понимание программ, приводили к различным типам ошибок, и делали невозможным строгий анализ программы. Goto был самым поганным, он превращал прогу в спагетти, попробуй отследи все переходы. В реальном программирование goto применяется и будет применяться. Есть эмперическое правило,- "применить goto, если он сокращает длину кода и переход происходит вниз не более, чем на 10 строк".
                                                            И ещё. Не путайте структурное программирование и стиль программирования. У них есть общие задачи - увеличение надёжности работы программы, но это разные вещи. Отступы (лесенка), венгерская нотация, комментарии - это стиль программирования, который не имеет отношения к структурному программированю.
                                                            "Стиль" - это слог, манера написания программы. Хороший стиль программирования отличает программиста от ламера. Для тех кто косит на Запад, сообщу, что программистов, кторые не используют комментарии в своих программах - увольняют.
                                                              А вообще какая разница?? Плохой-неплохой и черт с ним! Всегда удивляюсь: один скажет глупость (мол плохой стиль программирования) и все остальные (ламеры в основном) начинают повторять за ним. Своей точки зрения то нету... А если бы это было так плохо, то зачем их (goto, break) придумали??

                                                              Полностью согласен: на ASMе пишут (jmp, jnz, ...) и не жалуются.

                                                                Что за фигня!!! Теме год уже  >:(

                                                                2grandpa>> В этом разделе достаточно тем намного актуальней и свежей, на которые ты можешь ответить. Если знаний хватит!  8D

                                                                2Leprecon>> Сорри за полный оффтоп  :-/
                                                                  Плохой стиль - с первого раза программу без ошибок написать.

                                                                  А использовать break goto etc... в целях оптимизации
                                                                  Нет ничего плохого
                                                                    Разница между плохим и хорошим стилем огромная. Попробуйте прочитать этот текст выполненый в плохом стиле:

                                                                    Ес личто-тодел ается,этодолжноделатьсяоднообразно. Кстати,хорошийст иль программированияосно вываетсянаоднообразииме тодов,опи саний,спо соба кодированияит.д.Человек,которыйсна чалапишетClose WindowEx,потомclosewin dowex,а потомCloseWindowex,приэтомпо стоянноменя я ширинуотступов и т.п -неимеет хорошегости ля програ ммиро вания, пото мучтоне имеет сти ля вообще.

                                                                    И тот же текст в общепринятом стиле:

                                                                    Если что-то делается, это должно делаться однообразно. Кстати, хороший стиль программирования основывается на однообразии методов, описаний, способа кодирования и т.д. Человек, который сначала пишет CloseWindowEx, потом closewindowex, а потом CloseWindowex, при этом постоянно меняя ширину отступов и т.п - не имеет хорошего стиля программирования, потому что не имеет стиля вообще.

                                                                    Вот так и с программами.

                                                                      [quote author=AlexSm]Что за фигня!!! Теме год уже[/quote]То-то я думаю - почему я такой рьяной дискуссии не заметил в своем разделе.
                                                                      [quote author=AlexSm]2grandpa>> В этом разделе достаточно тем намного актуальней и свежей, на которые ты можешь ответить. Если знаний хватит! [/quote]Выношу grandpa предупреждение. Не только за то что поднял старую тему, но еще и за флейм.
                                                                      [quote author=AlexSm]2Leprecon>> Сорри за полный оффтоп  [/quote]Нестрашно - правильное мнение выразил.

                                                                      ГЫ. Drunkard, Не буду ставить тебе звездочку за "нехорошее слово" - теме то уже год ;D
                                                                      1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                                                      0 пользователей:


                                                                      Рейтинг@Mail.ru
                                                                      [ Script execution time: 0,0637 ]   [ 15 queries used ]   [ Generated: 9.07.25, 06:02 GMT ]