goto vs break & continue
    , Кроха-сын пришел к отцу и спросила кроха: "goto - это хорошо?"
  ![]()  | 
Наши проекты:
 Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту  | 
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS | 
| [216.73.216.5] | 
 
 | 
		
  | 
    Правила раздела:
  | Страницы: (32) « Первая ... 8 9 [10] 11 12 ... 31 32 ( Перейти к последнему сообщению ) | 
    goto vs break & continue
    , Кроха-сын пришел к отцу и спросила кроха: "goto - это хорошо?"
  | 
         
         
         
          
           Сообщ.
           #136
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата Славян @  Мешает то, что эти два цикла и так по сути оформлены в функцию. Плюс вагон переменных, кои засылать в функцию равносильно заново написать примерно такую же.  ![]() Значит стоит пересмотреть архитектуру проекта, и переписать правильно. У тебя функция ничего не принимает, судя по троеточиям - ты часть кода упустил, значит функцию можно разгрузить - вынеся эти циклы в отдельную функцию. Примерно такую же ты не напишешь, т.к. эта функция будет вызывать другу, а значет это будут уже две разные функции по смыслу. Добавлено Можно даже вынести вот этот участок кода в отдельную функцию: ![]() ![]()          if( ... ) terVer[2][5] *= ...;          // испытываем воздействие          if( count1[15] + (int)pow(terVer[3][4] + terVer[2][5], pokaz) > count1[2] ) // опасное положение!            if( superVertical[2]<3 ) // мат нам грядёт              goto LBL_matPrideHanaBude;//тут будет return какоето значение. Передавая в нее row и col, а уже внутри нее делать конкретные сравнения что там с чемто. Если у тебя очень много переменных в алгоритме используется, возможно стоит сгруппировать их в структуру или класс.  | 
    
| 
         
         
         
          
           Сообщ.
           #137
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата KILLER @  Ну так и получится костыль вида:значит функцию можно разгрузить - вынеся эти циклы в отдельную функцию. ![]() ![]() int SomeStrangeFunction(...) {    ...    return p; } ... Добавлено Цитата KILLER @  Ну так это ж тоже костыль: для одной функции городить особый класс.Если у тебя очень много переменных в алгоритме используется, возможно стоит сгруппировать их в структуру или класс. Цитата KILLER @  Ну так мы, фактически, и будем заниматься написанием такой же функции, из которой выносим. Короче, костыль на костыле. Передавая в нее row и col, а уже внутри нее делать конкретные сравнения что там с чемто.     | 
    
| 
         
         
         
          
           Сообщ.
           #138
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата Славян @  Ну так это ж тоже костыль: для одной функции городить особый класс.   Почему костыль? Кто тебе такое сказал?Цитата Славян @  Ну так и получится костыль вида: Почему это костыль? Цитата Славян @  Ну так мы, фактически, и будем заниматься написанием такой же функции, из которой выносим. Короче, костыль на костыле.  ![]() Так я же выше писал - проще все писать в функции main, по сути ты занимаешься написанием такой же функции, из которой выносишь, когда разбиваешь код на классы и функции. В итоге по твоей логике - классы/структуры/функции(кроме main) - по сути один большой костыль. Так ведь? Добавлено Цитата Славян @  Но замечание OpenGL'я мне показалось более полезным в возражении вам.  Это было не замечание. А всего лишь фантазия, призванная оправдать использование goto. Добавлено Ну это как знаешь пиндосы любят придумывать - "вот смотрите, у меня в руках пробирка с какой то херней, поэтому срочно нужно вводить войска в Ирак". Вот так и тут. Сам придумал проблему, сам привел ее в качестве аргумента. Неужто выход из двойного цикла такая редкая задача? Не думаю, очень часто встречается, и я , другие обходятся както без goto.  | 
    
| 
         
         
         
          
           Сообщ.
           #139
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата KILLER @  Потому что получается, что данные надо зачем-то группировать, а группу обзывать, а это лишние обозначения, замусоривающие код. То бишь - костыль. Почему костыль? Кто тебе такое сказал? Цитата KILLER @  Как и выше: лишняя функция, лишнее название.Цитата Славян @  Почему это костыль?Ну так и получится костыль вида: intSomeStrangeFunction(...) Цитата KILLER @  Ну я вот только что глянул исходники винды - и там вагоны goto. И ведь не сказать же, что примитивные программисты написали. Так что это не оправдание, а просто обращение внимания на самые разные случаи.  А всего лишь фантазия, призванная оправдать использование goto.  | 
    
| 
         
         
         
          
           Сообщ.
           #140
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата Славян @  Потому что получается, что данные надо зачем-то группировать, а группу обзывать, а это лишние обозначения, замусоривающие код. То бишь - костыль. Действительно. Выходит 99% пишут тупой говнокод используя классы и структуры, в том числе разработчики компиляторов. В общем все 3.14дарасы а ты один дартаньян. Я понял твою логику. Цитата Славян @  Как и выше: лишняя функция, лишнее название. Что значит лишняя функция? О чем ты? Цитата Славян @  Ну я вот только что глянул исходники винды - и там вагоны goto. О еще один. Смотри вон у вовы - 100 000 строк кода в функции main, значит в этом ничего плохого нет? Цитата Славян @   И ведь не сказать же, что примитивные программисты написали.  Это еще почему? Примитивные и пишут такой код. Возьми тот же MFC - быдло подела, быдлокодеров. Цитата Славян @  Так что это не оправдание, а просто обращение внимания на самые разные случаи.  Это оправдание своей лени, либо своего бессилия. Когда ты не можешь придумать ничего лучше, чем впихнуть goto, это прямо говорит о твоем бессилии выдать удобочитаемый качественный код.  | 
    
| 
         
         
         
          
           Сообщ.
           #141
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          Холивары какие-то идиотские идут... Вроде как активность какая-то, а никакого желания присоединиться не возникает.   
        
       | 
    
| 
         
         
         
          
           Сообщ.
           #142
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата KILLER @  Классы (да и функции) нужно делать так, чтобы их появление было естественным, а лучше - частым, дабы оправдывать их название и вынос за main. А вы пытаетесь всё в одну кучу городить. Зачем? Верно D_KEY заметил:Действительно. Выходит 99% пишут тупой говнокод используя классы и структуры, в том числе разработчики компиляторов. В общем все <цензура> а ты один дартаньян. Я понял твою логику. Цитата D_KEY @    Холивары какие-то идиотские идут...  | 
    
| 
         
         
         
          
           Сообщ.
           #143
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата Славян @  Классы (да и функции) нужно делать так, чтобы их появление было естественным, а лучше - частым, дабы оправдывать их название и вынос за main. Зачем что то выносить из main, если: Цитата Славян @  лишняя функция, лишнее название. Цитата Славян @  данные надо зачем-то группировать, а группу обзывать, а это лишние обозначения, замусоривающие код. То бишь - костыль. Цитата Славян @  для одной функции городить особый класс. Цитата Славян @  Ну так мы, фактически, и будем заниматься написанием такой же функции, из которой выносим. Короче, костыль на костыле.  ![]() ??? Цитата Славян @  Верно D_KEY заметил: Он тебя и имел ввиду. Ты еще не понял? Не я же тут чушь несу   Добавлено Славян, твои "аргументы" лишены всякого смысла. Добавлено Вот ежели бы ты код показал - вот смотри, вот goto тут рулит, а без него - будет полный оцтой и вообще без него тебе дороже будет, чем с ним. Тогда да. Но такого аргумента не будет по определению, темболее от тебя. Потому что goto - сам по себе является костылем.  | 
    
| 
         
         
         
          
           Сообщ.
           #144
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          Вот-вот. Прикол в том, что выйти-то можно и без goto, нагородив вагон дополнительных условий и булевых переменных, чем на каждой итерации нагревая бедный ARM на планшете и съедая ему батарейку, а вот попробуй войди без goto. Тоже можно, доказано, но я бы руки в узел автору завязал за такой структурный фанатизм.   
        
       | 
    
| 
         
         
         
          
           Сообщ.
           #145
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата Qraizer @  Вот-вот. Прикол в том, что выйти-то можно и без goto, нагородив вагон дополнительных условий и булевых переменных, чем на каждой итерации нагревая бедный ARM на планшете и съедая ему батарейку, а вот попробуй войди без goto. Тоже можно, доказано, но я бы руки в узел автору завязал за такой структурный фанатизм.  Так зачем входить во вложенный цикл минуя предыдущие? Добавлено Цитата Qraizer @  Прикол в том, что выйти-то можно и без goto, нагородив вагон дополнительных условий и булевых переменных, чем на каждой итерации нагревая бедный ARM на планшете и съедая ему батарейку Мда, как же сложно то все...     | 
    
| 
         
         
         
          
           Сообщ.
           #146
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата KILLER @  Мы выносим f(x), если её описание длинно, а пользоваться ею придётся не раз, скажем. Аналогично с классами (POINT и т.п.). А вот выносить из функции функцию лишь бы не было goto - однократное занятие, потому и искусственное, а значит - неправильное. Зачем что то выносить из main, ...     | 
    
| 
         
         
         
          
           Сообщ.
           #147
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата KILLER @  Это не религия, 2 вложеных цикла - еще терпимо и нормально, а три и более - запутывают читающего код, а если там еще и goto, то и вовсе сбивает с толку. Если тебе так нужно запилить три цикла вложеных с возможностью выхода из третьего, оформи их в отдельную функцию/метод и ливай по return из них. Какие проблемы? Я видел функции по 5 тысяч строк кода - это читать не возможно в принципе, там и по три вложеных цикла было и по четыре. Как по мне, лучше сделать несколько мелких функций, чтобы было понятно и прозрачно, чем шаманить трехэтажные циклы.  Это свойство ограниченности человеческого разума. Внимательно можно прочесть только половину страницы А4, если текст длиннее, такую служебную записку "не осознают". И это опять точка зрения рефакторинга, когда код имеет свою собственную ценность сам по себе. Это не всегда верно. Но в целом я согласен. Если блок кода {} виден на экране (стандартный текстовый режим в 25 строк), то рефакторится блестяще, два экрана - хорошо, три - нормально, четыре - терпимо, пять... Уже временные затраты на осознание того где именно и что нужно изменить перевешивают время на структурирование и переразбивку на функции. Но это опять же точка зрения рефакторинга. Цитата KILLER @  Вообще писать можно как угодно и что угодно. Ну вот возьмет чел, напишет свою прогу в 100 000 строк тупо в функции Main, и она будет работать. Что он неверно сделал? Да все он верно сделал. Какое вам дело до того как он пишет? Религия чтоль не позволяет 100 000 строк в функции main запилить? Вот так вот и выглядят ваши аргументы со стороны. А на деле, эта религия мне помогает избежать кучи ошибок, и когда я открываю свой код через год - то я сходу понимаю что там написано. В отличии, если бы там были трехэтажные циклы и метки - такой код открываешь через месяц и начинаешь репу чесать и заного изучать что же я там имел ввиду - делая такие нетривиальные телодвижения. Плюс ко всему, есть мнение, что чем больше у тебя будет осознанных слов в проге - тем легче она будет восприниматься и читаться. В случае с трехэтажными циклами - их меньше, и можно легко запутаться, никто не будет называть счетчик больше 5-6 букв, особенно если он часто используется в теле цикла. С функциями эта проблема решаема, т.к. мало кто называет функции в 1-2 буквы. И программа становится более читабельной. Это опять же точка зрения рефакторинга, то есть, повторного использования кода. Я писал проги в 200000 строк за 10 минут с использованием CASE технологий (двухкилобайтный скриптик на PL/SQL создавал многомегабайтный абсолютно безупречный и безошибочный python код, не требующий вообще никакого рефакторинга, поиска багов и тем более каких-либо собственных модификаций, в стиле GW-BASIC - сплошная функция main). Правда, по ходу выяснились ограничения python 2.7.x под Win7 - он не мог осилить такой файл.   Это было смешно. Пришлось нарезать кусками строк по 40000, тогда скушал.И тут совершенно непринципиально как называются переменные. Потому что вообще не требуется рефакторинг. Одноразовый код. Так что все условно. И в конкретном частном случае все может быть совсем по-другому...  | 
    
| 
         
         
         
          
           Сообщ.
           #148
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата Славян @  Мы выносим f(x), если её описание длинно, а пользоваться ею придётся не раз, скажем. Ну а если у тебя функция длинная предлинная, а выносишь ты то, что будет использованно ровно 1 раз, то и выносить незачем? Цитата Славян @  А вот выносить из функции функцию лишь бы не было goto - однократное занятие, потому и искусственное, а значит - неправильное.  ![]() Конечно не правильное, если ты будешь выносить из функции функцию лишь бы не было goto. Правильно не использовать goto, а выносить код в отдельную функцию для того - чтобы повысить читабельность кода. Я когда пишу, я не думаю как бы мне вот тут избавится от goto, поэтому по таким причинам код в отдельную функцию никогда и не выношу. А вот вынести код в отдельную функцию чтобы повысить читабельность - не проблема. Пусть даже эта функция в одном месте будет заюзана. Глядишь со временем и в другом месте пригодится. Добавлено Цитата p1qb0d @  Это опять же точка зрения рефакторинга, то есть, повторного использования кода. Я писал проги в 200000 строк за 10 минут с использованием CASE технологий (двухкилобайтный скриптик на PL/SQL создавал многомегабайтный абсолютно безупречный и безошибочный python код, не требующий вообще никакого рефакторинга, поиска багов и тем более каких-либо собственных модификаций, в стиле GW-BASIC - сплошная функция main). Правда, по ходу выяснились ограничения python 2.7.x под Win7 - он не мог осилить такой файл.    Это было смешно. Пришлось нарезать кусками строк по 40000, тогда скушал.Не ври, ты написал двухкилобайтный скриптик который что то там создавал, а не прогу в 200000 строк за 10 минут. Я тоже могу сказать что я писал 100500 строк кода за 30 секунд, тупо создал MFC проект - и у меня все сгенерилось. А чо? Не нужно путать мягкое с теплым.  | 
    
| 
         
         
         
          
           Сообщ.
           #149
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата KILLER @  Да, незачем. Ну а если у тебя функция длинная предлинная, а выносишь ты то, что будет использованно ровно 1 раз, то и выносить незачем?   Цитата KILLER @  Читабельность от разных непонятных функций не растёт, а наоборот - падает. Вот нет никакого смысла в той моей функции:Правильно не использовать goto, а выносить код в отдельную функцию для того - чтобы повысить читабельность кода. Цитата Славян @  А её пришлось городить, так как вы захотели от goto избавиться. ![]() ![]() int SomeStrangeFunction(...) {    ...    return p; }...   Цитата KILLER @  Ну значит мы с вами просто по-разному смотрим на код. Бывает! Пусть даже эта функция в одном месте будет заюзана. Глядишь со временем и в другом месте пригодится.     | 
    
| 
         
         
         
          
           Сообщ.
           #150
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата Славян @  Да, незачем.    И пусть у меня функция будет на 5 тысяч строк - верно все? Цитата Славян @  Читабельность от разных непонятных функций не растёт, а наоборот - падает. Если они используются? Если да, то кто тебе такое сказал? Цитата Славян @  от нет никакого смысла в той моей функции: Конкретно вот в этой - вообще никакого смысла нет. Какие то три точки и возвращается непонятная переменная   Цитата Славян @  Ну значит мы с вами просто по-разному смотрим на код. Бывает!  ![]() А вы когда нибудь в своей жизни рефакторили большой код? Ну скажем там проект состоящий из 100 исходных файлов, хотя бы!!! Даже пусть будет не 100, а хотя бы 20цаточка?  |