![]() |
|
|
![]()
|
|
||
|
|
| foRaver |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 561 Регистрация: 6.7.2003 Где: Düsseldorf Репутация: нет Всего: 3 |
Я тут вступил как-то в жуткий спор по этой теме и услышал в ответ какой-то бред!
Очень хочеться услышать ваше мнение по этой теме тоже. |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: нет Всего: 232 |
Это, по ходу, к какому языку программирования относится ?
Если к C/C++, то я согласен, что goto - сакс. -------------------- ![]() |
|||
|
||||
| foRaver |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 561 Регистрация: 6.7.2003 Где: Düsseldorf Репутация: нет Всего: 3 |
Ко всем абсолютно.
Mozhet в некоторые он кое-как вписывается, а после написания 1000 строк кода, уже через неделю изза этого goto невозможно будет нормально разобраться, что и как... |
|||
|
||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 4 Всего: 317 |
Все же красивые обороты получаются с goto. Бывает код компактней выходит. А в целом это рассматривается так: мне нравится иногда использовать goto когда это не нарушает логику программы, но мне не нравится читать запутанный код других
-------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| Chingachguk |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 18 |
Лучше goto может быть только условный goto ;)
Эта тема активно обсуждалась в свое время в разделе "c++". -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 2 Всего: 39 |
Последний раз использовал этот оператор в паскале на олимпиаде для отладки, забыл его убрать и в итоге проиграл
В Perl и PHP не пользовался и даже не знаю есть ли они. |
|||
|
||||
| Chingachguk |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 18 |
Это мне напомнило случай, произошедший со мной в 1-м классе ;) Был "день бегуна". Я прибежал третьим. Стоим, болтаем, ждем призов. Объявляют: победил такой-то чувак, которого даже близко к нам не было на финише. Мы с вопросом к взрослым дядькам: почему, мы же первые ?!!! Ответ был такой: у него была самая лучшая техника ;))) -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
| December |
|
|||
![]() Antitheorist ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4423 Регистрация: 14.8.2002 Где: Харьков Репутация: нет Всего: 57 |
В асме без jmp не обойтись, а в остальных языках (кроме, говорят, фортрана) - НЕФИГ! Надо искать обходные пути!
|
|||
|
||||
| shedon |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1209 Регистрация: 17.1.2003 Где: Нижнiй Новгородъ Репутация: нет Всего: 11 |
На счёт goto в Си++, я слышал такое высказывание:
За дословность цитаты не ручаюсь!!!
Согласен. Мне даже рассказывали случай, когда у чела не приняли прогу(на Си++), пока он от туда не выкенет все goto. -------------------- Programming is like sex: One mistake and you have to support it your lifetime |
||||
|
|||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: нет Всего: 112 |
Вот уже не вспомню когда я в последний раз использовал goto, зато помню, что когда начинал прогать на Паскале без goto жить не мог... Сейчас goto мне кажется лишним оператором...
-------------------- С уважением, г-н Посол. |
|||
|
||||
| Ars |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 28.8.2003 Где: Московская обл. Репутация: нет Всего: 2 |
Даже и не знаю, как им пользоваться в С
-------------------- Есть многое на свете, друг Горацио, С чем очень долго можно прое..! |
|||
|
||||
| shedon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1209 Регистрация: 17.1.2003 Где: Нижнiй Новгородъ Репутация: нет Всего: 11 |
Точно также как и везде. -------------------- Programming is like sex: One mistake and you have to support it your lifetime |
|||
|
||||
| December |
|
|||
![]() Antitheorist ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4423 Регистрация: 14.8.2002 Где: Харьков Репутация: нет Всего: 57 |
|
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: нет Всего: 232 |
У оператора goto в С++ есть один "маленький" недостаток - нельзя делать переход "мимо" инициализации переменной, и какие-то чудные вещи получаются при выходе в/за блоки for/while.
-------------------- ![]() |
|||
|
||||
| shedon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1209 Регистрация: 17.1.2003 Где: Нижнiй Новгородъ Репутация: нет Всего: 11 |
Ни когда не использовал оператор goto в с++, по этому таких проблемм не знаю. -------------------- Programming is like sex: One mistake and you have to support it your lifetime |
|||
|
||||
| Chingachguk |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 18 |
Ага. Тогда вот что я скажу. Пусть есть такая реализация:
Но гораздо элегантнее написать так:
Это сообщение отредактировал(а) Chingachguk - 16.1.2004, 10:14 -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
||||
|
|||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 2 Всего: 39 |
Chingachguk А если таких goto стоит куча и они посылают не только за пределы цикла,... Как такое читать?
|
|||
|
||||
| shedon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1209 Регистрация: 17.1.2003 Где: Нижнiй Новгородъ Репутация: нет Всего: 11 |
Я всегда делаю по первому примеру. -------------------- Programming is like sex: One mistake and you have to support it your lifetime |
|||
|
||||
| Deface |
|
|||
|
def ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2041 Регистрация: 22.11.2002 Где: г. Дубна, МО Репутация: нет Всего: 21 |
Не, если ГОТО много, то в программе разобраться нереально!
-------------------- Когда я умер, не было никого, кто бы это опроверг (с) |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: нет Всего: 232 |
Chingachguk, плагиатор !!!
-------------------- ![]() |
|||
|
||||
| oleg1973 |
|
|||
![]() asm fanat ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: нет Всего: 34 |
да ладно нормальный оператор
-------------------- SST 465555 icq 200-512-712 |
|||
|
||||
| Chingachguk |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 18 |
и
Ну так способов испортить код существует много ... Например, часто нажимая на insert+past... Фишка в том, что надо делать как лучше а не так, как учат профессора ;) -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
||||
|
|||||
| December |
|
|||
![]() Antitheorist ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4423 Регистрация: 14.8.2002 Где: Харьков Репутация: нет Всего: 57 |
Всё равно наличие Goto говорит о непродумманости алгоритма. Пусть я напишу больше букв в коде, но через месяц я пойму, что имел в виду, просматривая этот кусок. С гоуту буду разбираться на порядок дольше.
|
|||
|
||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
December, согласен. В школе долго не понимал чем плохо использование goto. В какой-то книге по GWBASIC прочитал: "уровень профессионализма программиста уменьшается с каждым использованием в програме оператора goto", и там же теорему о том, что "любой алгоритм, в котором применяется оператор безусловного перехода можно переписать не используя данный оператор". Стало обидно, попробовал - интересно, но вроде ничего особенного. Потом еще несколько раз "заставил" себя не пользоваться GOTO и понял что это действительно так - без goto алгоритм выходит намного лучше, а последующие модификации проги выполняются почти безболезненно. Все равно как ООП и линейное программирование - в больших проектах для внесения изменений приходиться "разрушать и перепланировать" часть кода.
P.S. Бейсиком к тому моменту уже давно не пользовалься. |
|||
|
||||
| Dov |
|
|||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: нет Всего: 88 |
Имхо, это извращение. Запивать бутылку пива ящиком водки.
Я бы сделал так:
-------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
|||
|
||||
| Chingachguk |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 18 |
По поводу непродуманности и сопровождаемости.
Никто не грит, что нужно писать первое, что приходит в голову. Если посвятил достаточное количество усилий по разработке наилучшего варианта и в нем есть goto - оставть его. Если можешь написать лучше без него - кто же спорит. Сопровождение. Вроде как все согласны, что маленькие проекты ведешь один и тебе так удобнее и т.п., то можно. Если большие - то нельзя. 1. В больших проектах есть несколько уровней. Есть системные библиотеки, к примеру. Ее лучше написать один раз и навсегда верно. Если ее переделывают каждый день, то это скорее не системная библиотека, а ошибка проектирования. 2. Опять-таки к вопросу о качестве кода. Удачное проектирование подразумевает, что каждый пишет свой модуль и потом все сопрягают свои усилия. Если модуль правило N человек, где N>10, то, скорее всего, в фирме какая-то фигня с текучкой кадров. 3. Понятие "читабельный код". Нет никаких четких правил по его написанию. Мне, к примеру, неудобно читать вложенные циклы, условия в них, опять циклы в условях и т.д. с многочисленными отступами. В результате тело самого внутреннего цикла начинается где-то с 50-ой позиции или еще далее. Отлично ! Никому не интересные проверки лежат рядом, а вот то, что интересно для анализа, нифига не видно. Но формально все правильно написано. 4. Из пункта 3 следует и 4: есть неудобство чтения goto, а вот мне намного неудобнее читать неоптимальный код. Если программер писал "лишь бы работало", то просматривать кучи чужих кодов вообще мрак. Обычно я такое удаляю и делаю заново. Но это гемор. Гораздо больший, нежели раз матернуться на чужой goto и ... все понять с первого раза. 5. Из пункта 4 следует и 5: реальность. Мы про что говорим ? Про реальные проекты или про "идеальные" ? Если про реальные, то везде, где я работал, я в той или иной мере видел все "достоинства", которые я перечислил в п.п. 3 и 4. Это неизбежный недостаток коммерческого программирования, когда надо "быстрее, а там видно будет". В той или иной степени такие вещи писали разные программеры и среди них были и неплохие. Но... никогда в реальной коммерции не будет отлажен код на таком уровне, что самым большим недостатком будет наличие goto в коде. Ну а идеальные проекты пишутся на ... ассемблере ;) Потому, что иделаьные проекты не требуют переносимости - в идеальном проекте и машины одинаковые и архитектура - лучшие и не нужен си. Потому, что самый быстрый код и самый короткий код можно написать только на нем. Пример идеального проекта вы видели... в фильме "Терминатор" (1 часть). Код терминатора был написан на ассемблере ;) Ну а в ассемблере как бы нормально писать goto, просто там он именно в том виде, которым должен быть, а не в том, что реализован в языках HLL - условном. Респект, Dov ! Ты единственный, кто попробовал улучшить мой пример без goto.
Вообще-то обычно бывает именно так ;) Сначала "только по одной пива". Потом водки. Ну а потом нужно "залакировать"
Неплохо, неплохо. Не буду придираться. Но это пока не лучше моего варианта - по крайней мере, по скорости работы кода ;) Это сообщение отредактировал(а) Chingachguk - 17.1.2004, 21:06 -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
||||
|
|||||
| shedon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1209 Регистрация: 17.1.2003 Где: Нижнiй Новгородъ Репутация: нет Всего: 11 |
Я сейчас посмотрел, оказывается библиотека MFC во всю пользуется операторам goto.
Похоже её писали ламеры. -------------------- Programming is like sex: One mistake and you have to support it your lifetime |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: нет Всего: 232 |
У них там в основном везде одна метка (в конце функции), на которую идёт переход из разных точек функции -- типа такой глобальный Cleanup в конце функции, без которого не обойтись, и который если не выполнить (скажем, сделать "return FALSE" вместо "goto Cleanup") - выйдет некорректное действие. Например, когда выполняется очень сложная инициализация очень сложной структуры, с кучей сложных проверок и циклов - то любая ошибка при инициализации оставит кусок (ресурсы WinAPI, открытый файл, выделенную память и пр.), который нужно корректно вернуть системе. Имхо, всё это можно было бы реализовать и без goto, грамотно разделив каждый такой сложный процесс на подуровни (скажем, в виде отдельных функций). Но. Нигде в MFC и речи нету о повсеместных "прыжках взад-вперёд-налево"! То есть, M$ взращивает идею "мы против goto, но если без goto никак уже не обойтись (или сроки жмут) - тогда Ok, давайте вставим один-два оператора, но не более того". -------------------- ![]() |
|||
|
||||
| oleg1973 |
|
|||
![]() asm fanat ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: нет Всего: 34 |
а ктонить сравнивал генерируемый код с гото и без а? поверьте господа есть разница
-------------------- SST 465555 icq 200-512-712 |
|||
|
||||
| Dov |
|
||||||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: нет Всего: 88 |
Chingachguk, ты не поверишь, но я предполагал, что рано или поздно встанет вопрос о скорости работы кода, хотя я, написав свой вариант, хотел показать, только, небольшую разницу в читабельности кода, так сказать, внешнее восприятие и не более того. Просто, я (уж не знаю, почему) не люблю не только goto, но и break'и с continue'ями и, по мере возможности, стараюсь их обходить, не очень-то задумываясь об этой самой скорости. Но, раз уж пошла такая тема, мне хотелось бы кое-что уточнить для себя. Давай возьмём твой код и мой код и посмотрим, что же у нас, на самом деле, происходит. Предположим, что CanIAnswerMyNameGood() изначально, т.е. до входа в первый цикл for равна FALSE. Вот твой код:
Что же произойдёт дальше? Давай посмотрим(пока мы при памяти). 1. Проверяем, есть ли ещё у нас пиво - Pivo > 0. // ЕСТЬ 2. Пьём бутылочку - DrinkOnePivo(true). // хотя не должны этого делать, так как уже - FALSE 3. Проверяем, есть ли ещё у нас водка - Vodka > 0. // ЕСТЬ 4. Пьём бутылочку - DrinkOneVodka(true). // хотя не должны этого делать, так как уже - FALSE 5. Проверяем, а не FALSE ли у нас - if ( !CanIAnswerMyNameGood() ). // FALSE 6. И, только сейчас, выходим из цикла - goto IsEnough. Вот мой код:
Посмотрим, что же здесь. 1. Проверяем - CanIAnswerMyNameGood() == TRUE ??? // нет, водку уже не проверяем, в цикл даже не заходим Вопрос: почему ты считаешь, что твой код быстрее? Даже при условии, что он будет работать корректно. -------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
||||||
|
|||||||
| Chingachguk |
|
||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 18 |
По поводу корректности.
Изначально я имел в виду именно то, что проверку можно (или имеет смысл) выполнять после выполнения каких-то действий внутри второго цикла. Скажем, я бы мог уточнить свой пример таким образом:
В самом деле, какой смысл проверять, можешь ли ы шевелить языком, если не выпил хотя бы буылочку пивка ? ;) По поводу бысродействия. В самом деле, если при первых же итерациях цикл должен прекратиться, то твой вариант работает быстрее. Но ! Как правило, цикл в среднем выполняется хотя бы до половины (внешний) - в реальной работе. Если же ситуация такова, что в большинстве случаев он завершается очень быстро - нужно писать алгоритм, учитывающий это:
Возможно, ты можешь сказать, что время проверки во внешнем цикле несущественно (всего 1:20 проверок). Однако я могу привести и такой пример:
Однако я не думаю, что стоит на этом заострять внимание - ведь, как я написал выше, я имел в виду то, что я бы хотел рассматривать тот случай, когда проверки можно выполнять только внутри внутреннего цикла. -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
||||||
|
|||||||
| M@xim |
|
|||
|
Unregistered |
Мой аккадемик препод настоятельно рекомендовал не пользоваться этой ошибкой природы.
Побочный эффект may be , а если длина кода уж действительно 1..... строк то закольцованность. А для консольных прог это реалити. Это факт. |
|||
|
||||
| GRON |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 21.11.2003 Репутация: нет Всего: нет |
Считаю, что программер, часто использующий goto делает это от того, что не в состоянии подумать немного и родить нормальночитаемый и безглючный код без него. У меня раньше тоже был огромный соблазн сделать это, тогда я не всавлял goto потому что хотел потренировать мозги и обойтись без легкого способа (бесплатный сыр сами знаете где бывает), теперь понимаю, что это еще и вредно.
|
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Продвижение и оптимизация сайтов | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |