На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: ANDLL, ALXR
Страницы: (12) « Первая ... 6 7 [8] 9 10 ... Последняя » все  ( Перейти к последнему сообщению )  
> #define ИЛИ template? , C++
   
#define ИЛИ template
Гости не могут просматривать результаты голосования.
Гости не могут голосовать 
    Цитата KILLER @
    Хорошо, если там будет мега лютая логика - я заведу флаг выхода из цикла и вставлю проверку - если мы не выпрыгнули из вложенного цикла, значит будет выполнятся код за циклом, иначе клинап и выход.

    Это если у тебя один цикл. А если несколько мест, откуда ты выйти можешь? Десяток флагов для каждого из них вводить? :D

    Цитата KILLER @
    В случае с циклами - там есть блоки! Сейчас любая среда разработки позволяет без потери контеста прыгать по блокам, нажатием 1-2 кнопок, а с меткой не так. Тебе ее во первых нужно сначало найти глазами, если функция большая и запутанная - ты будешь ее искать поиском, если файл на 5 тысяч строк, и метка одна на функцию, но есть такая же в других функциях - ты по поиск тупо вылетишь за контекст функции.

    То есть для блоков ты не гнушаешься использовать воможности IDE, а для меток - ни-ни, только примитивный текстовый поиск? :D

    Цитата KILLER @
    А IDE даже не подсвечивают метку, я уж не говорю о том, чтоб по ним можно было перемещаться.

    Как минимум студия умеет и подсвечивать, и переходить к ним. Причём переход ровно такой же, как переход к функции - делается в отдельном окне. Что тебя не устраивает?

    Цитата KILLER @
    речь не о return'ах каких нибудь, потому что return'ом ты вылетишь в другую функцию, а с помощью меток ты можешь сделать сложный цикл.

    А что - сложный цикл на других конструкциях нельзя сделать по-твоему? :crazy: А если можно, то почему тогда плохо именно goto?

    Цитата KILLER @
    а полагаться на то, что все будут использовать goto только так чтоб все было понятно - глупо.

    А кто тут на это полагается? :D
      Цитата OpenGL @
      Это если у тебя один цикл. А если несколько мест, откуда ты выйти можешь? Десяток флагов для каждого из них вводить? :D

      Нетз, значит моя функция примет радикально иной вид, возможно она превратится в десяток других функций, возможно она превратится в класс, возможно что угодно. Я не могу тебе точно сказать что с ней будет, потому что мы сейчас гадаем.

      Цитата OpenGL @
      То есть для блоков ты не гнушаешься использовать воможности IDE, а для меток - ни-ни, только примитивный текстовый поиск? :D

      А что для меток есть? Я их не юзаю, по этому не вкурсе что для них есть в IDE?

      Цитата OpenGL @
      Как минимум студия умеет и подсвечивать, и переходить к ним. Причём переход ровно такой же, как переход к функции - делается в отдельном окне. Что тебя не устраивает?

      У меня студия почему то метки не подсвечивает. Стоят стандартные настройки. И как по ним перемещаться? Плюс ко всему - возьми примитивную IDE, notepad++ или mcedit, far-edit, там вообще нет перемещения даже по блокам. Но тем не менее когда ставишь курсор на открывающийся блок - закрывающийся тут же подсвечивается.

      Цитата OpenGL @
      А что - сложный цикл на других конструкциях нельзя сделать по-твоему? :crazy: А если можно, то почему тогда плохо именно goto?

      Можно. Я же объяснял почему плохо с goto. Потому что куда ты перейдешь - не всегда очевидно в случае с goto. В ряде случаев ты даже под отладчиком можешь запутаться с метками.

      Цитата OpenGL @
      А кто тут на это полагается? :D

      Ну вы ведь. :-?
        Цитата KILLER @
        В ряде случаев ты даже под отладчиком можешь запутаться с метками.

        Ассемблерные демоны уже взяли тебя на карандаш, готовься к пожизненной скороварке! :blink:
          Цитата OpenGL @
          Городить некий итератор, нужный только в одном месте и который менее читаемый, чем вариант втупую - глупость уровня Кили.

          Ну если так, то согласен.
          Но я бы не хотел видеть тот говнокод с goto в проде. В крайнем случае вариант Кили.
          А если это не "одноразовый" код, то я бы таки подумал :)
            Цитата JoeUser @
            Ассемблерные демоны уже взяли тебя на карандаш, готовься к пожизненной скороварке! :blink:

            мы сейчас говорим не об ассемблере. Там очень ограниченные средства разработки, нежели в ЯВУ, и там goto скорее правило, чем исключение из правил.
              Цитата KILLER @
              етз, значит моя функция примет радикально иной вид, возможно она превратится в десяток других функций, возможно она превратится в класс, возможно что угодно. Я не могу тебе точно сказать что с ней будет, потому что мы сейчас гадаем.

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

              Цитата KILLER @
              А что для меток есть? Я их не юзаю, по этому не вкурсе что для них есть в IDE?

              Как минимум - настройки цвета и переход к метке по аналогии с go to definition для методов.

              Цитата KILLER @
              Плюс ко всему - возьми примитивную IDE, notepad++ или mcedit, far-edit, там вообще нет перемещения даже по блокам. Но тем не менее когда ставишь курсор на открывающийся блок - закрывающийся тут же подсвечивается.

              Ага - блок у тебя обязательно помещается в экран, а вот метка по-любому находится так далеко, что ты её не найдёшь :lool: Двойные стандарты такие двойные.

              Цитата KILLER @
              Можно. Я же объяснял почему плохо с goto. Потому что куда ты перейдешь - не всегда очевидно в случае с goto. В ряде случаев ты даже под отладчиком можешь запутаться с метками.

              И? :rolleyes: Я могу if-ами добиться того же - теперь if-ы зло, или всё-таки это я такой негодяй, написавший такую неудобную программу? :D

              Цитата KILLER @
              Ну вы ведь.

              То есть по-твоему "goto иногда может быть к месту" означает "все должны использовать goto правильно"? :crazy:
                Цитата OpenGL @
                Не всегда возможно. Вот прямо сейчас у меня есть такая функция - три больших отдельных цикла, в них идёт построение сложных структур данных (используется несколько локальных переменных), везде нужны проверки, что всё хорошо, и если не всё - все построенные структуры надо удалить. В си в этой функции у меня бы было goto, выполняющее освобождение всех временных ресурсов - без него написать бы удобно всё это дело тупо не получилось.

                Ну приведи хоть псевдокодом. Чтоб понимать на примере. Иногда используют goto от того, что мало знают инструмент. Т.е. допустим ты бы юзнул goto, а ктото другой возможно другой механизм бы.

                Цитата OpenGL @
                Как минимум - настройки цвета и переход к метке по аналогии с go to definition для методов.

                В настройках лазить? А если у меня две метки? Куда меня go to definition отправит? И как вызвать этот go to definition, например в MSVS?

                Цитата OpenGL @
                Ага - блок у тебя обязательно помещается в экран, а вот метка по-любому находится так далеко, что ты её не найдёшь :lool: Двойные стандарты такие двойные.

                Если у меня блок помещается в экран - то там темболее не нужны goto, их обычно и юзают там, где не помещается в экран, чтоб еще подлить говнеца в итак портянку кода. :D

                Цитата OpenGL @
                И? :rolleyes: Я могу if-ами добиться того же - теперь if-ы зло, или всё-таки это я такой негодяй, написавший такую неудобную программу? :D

                Дело в том, что с if'ами ты можешь такое сделать или специально или если зеленый. А с goto практически всегда выходит непонятно.

                Цитата OpenGL @
                То есть по-твоему "goto иногда может быть к месту" означает "все должны использовать goto правильно"? :crazy:

                Я приводил исходники от MS, где goto абсолютно не к месту, более того там для отчистки ресурсов в языке есть встроенные средства - аля те же деструкторы, а вы мне говорили что это какой то мега шаблон и супер пупер клевый код, но никак не говно. Именно по этому мы и спорим 8-ую страницу.
                  KILLER, ну не ври, что читаешь, а.
                    Цитата Qraizer @
                    KILLER, ну не ври, что читаешь, а.

                    Читаю. :-? Вас же из стороны в сторону носит. Приводишь микрософтовский код на плюсах с goto - нормально. Потом пишите что в С++ есть деструкторы. Потом опять что нормально. Я в этом не виноват. Я там раньше про RAII писал зачем? Не затем ли, что вы мне говорили что для очистки ресурсов сойдет и goto?
                    Сообщение отредактировано: KILLER -
                      Цитата KILLER @
                      Ну приведи хоть псевдокодом.

                      На си это примерно так бы выглядело:
                      ExpandedWrap disabled
                        void rebuild()
                        {
                            // Инициализация новых структур данных в локальных переменных
                            ...
                         
                         
                            // Построение первых структур данных
                            for(...)
                            {
                                ...
                                if(...) goto cleanup;
                            }
                         
                            // Построение вторых структур данных
                            for(...)
                            {
                                ...
                                if(...) goto cleanup;
                            }
                         
                            // Окончательное построение и проверка
                            for(...)
                            {
                                ...
                                if(...) goto cleanup;
                            }
                         
                            // Если мы здесь, то уже всё хорошо - просто обмениваем указатели на текущие структуры и построенные.
                            ...
                        cleanup:
                            // Удаление всех локальных структур
                        }

                      Даже если ты заморочишься и вынесешь каждый этап построения в отдельную функцию, у тебя получится говно вроде такого:
                      ExpandedWrap disabled
                        if(build1(100500_local_variables_passed_by_pointers) &&
                           build2(100500_local_variables_passed_by_pointers) &&
                           build3(100500_local_variables_passed_by_pointers))
                        {
                           swap_pointers;
                        }
                        cleanup

                      либо, как вариант - делать кучу вложенных if-ов. Оба эти решения проиграют по всем параметрам решению в лоб с goto.


                      Цитата KILLER @
                      В настройках лазить? А если у меня две метки? Куда меня go to definition отправит? И как вызвать этот go to definition, например в MSVS?

                      Если у тебя две метки в пределах одной функции, то у них разные имена, иначе программа просто не скомпилится :D Какая клавиша у тебя - понятия не имею, смотри там же в настройках. Что за вопросы-то тупые? :D

                      Цитата KILLER @
                      Если у меня блок помещается в экран - то там темболее не нужны goto, их обычно и юзают там, где не помещается в экран, чтоб еще подлить говнеца в итак портянку кода.

                      Ога, а то, что тут был не один такой пример - ты, как обычно, не заметил :D

                      Цитата KILLER @
                      Дело в том, что с if'ами ты можешь такое сделать или специально или если зеленый. А с goto практически всегда выходит непонятно.

                      А что - для непонимания описанных тут примеров зелёным быть не надо что ли? :crazy:

                      Цитата KILLER @
                      Я приводил исходники от MS, где goto абсолютно не к месту, более того там для отчистки ресурсов в языке есть встроенные средства - аля те же деструкторы, а вы мне говорили что это какой то мега шаблон и супер пупер клевый код, но никак не говно. Именно по этому мы и спорим 8-ую страницу.

                      Видимо, недостаточно ясно :lool:
                      Цитата OpenGL @
                      Да, я от тебя на данный конкретный вопрос ответ получил, он меня впоне устроил и новых вопросов по этому поводу у меня нет. Можно считать вопрос о говнокоде в MS SDK закрытым, или я всё ещё недостаточно ясно выразился, что я с этим не спорю от слова совсем?
                        Цитата KILLER @
                        На сколько я помню - continue - дорогая операция в цикле, и ее нужно избегать.

                        Киля, извини, чисто ради интереса - приведи пруф на счет "дороговизны" оператора "continue".
                        Чуйка подсказывает подлог, обман и мошенничество :lol:
                          Цитата KILLER @
                          Вас же из стороны в сторону носит. Приводишь микрософтовский код на плюсах с goto - нормально. Потом пишите что в С++ есть деструкторы. Потом опять что нормально. Я в этом не виноват. Я там раньше про RAII писал зачем? Не затем ли, что вы мне говорили что для очистки ресурсов сойдет и goto?

                          Цитата OpenGL @
                          Видимо, недостаточно ясно
                          :yes:
                          Цитата Qraizer @
                          На предмет goto в библиотеках MS.
                          Исключения полноценно стали поддерживаться только в VC4.2, который увидел свет в 1998-ом, незадолго до VC6. До этого компилятор их понимал очень ограничено, а до версии 4.0 (вроде бы) не понимал вообще. Библиотека MFC увидела свет в ...1992-ом, ещё на 16-битном Microsoft Quick C for Windows. Соответственно потому в MFC есть собственные exception-макросы. ATL разрабатывалась попозже, но не сильно. Первые версии вошли в, если не ошибаюсь, тот же VC4.2. Соответственно использование там C++EH было, наверное возможным, но были, видать, причины не раскачивать лодку. Тем более, что совмещение SEH с C++EH в пределах одной программы всё-таки и сегодня иногда вызывает определённые сложности.
                          :wall:
                            Цитата OpenGL @
                            На си это примерно так бы выглядело:

                            Почему нельзя написать например как то так:
                            ExpandedWrap disabled
                              pointer1* Build1()
                              {
                                  // Построение первых структур данных
                                  for(...)
                                  {
                                      ...
                                      if(...) break
                                  }
                                  cleanup
                              }
                               
                              pointer2* Build2()
                              {
                                  // Построение вторых структур данных
                                  for(...)
                                  {
                                      ...
                                      if(...) break
                                  }
                                  cleanup
                              }
                               
                              pointer3* Build3()
                              {
                                  // Окончательное построение и проверка
                                  for(...)
                                  {
                                      ...
                                      if(...) break
                                  }
                                  cleanup
                              }
                               
                              void rebuild()
                              {
                                  // Инициализация новых структур данных в локальных переменных
                                  ...
                               
                                  pointer1 =  Build1();
                                  pointer2 =  Build1();
                                  pointer3 =  Build1();
                               
                                  // Если мы здесь, то уже всё хорошо - просто обмениваем указатели на текущие структуры и построенные.
                                  ...
                              cleanup:
                                  // Удаление всех локальных структур
                              }


                            Цитата OpenGL @
                            Если у тебя две метки в пределах одной функции, то у них разные имена, иначе программа просто не скомпилится :D Какая клавиша у тебя - понятия не имею, смотри там же в настройках. Что за вопросы-то тупые? :D

                            Вопросы тупые от того, что при написании метки - мне Intellisense не показывает даже ее имя. Если ты с goto не работаешь, интересно с чего ты взял что это есть в студии? Максимум что я вижу, это подсветка метки, когда ставишь курсор на goto. Ну и goto definition работает в одну сторону.

                            Цитата OpenGL @
                            Ога, а то, что тут был не один такой пример - ты, как обычно, не заметил :D

                            Дело в том, что с другими конструкциями языка либо не нужно куда то прыгать и смотреть, либо делать это не так сложно.

                            Цитата OpenGL @
                            А что - для непонимания описанных тут примеров зелёным быть не надо что ли? :crazy:

                            С goto можно быть хоть зеленым, хоть фиолетовым и всеравно выдать говнокод. С другими операторами языка это не так.

                            Цитата OpenGL @
                            Видимо, недостаточно ясно :lool:

                            Так вас же много, а я один. Я вас всех рассматриваю как одного собеседника. Поэтому пока все не признают что С++ код у МС с метками - говнокод, буду считать что вы все мне втираете одно и то же.
                              Скрытый текст
                              Цитата Qraizer @
                              Оператор "следования" - божественнен :lool:
                                Цитата KILLER @
                                Почему нельзя написать например как то так:

                                :lool:
                                Я ровно такой вариант написал чуть ниже, добавив необходимые проверки.


                                Цитата KILLER @
                                Если ты с goto не работаешь, интересно с чего ты взял что это есть в студии?

                                А проверить это же так тяжелоооо, просто ужас :D

                                Цитата KILLER @
                                Дело в том, что с другими конструкциями языка либо не нужно куда то прыгать и смотреть, либо делать это не так сложно.

                                Прыгать? :lool: Киля, в этой ветке дискуссии речь ведётся о функциях, влезающих в один экран, в которых прыгать никуда не надо априори, и которые с goto тоже бывают более читабельные. Ты специально только делаешь вид, что ведёшь себя глупо, или это результат настоящего и всамделишного полёта мысли? :crazy:

                                Цитата KILLER @
                                Так вас же много, а я один. Я вас всех рассматриваю как одного собеседника. Поэтому пока все не признают что С++ код у МС с метками - говнокод, буду считать что вы все мне втираете одно и то же.

                                О, надо же. Ты прямым текстом признался, что не читатель. Уважуха! 8-) Не каждый может признать за собой недостатки :yes:
                                Сообщение отредактировано: OpenGL -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0607 ]   [ 17 queries used ]   [ Generated: 25.04.24, 01:39 GMT ]